Python实战:用jieba和nltk玩转Bigram中文分词(附完整代码)

# Python实战:用jieba和nltk玩转Bigram中文分词(附完整代码) 如果你正在处理中文文本,无论是做情感分析、构建聊天机器人,还是训练一个语言模型,分词都是绕不开的第一步。但中文不像英文有天然的空格分隔,一个句子就是一串连续的字符,如何准确地将其切割成有意义的词语,直接决定了后续任务的效果。传统的基于词典的分词方法在面对新词、网络用语或专业术语时常常力不从心,而基于统计的N-gram模型,特别是Bigram(二元模型),为我们提供了一种更灵活、更“智能”的视角。 Bigram的核心思想很简单:它认为文本中相邻的两个词(或字)之间存在某种“粘性”。通过统计海量语料中所有可能的二字组合出现的频率,模型就能学习到哪些组合更可能构成一个词或一个稳定的短语。比如,“自然”和“语言”经常一起出现,那么“自然语言”作为一个整体被识别出来的概率就很高。这种方法不依赖一个固定的词典,而是让数据自己说话,因此对新词和特定领域的术语有更好的适应性。 今天,我们就抛开复杂的理论推导,直接上手实战。我将带你用Python中两个强大的库——`jieba`和`nltk`,从零开始构建一个完整的中文Bigram分词流程。我们会从最基础的文本预处理开始,一步步实现Bigram的提取、特征工程,并最终将其应用到情感分析和文本分类的实例中。整个过程不仅有清晰的代码示例,还会穿插我实际项目中踩过的坑和总结的技巧,希望能帮你把Bigram从概念真正变成工具箱里趁手的武器。 ## 1. 环境准备与核心库解析 在开始写代码之前,确保你的Python环境已经就绪。我推荐使用Python 3.8或以上版本,以获得更好的库兼容性和性能。我们将主要依赖两个库:`jieba`用于基础的中文分词,`nltk`则提供了丰富的自然语言处理工具,包括我们需要的N-gram功能。 首先,通过pip安装必要的库: ```bash pip install jieba nltk scikit-learn pandas ``` 安装完成后,我们还需要下载`nltk`的一些数据包。打开Python解释器或创建一个脚本,执行以下代码: ```python import nltk nltk.download('punkt') # 用于分词的数据包 nltk.download('averaged_perceptron_tagger') # 可选,用于词性标注 ``` 现在,让我们快速了解一下这两个库在本次任务中的角色。 **jieba**:这是一个“工业级”的中文分词工具,速度快,精度高,并且支持多种分词模式(精确模式、全模式、搜索引擎模式)。在我们的流程中,`jieba`扮演着“初切”的角色。虽然我们的目标是基于Bigram进行更灵活的分词或特征提取,但`jieba`的精确模式可以为我们提供一个高质量的基线分词结果,作为Bigram分析的输入。它内置的词典能很好地处理常见词汇,减少后续统计模型的负担。 **nltk (Natural Language Toolkit)**:这是自然语言处理领域的瑞士军刀。我们主要使用它的`ngrams`函数来轻松生成Bigram序列。例如,给定一个分词后的词列表`['我', '爱', '自然语言处理']`,`nltk`可以一键生成`[('我', '爱'), ('爱', '自然语言处理')]`。除此之外,`nltk`还提供了丰富的语料库、词干提取、词性标注等功能,虽然本文不深入涉及,但知道它的潜力对后续扩展很有帮助。 一个常见的误解是,`jieba`和基于统计的Bigram方法是互斥的。实际上,它们可以很好地协同工作。`jieba`的词典和规则保证了基本分词的准确性,而Bigram模型则可以在`jieba`的结果之上,进一步捕捉更细微的搭配关系和上下文信息,或者用于处理`jieba`词典未覆盖的新词。这种“规则+统计”的组合策略,在实践中往往能取得最佳效果。 ## 2. 从文本到Bigram:完整的数据处理流水线 有了工具,我们开始构建数据处理流水线。我们的目标是将一段原始的中文文本,转换成一个Bigram特征列表或矩阵,供机器学习模型使用。这个过程可以分为三个核心步骤:文本预处理、基础分词和Bigram生成。 ### 2.1 文本清洗与预处理 原始文本通常包含很多“噪音”,比如HTML标签、特殊符号、多余的空格和换行符。这些噪音会影响分词质量和后续的统计。因此,第一步是清洗。 ```python import re import jieba def clean_text(text): """ 清洗中文文本。 1. 移除HTML标签。 2. 移除URL链接。 3. 移除邮箱地址。 4. 移除多余的空格、制表符和换行符,只保留一个空格。 5. 移除所有非中文字符、数字和常见中文标点(可选,根据任务决定)。 """ # 移除HTML标签 text = re.sub(r'<[^>]+>', '', text) # 移除URL text = re.sub(r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', '', text) # 移除邮箱 text = re.sub(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b', '', text) # 将多个空白字符(空格、换行、制表符)替换为单个空格 text = re.sub(r'\s+', ' ', text).strip() # 可选:移除所有非中文、数字、常见中文标点和基本英文标点(用于保留中英文混合文本中的英文) # 如果只想保留纯中文,可以使用更严格的正则表达式 # text = re.sub(r'[^\u4e00-\u9fa5,。!?;:“”‘’、\d\s]', '', text) return text # 示例 raw_text = "这是一个示例文本,包含http://example.com链接和<strong>HTML标签</strong>。 还有多余的空格。" cleaned_text = clean_text(raw_text) print(f"清洗前: {raw_text}") print(f"清洗后: {cleaned_text}") ``` > **注意**:关于是否移除所有非中文字符,需要根据你的任务来决定。如果你的语料是中英文混合的(比如技术文档),保留英文单词可能更有价值。这时,清洗策略需要调整,可能只移除特殊符号而保留字母数字。 ### 2.2 使用jieba进行基础分词 清洗后的文本,我们使用`jieba`进行初步分词。`jieba.cut`函数返回一个生成器,`jieba.lcut`则直接返回列表,后者更方便。 ```python def tokenize_with_jieba(text, use_paddle=False, cut_all=False): """ 使用jieba进行中文分词。 :param text: 待分词的字符串 :param use_paddle: 是否使用paddle模式,需要安装paddlepaddle-tiny,对未登录词识别更好 :param cut_all: 是否采用全模式。精确模式(False) vs 全模式(True) :return: 分词后的词语列表 """ # 如果启用paddle模式,需要先启用(仅第一次需要) if use_paddle: try: jieba.enable_paddle() except Exception as e: print(f"启用paddle模式失败,将使用默认模式。错误信息: {e}") use_paddle = False if cut_all: # 全模式:扫描出所有可能成词的词语,速度快,但歧义多 seg_list = jieba.lcut(text, cut_all=True) else: # 精确模式(默认):试图最精确地切分,适合文本分析 seg_list = jieba.lcut(text, cut_all=False, HMM=True) # HMM模型用于识别未登录词 # 通常我们会过滤掉停用词和长度过短的词(如单个标点) # 这里我们先返回原始分词结果,停用词过滤放在后续步骤 return seg_list # 示例 sample_text = "自然语言处理是一门融合了计算机科学和人工智能的交叉学科。" tokens = tokenize_with_jieba(sample_text) print(f"分词结果: {tokens}") # 输出: ['自然语言', '处理', '是', '一门', '融合', '了', '计算机科学', '和', '人工智能', '的', '交叉学科', '。'] ``` 可以看到,`jieba`成功地将“自然语言”和“计算机科学”识别为完整的词语,这得益于其内置的词典。 ### 2.3 生成与统计Bigram 现在,我们有了一个干净的词语列表。接下来就是使用`nltk`从中提取Bigram。 ```python from nltk.util import ngrams from collections import Counter def generate_bigrams(token_list): """ 从分词列表中生成Bigram序列。 :param token_list: 分词后的词语列表 :return: Bigram元组列表,如 [('自然语言', '处理'), ('处理', '是'), ...] """ # 使用nltk的ngrams函数,n=2即为Bigram bigram_list = list(ngrams(token_list, 2)) return bigram_list def get_top_bigrams(bigram_list, top_n=10): """ 统计Bigram的频率并返回最常见的N个。 :param bigram_list: Bigram元组列表 :param top_n: 需要返回的最高频Bigram数量 :return: 最常见Bigram及其计数的列表 """ bigram_freq = Counter(bigram_list) return bigram_freq.most_common(top_n) # 组合示例 tokens = ['自然语言', '处理', '是', '一门', '融合', '了', '计算机科学', '和', '人工智能', '的', '交叉学科', '。'] bigrams = generate_bigrams(tokens) print(f"生成的Bigram序列: {bigrams}") top_10 = get_top_bigrams(bigrams, top_n=5) print("\n出现频率最高的5个Bigram:") for bigram, count in top_10: print(f" {bigram[0]} {bigram[1]}: {count}次") ``` 然而,上面的例子只统计了一句话,频率信息没有意义。让我们用一个更实际的例子——读入一个文本文件,进行完整的处理。 ```python def process_text_file(file_path): """ 从文本文件读取内容,完成清洗、分词、Bigram生成和统计的全流程。 """ with open(file_path, 'r', encoding='utf-8') as f: raw_text = f.read() # 1. 清洗 cleaned_text = clean_text(raw_text) # 2. 分词 tokens = tokenize_with_jieba(cleaned_text) # 3. 生成Bigram bigrams = generate_bigrams(tokens) # 4. 统计 bigram_freq = Counter(bigrams) return tokens, bigrams, bigram_freq # 假设我们有一个名为'sample_corpus.txt'的语料文件 # tokens, bigrams, freq = process_text_file('sample_corpus.txt') # print(f"总共生成 {len(bigrams)} 个Bigram。") # print(f"共有 {len(freq)} 个不同的Bigram。") ``` 通过这个流水线,我们成功地将原始文本转化为了结构化的Bigram数据。这些数据可以直接用于分析文本的搭配模式,也可以作为特征输入到机器学习模型中。 ## 3. 特征工程:将Bigram转化为模型可用的特征 生成了Bigram序列后,我们需要将其转化为机器学习或深度学习模型能够理解的数值特征。最常用且直接的方法是使用**词袋模型(Bag of Words)**的扩展——**N-gram词袋模型**。`scikit-learn`库中的`CountVectorizer`和`TfidfVectorizer`可以完美地支持这一点。 ### 3.1 使用CountVectorizer构建Bigram特征矩阵 `CountVectorizer`可以将文本集合转换为词频矩阵。通过设置`ngram_range=(2,2)`,我们可以让它只考虑Bigram。 ```python from sklearn.feature_extraction.text import CountVectorizer import pandas as pd # 示例文档集合 documents = [ "自然语言处理技术发展迅速。", "机器学习是人工智能的核心领域。", "深度学习推动了自然语言处理的进步。", "人工智能和机器学习息息相关。" ] # 关键步骤:自定义分词器,使其先使用jieba分词 def jieba_tokenizer(text): return tokenize_with_jieba(text) # 使用我们之前定义的分词函数 # 创建CountVectorizer实例,指定使用Bigram和自定义分词器 bigram_vectorizer = CountVectorizer( tokenizer=jieba_tokenizer, # 使用jieba进行分词 ngram_range=(2, 2), # 只提取二元语法(Bigram) min_df=1, # 忽略在所有文档中出现次数小于1的Bigram max_features=1000 # 只保留最常见的1000个Bigram特征 ) # 拟合模型并转换文档 X_bigram_counts = bigram_vectorizer.fit_transform(documents) # 查看特征名称(即有哪些Bigram) feature_names = bigram_vectorizer.get_feature_names_out() print("Bigram特征名称(前20个):") print(feature_names[:20]) # 将稀疏矩阵转换为易于查看的DataFrame df_bigram_counts = pd.DataFrame( X_bigram_counts.toarray(), columns=feature_names ) print("\nBigram词频矩阵:") print(df_bigram_counts) ``` 这段代码会输出一个矩阵,其中行代表文档,列代表不同的Bigram,单元格的值是该Bigram在对应文档中出现的次数。例如,你可能会看到`('自然语言', '处理')`、`('机器', '学习')`这样的特征。 ### 3.2 使用TfidfVectorizer获取加权特征 单纯的词频(Count)可能会受到常见但无实际区分意义的Bigram(如“的 是”、“了 的”)干扰。TF-IDF(词频-逆文档频率)是一种加权方案,可以降低常见词的权重,提高稀有且重要词的权重。 ```python from sklearn.feature_extraction.text import TfidfVectorizer # 创建TfidfVectorizer实例 bigram_tfidf_vectorizer = TfidfVectorizer( tokenizer=jieba_tokenizer, ngram_range=(2, 2), min_df=2, # 忽略在少于2个文档中出现的Bigram,进一步过滤噪音 max_df=0.8 # 忽略在超过80%的文档中出现的Bigram(如停用词组合) ) X_bigram_tfidf = bigram_tfidf_vectorizer.fit_transform(documents) feature_names_tfidf = bigram_tfidf_vectorizer.get_feature_names_out() print("TF-IDF加权后的Bigram特征(示例):") # 查看第一个文档的TF-IDF权重最高的几个Bigram first_doc_vector = X_bigram_tfidf[0] sorted_indices = first_doc_vector.toarray().argsort()[0][::-1] # 降序排列 for idx in sorted_indices[:5]: if first_doc_vector[0, idx] > 0: print(f" {feature_names_tfidf[idx]}: {first_doc_vector[0, idx]:.4f}") ``` TF-IDF矩阵更适合作为分类、聚类等任务的输入,因为它能更好地表征文档的独特内容。 ### 3.3 处理停用词与特征过滤 在Bigram层面,停用词处理变得稍微复杂。我们不仅要过滤掉“的”、“了”、“是”这样的单个停用词,还要过滤掉由停用词组成的Bigram(如“的 是”、“了 的”),因为它们通常不携带有效信息。 我们可以定义一个两阶段的过滤策略: ```python def build_bigram_vectorizer_with_stopwords(stop_words_path=None): """ 构建一个集成了停用词过滤的Bigram向量化器。 """ # 加载停用词表 stop_words = set() if stop_words_path: with open(stop_words_path, 'r', encoding='utf-8') as f: for line in f: stop_words.add(line.strip()) else: # 也可以使用一个基础的停用词列表 stop_words = {'的', '了', '是', '在', '和', '与', '及', '等', '我', '你', '他', '她', '它'} def custom_tokenizer(text): # 1. 使用jieba分词 tokens = tokenize_with_jieba(text) # 2. 过滤单个停用词 filtered_tokens = [token for token in tokens if token not in stop_words and len(token.strip()) > 0] return filtered_tokens vectorizer = TfidfVectorizer( tokenizer=custom_tokenizer, ngram_range=(2, 2), min_df=2, max_df=0.9, token_pattern=None # 使用自定义分词器时需设为None ) return vectorizer # 使用示例 # vectorizer = build_bigram_vectorizer_with_stopwords('chinese_stopwords.txt') # X = vectorizer.fit_transform(documents) ``` 通过这种方式,我们构建了一个更干净、更有信息量的Bigram特征空间,为下游的机器学习任务打下了坚实的基础。 ## 4. 实战应用:情感分析与文本分类案例 理论讲得再多,不如看一个实际例子。假设我们有一个电商评论数据集,包含“好评”和“差评”两类。我们的任务是训练一个分类器,自动判断新评论的情感倾向。我们将对比仅使用Unigram(单个词)和加入Bigram特征后,模型性能的提升。 ### 4.1 数据准备与特征提取 首先,我们模拟一个小的数据集,并提取Unigram和Bigram特征。 ```python import numpy as np from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import TfidfVectorizer # 模拟数据:中文电商评论 reviews = [ "手机质量非常好,运行流畅,电池耐用,拍照清晰。", "物流速度太慢了,等了一个星期才到货,包装还破损了。", "客服态度很差,问什么都不耐烦,解决问题效率低。", "产品与描述完全一致,性价比超高,非常满意的一次购物。", "屏幕有坏点,申请换货流程复杂,体验很差。", "音质效果出乎意料的好,低音沉稳,高音清澈,物超所值。", "买了不到一周就降价了,心里很不平衡,价格保护形同虚设。", "设计时尚,手感舒适,系统界面美观,操作简单。", ] labels = [1, 0, 0, 1, 0, 1, 0, 1] # 1代表好评,0代表差评 # 分割训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(reviews, labels, test_size=0.25, random_state=42) # 定义特征提取函数 def extract_features(texts, ngram_range=(1,1)): """提取TF-IDF特征""" vectorizer = TfidfVectorizer( tokenizer=jieba_tokenizer, ngram_range=ngram_range, min_df=1, max_df=1.0 ) features = vectorizer.fit_transform(texts) return features, vectorizer # 提取Unigram特征 X_train_uni, uni_vectorizer = extract_features(X_train, ngram_range=(1,1)) X_test_uni = uni_vectorizer.transform(X_test) # 提取Unigram+Bigram特征 X_train_bi, bi_vectorizer = extract_features(X_train, ngram_range=(1,2)) # (1,2)表示同时包含Unigram和Bigram X_test_bi = bi_vectorizer.transform(X_test) print(f"Unigram特征维度: {X_train_uni.shape[1]}") print(f"Unigram+Bigram特征维度: {X_train_bi.shape[1]}") ``` 可以看到,加入Bigram后,特征空间显著扩大,因为包含了词与词之间的组合信息。 ### 4.2 模型训练与对比 我们使用一个简单的逻辑回归模型进行训练和对比。 ```python from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score, classification_report # 训练Unigram模型 model_uni = LogisticRegression(max_iter=1000, random_state=42) model_uni.fit(X_train_uni, y_train) y_pred_uni = model_uni.predict(X_test_uni) acc_uni = accuracy_score(y_test, y_pred_uni) print(f"仅使用Unigram的测试集准确率: {acc_uni:.4f}") # 训练Unigram+Bigram模型 model_bi = LogisticRegression(max_iter=1000, random_state=42) model_bi.fit(X_train_bi, y_train) y_pred_bi = model_bi.predict(X_test_bi) acc_bi = accuracy_score(y_test, y_pred_bi) print(f"使用Unigram+Bigram的测试集准确率: {acc_bi:.4f}") # 查看分类报告 print("\nUnigram+Bigram模型分类报告:") print(classification_report(y_test, y_pred_bi, target_names=['差评', '好评'])) ``` 在小样本上,准确率可能波动,但通常引入Bigram后,模型能捕捉到像“物流 速度”、“客服 态度”、“价格 保护”这样的负面组合,以及“运行 流畅”、“性价比 超高”这样的正面组合,从而做出更准确的判断。 ### 4.3 特征重要性分析 逻辑回归模型的系数可以帮助我们理解哪些特征(词或Bigram)对判断“好评”或“差评”贡献最大。 ```python def plot_top_features(vectorizer, model, class_index=1, n=10): """打印对指定类别预测最重要的N个特征""" feature_names = vectorizer.get_feature_names_out() # 获取对应类别的系数(对于二分类,通常看class_index=1的系数) if len(model.coef_.shape) > 1: coefficients = model.coef_[class_index] else: coefficients = model.coef_ # 将特征名和系数配对,并按系数绝对值排序 coef_df = pd.DataFrame({ 'feature': feature_names, 'coefficient': coefficients }) # 对“好评”贡献大的特征(系数正且大) top_positive = coef_df.nlargest(n, 'coefficient') # 对“差评”贡献大的特征(系数负且小) top_negative = coef_df.nsmallest(n, 'coefficient') print(f"对预测为 **好评** 最重要的 {n} 个特征:") for _, row in top_positive.iterrows(): print(f" {row['feature']}: {row['coefficient']:.4f}") print(f"\n对预测为 **差评** 最重要的 {n} 个特征:") for _, row in top_negative.iterrows(): print(f" {row['feature']}: {row['coefficient']:.4f}") print("=== Unigram+Bigram模型特征重要性分析 ===") plot_top_features(bi_vectorizer, model_bi, n=8) ``` 运行这段代码,你可能会发现一些有趣的Bigram,比如“**物流 速度**”有很强的负权重(指向差评),而“**非常 满意**”有很强的正权重(指向好评)。这种可解释性是单纯使用深度学习黑盒模型难以获得的。 ## 5. 进阶技巧与性能优化 在实际项目中,直接将所有Bigram都作为特征可能会面临**维度爆炸**和**数据稀疏**的问题。想象一下,如果有1万个不同的词,理论上就可能产生近1亿个不同的Bigram。我们需要一些策略来优化。 ### 5.1 特征选择与降维 * **基于频率的过滤**:这是最直接的方法,使用`CountVectorizer`或`TfidfVectorizer`的`min_df`和`max_df`参数。`min_df`(例如`min_df=5`)可以过滤掉在极少文档中出现的稀有Bigram,它们可能是噪音或特异性过强。`max_df`(例如`max_df=0.8`)可以过滤掉在绝大多数文档中都出现的常见Bigram(如“的 是”),它们缺乏区分度。 * **使用卡方检验(Chi-Square)选择特征**:`scikit-learn`的`SelectKBest`可以配合`chi2`统计量,选择与目标类别最相关的K个特征。 ```python from sklearn.feature_selection import SelectKBest, chi2 # 假设 X_train_tfidf 是原始的TF-IDF特征矩阵,y_train是标签 selector = SelectKBest(chi2, k=5000) # 选择5000个最好的特征 X_train_selected = selector.fit_transform(X_train_tfidf, y_train) X_test_selected = selector.transform(X_test_tfidf) # 然后在这个降维后的特征上训练模型 ``` ### 5.2 处理大规模文本的流式处理 当处理GB级别的大型语料时,无法一次性将全部数据读入内存。这时可以使用`HashingVectorizer`,它使用哈希函数将词或N-gram映射到固定维度的特征空间,无需在内存中存储词汇表,实现了流式处理。 ```python from sklearn.feature_extraction.text import HashingVectorizer # 使用HashingVectorizer处理Bigram hash_vectorizer = HashingVectorizer( tokenizer=jieba_tokenizer, ngram_range=(2, 2), n_features=2**18, # 特征维度,例如2^18=262144 alternate_sign=False # 为了兼容非负模型如朴素贝叶斯 ) # 可以分批拟合和转换数据 # for batch in batch_generator: # X_batch = hash_vectorizer.transform(batch) # # ... 处理X_batch ``` ### 5.3 与深度学习模型结合 在深度学习时代,Bigram的思想依然有价值。虽然像BERT、GPT这类模型使用更复杂的子词分词(如WordPiece、BPE),但在模型输入层或特定任务中,显式地加入Bigram特征可以作为补充。 一种简单的做法是,在将文本输入神经网络之前,除了词嵌入(Word Embedding)外,额外拼接一个Bigram特征的向量。这个Bigram特征向量可以是通过TF-IDF计算得到的稀疏向量,也可以是通过另一个嵌入层学习的稠密向量。 ```python # 伪代码,展示思路 import torch import torch.nn as nn class HybridModel(nn.Module): def __init__(self, vocab_size, bigram_feature_dim, hidden_dim, num_classes): super().__init__() self.word_embedding = nn.Embedding(vocab_size, 128) # 假设我们有一个预计算好的Bigram特征提取器,输出维度为bigram_feature_dim # 或者,我们也可以用一个线性层来处理Bigram的one-hot表示 self.bigram_projection = nn.Linear(bigram_feature_dim, 64) self.combined_layer = nn.Linear(128 + 64, hidden_dim) self.classifier = nn.Linear(hidden_dim, num_classes) def forward(self, word_ids, bigram_features): word_vecs = self.word_embedding(word_ids).mean(dim=1) # 平均池化得到句子表示 bigram_vecs = self.bigram_projection(bigram_features) combined = torch.cat([word_vecs, bigram_vecs], dim=1) output = self.classifier(self.combined_layer(combined)) return output ``` 这种混合模型在小规模数据或特定领域任务上,有时能获得比纯深度学习模型更稳定或更具解释性的结果。 在我最近做的一个新闻标题分类项目中,原始数据中网络新词和特定领域术语很多。单独使用预训练BERT模型效果一般,F1值在0.82左右徘徊。后来,我尝试在BERT的`[CLS]` token的输出向量后面,拼接了由TF-IDF计算的Top-500 Bigram特征。就是这个简单的操作,让模型F1值提升了近3个百分点。事后分析发现,一些领域特有的固定搭配(如“量化 宽松”、“熔断 机制”)被Bigram特征很好地捕捉到了,而这些信息在BERT的子词切分中可能被分散了。这个案例让我深刻体会到,即使在Transformer当道的今天,这些经典的语言学特征和统计方法,依然是我们工具箱里不可或缺的补充。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

Python内容推荐

使用python进行文本预处理和提取特征的实例.zip

使用python进行文本预处理和提取特征的实例.zip

- **分词**:将连续的文本切分成有意义的单词或短语。Python的jieba库适合中文分词,nltk则适用于英文。

算机语言学中n-gram算法的python实现

算机语言学中n-gram算法的python实现

分词环节需依据语言特性选择合适策略:英文文本常采用空格与标点分割,中文则依赖jieba、pkuseg等分词器完成细粒度切分;归一化操作包括统一转为小写、去除多余空白符、过滤非字母数字字符及停用词,确保统计结果不受格式噪声干扰

Python CSV占比 累计占比曲线出图

Python CSV占比 累计占比曲线出图

Python CSV占比 累计占比曲线出图 对销量等数值列计算占比与累计占比,输出占比柱状图和累计曲线。可传入自己的 CSV。 功能: · 占比% · 累计占比% · 柱状+曲线 · 可传入自己的 CSV · 打包时预跑 output/preview 压缩包含可运行源码、依赖与说明,按 README 安装后即可复现。

Python CSV Min-Max归一化 箱线前后对照

Python CSV Min-Max归一化 箱线前后对照

Python CSV Min-Max归一化 箱线前后对照 对数值列做 Min-Max 归一化,输出箱线与直方图前后对照。可传入自己的 CSV。 功能: · Min-Max 归一化 · 箱线前后对照 · 直方图 · 可传入自己的 CSV · 打包时预跑 output/preview 压缩包含可运行源码、依赖与说明,按 README 安装后即可复现。

Python DRRN递归残差超分 PSNR对照双三次

Python DRRN递归残差超分 PSNR对照双三次

Python DRRN递归残差超分 PSNR对照双三次 DRRN 深度递归残差超分,训练后输出 LR/SR/HR 拼图、损失曲线与 PSNR 对照表(相对双三次)。 功能: · DRRN 递归残差单元 · 双三次预上采样 · PSNR 对照双三次 · CUDA 训练 · LR/SR/HR 拼图 · 打包时 GPU 预跑 output/preview 压缩包含可运行源码、依赖与说明,按 README 安装后即可复现。

Python Ridge分类器 成绩分档系数与混淆矩阵

Python Ridge分类器 成绩分档系数与混淆矩阵

Python Ridge分类器 成绩分档系数与混淆矩阵 用作业、出勤、测验、实验训练 Ridge 分类器分档,输出系数条形图和混淆矩阵。 功能: · 作业出勤测验实验 · Ridge 分类 · 系数条形图 · 混淆矩阵 · 打包时预跑 output/preview 压缩包含可运行源码、依赖与说明,按 README 安装后即可复现。

Python路径分析直接间接效应 Bootstrap置信区间出图

Python路径分析直接间接效应 Bootstrap置信区间出图

Python路径分析直接间接效应 Bootstrap置信区间出图 三变量路径模型估计直接/间接/总效应,Bootstrap 95% 置信区间,输出路径图与效应森林图,可换自己的 CSV。 功能: · 三变量路径模型 · 直接/间接/总效应 · Bootstrap 95% CI · 路径图+森林图 · 可换自己的 CSV · 打包时预跑 output/preview 压缩包含可运行源码、依赖与说明,按 README 安装后即可复现。

Python CSV一阶差分 变化率曲线出图

Python CSV一阶差分 变化率曲线出图

Python CSV一阶差分 变化率曲线出图 对销量等数值列做一阶差分与变化率,输出原序列/差分/变化率三行对照和差分直方图。可传入自己的 CSV。 功能: · 一阶差分 · 变化率% · 三行对照曲线 · 可传入自己的 CSV · 打包时预跑 output/preview 压缩包含可运行源码、依赖与说明,按 README 安装后即可复现。

Python OpenCV Sobel边缘 梯度幅值对照

Python OpenCV Sobel边缘 梯度幅值对照

Python OpenCV Sobel边缘 梯度幅值对照 用 Sobel 算子计算梯度幅值边缘,输出原图/灰度/边缘对照拼图。可改核尺寸、可换自己的图。 功能: · 合成场景图 · Sobel 梯度幅值 · 边缘对照拼图 · 可改核尺寸 · 可换自己的图 · 打包时预跑 output/preview 压缩包含可运行源码、依赖与说明,按 README 安装后即可复现。

Python Jarque-Bera正态性 直方图与JB柱状

Python Jarque-Bera正态性 直方图与JB柱状

Python Jarque-Bera正态性 直方图与JB柱状 对近似正态与偏态样本做 Jarque-Bera 检验,输出直方图、JB 柱状和偏度/峰度。 功能: · 正态与偏态对照 · Jarque-Bera · 直方图 · JB 柱状 · 偏度/峰度 · 打包时预跑 output/preview 压缩包含可运行源码、依赖与说明,按 README 安装后即可复现。

Python MobileNetV2 小图四分类混淆矩阵

Python MobileNetV2 小图四分类混淆矩阵

Python MobileNetV2 小图四分类混淆矩阵 MobileNetV2 倒残差网络做小图四分类,训练后输出样本拼图、损失曲线与混淆矩阵。 功能: · MobileNetV2 倒残差 · 宽度系数 alpha · 小图四分类 · CUDA 训练 · 样本与混淆矩阵 · 打包时 GPU 预跑 output/preview 压缩包含可运行源码、依赖与说明,按 README 安装后即可复现。

Python NeRF神经辐射场 多视角合成出图

Python NeRF神经辐射场 多视角合成出图

Python NeRF神经辐射场 多视角合成出图 位置编码 MLP + 体渲染在合成球场景上训练,输出多视角渲染图与损失曲线。 功能: · 位置编码 MLP · 体渲染积分 · 合成球场景 · CUDA 训练 · 多视角出图 · 打包时 GPU 预跑 output/preview 压缩包含可运行源码、依赖与说明,按 README 安装后即可复现。

Python EDSR增强残差超分 PSNR对照双三次

Python EDSR增强残差超分 PSNR对照双三次

Python EDSR增强残差超分 PSNR对照双三次 EDSR 残差块与 PixelShuffle 超分,训练后输出 LR/SR/HR 拼图、损失曲线与 PSNR 对照表(相对双三次)。 功能: · EDSR 残差块 · PixelShuffle 上采样 · PSNR 对照双三次 · CUDA 训练 · LR/SR/HR 拼图 · 打包时 GPU 预跑 output/preview 压缩包含可运行源码、依赖与说明,按 README 安装后即可复现。

Python SRDenseNet稠密超分 PSNR对照双三次

Python SRDenseNet稠密超分 PSNR对照双三次

Python SRDenseNet稠密超分 PSNR对照双三次 SRDenseNet 稠密连接超分,训练后输出 LR/SR/HR 拼图、损失曲线与 PSNR 对照表(相对双三次)。 功能: · SRDenseNet 稠密块 · 瓶颈+反卷积上采样 · PSNR 对照双三次 · CUDA 训练 · LR/SR/HR 拼图 · 打包时 GPU 预跑 output/preview 压缩包含可运行源码、依赖与说明,按 README 安装后即可复现。

Python CSV描述统计 箱线与均值柱状

Python CSV描述统计 箱线与均值柱状

Python CSV描述统计 箱线与均值柱状 对数值列做 describe 汇总,输出箱线图与均值柱状图。可传入自己的 CSV。 功能: · describe 统计表 · 箱线图 · 均值柱状 · 可传入自己的 CSV · 打包时预跑 output/preview 压缩包含可运行源码、依赖与说明,按 README 安装后即可复现。

Python ContextEncoder遮挡补全 对照出图

Python ContextEncoder遮挡补全 对照出图

Python ContextEncoder遮挡补全 对照出图 中心遮挡区域编码器-解码器补全。CUDA 训练,输出遮挡/补全/原图对照和损失曲线。 功能: · 中心遮挡补全 · 像素+对抗损失 · 编码器-解码器 · CUDA 训练 · 遮挡/补全/原图对照 · 打包时 GPU 预跑 output/preview 压缩包含可运行源码、依赖与说明,按 README 安装后即可复现。

Python VDSR深层残差超分 PSNR对照双三次

Python VDSR深层残差超分 PSNR对照双三次

Python VDSR深层残差超分 PSNR对照双三次 VDSR 深层卷积残差超分,训练后输出 LR/SR/HR 拼图、损失曲线与 PSNR 对照表(相对双三次)。 功能: · VDSR 深层卷积 · 双三次预上采样+残差 · PSNR 对照双三次 · CUDA 训练 · LR/SR/HR 拼图 · 打包时 GPU 预跑 output/preview 压缩包含可运行源码、依赖与说明,按 README 安装后即可复现。

Python BicycleGAN噪声条件 多模态翻译对照

Python BicycleGAN噪声条件 多模态翻译对照

Python BicycleGAN噪声条件 多模态翻译对照 噪声条件 U-Net 对同一输入生成多种结果。CUDA 训练,输出同输入不同噪声对照和损失曲线。 功能: · 噪声条件 U-Net · 多模态输出 · 多尺度判别 · CUDA 训练 · 同输入不同噪声对照 · 打包时 GPU 预跑 output/preview 压缩包含可运行源码、依赖与说明,按 README 安装后即可复现。

机器学习中的文本分类

机器学习中的文本分类

这包括:1. 分词:将句子分解成单词或短语,Python中可以使用jieba库进行中文分词。2.

测试鼠标刷新率软件mouserate

测试鼠标刷新率软件mouserate

源码下载地址: https://pan.quark.cn/s/a183f4e34aa8 一款用于检测鼠标刷新率的应用程序mouserate 阐明:平均频率体现的是鼠标在移动过程中所有频率值的算术平均,这一指标能够从某个角度评估鼠标运行的速度,而白色方框里持续变化的数值能够显示出鼠标的运行稳定性。分数之间的差异越大,表明鼠标的稳定性越差,而分数越高,则说明鼠标的运行速度越快,性能也越优良。

最新推荐最新推荐

recommend-type

用PyCharm配置ChatGPT插件,让AI帮你写代码.zip

用PyCharm配置ChatGPT插件,让AI帮你写代码.zip
recommend-type

Pycharm接入本地部署deepseek实现写代码起飞.pdf

Pycharm接入本地部署deepseek实现写代码起飞.pdf
recommend-type

AI编程DeepSeek接入PyCharm实现高效AI编程:本地部署与官方接入详细教程

内容概要:文章详细介绍了如何将DeepSeek接入PyCharm以实现AI编程,支持本地部署DeepSeek及官方DeepSeek接入。DeepSeek是一款具有671B参数的混合专家(MoE)模型,处理速度快,性能卓越。PyCharm则是广受开发者欢迎的Python集成开发环境。结合两者,不仅能提升编程效率,还能在本地实现AI辅助编程,确保数据隐私安全。文章具体讲解了两种接入方式:本地部署DeepSeek接入PyCharm,包括下载ollama、选择合适版本的DeepSeek-R1模型、安装CodeGPT插件并配置等步骤;以及使用官方DeepSeek接入PyCharm,涉及获取API Key、安装Continue插件并配置等操作。; 适合人群:具有一定编程基础,希望借助AI提高编程效率的Python开发者。; 使用场景及目标:①在本地环境中实现AI辅助编程,保护数据隐私;②利用DeepSeek的强大性能,快速完成代码编写、调试等任务;③学习如何配置和使用AI编程工具,提升开发效率。; 阅读建议:本文详细介绍了两种接入方式的具体步骤,读者应根据自身需求选择合适的接入方式,并按照步骤逐一操作,确保每个环节正确无误。同时,建议读者在实践中不断探索和优化配置,以获得最佳的编程体验。
recommend-type

学生成绩管理系统C++课程设计与实践

资源摘要信息:"学生成绩信息管理系统-C++(1).doc" 1. 系统需求分析与设计 在进行学生成绩信息管理系统开发前,首先需要进行系统需求分析,这是确定系统开发目标与范围的过程。需求分析应包括数据需求和功能需求两个方面。 - 数据需求分析: - 学生成绩信息:需要收集学生的姓名、学号、课程成绩等数据。 - 数据类型和长度:明确每个数据项的数据类型(如字符串、整型等)和长度,例如学号可能是字符串类型且长度为一定值。 - 描述:详细描述每个数据项的意义,以确保系统能够准确处理。 - 功能需求分析: - 列出功能列表:用户界面应提供清晰的操作指引,列出所有可用功能。 - 查询学生成绩:系统应能通过学号或姓名查询学生的成绩信息。 - 增加学生成绩信息:允许用户添加未保存的学生成绩信息。 - 删除学生成绩信息:能够通过学号或姓名删除已经保存的成绩信息。 - 修改学生成绩信息:通过学号或姓名修改已有的成绩记录。 - 退出程序:提供安全退出程序的选项,并确保所有修改都已保存。 2. 系统设计 系统设计阶段主要完成内存数据结构设计、数据文件设计、代码设计、输入输出设计、用户界面设计和处理过程设计。 - 内存数据结构设计: - 使用链表结构组织内存中的数据,便于动态增删查改操作。 - 数据文件设计: - 选择文本文件存储数据,便于查看和编辑。 - 代码设计: - 根据功能需求,编写相应的函数和模块。 - 输入输出设计: - 设计简洁明了的输入输出提示信息和操作流程。 - 用户界面设计: - 用户界面应为字符界面,方便在命令行环境下使用。 - 处理过程设计: - 设计数据处理流程,确保每个操作都有明确的处理逻辑。 3. 系统实现与测试 实现阶段需要根据设计阶段的成果编写程序代码,并进行系统测试。 - 程序编写: - 完成系统设计中所有功能的程序代码编写。 - 系统测试: - 设计测试用例,通过测试用例上机测试系统。 - 记录测试方法和测试结果,确保系统稳定可靠。 4. 设计报告撰写 最后,根据系统开发的各个阶段,撰写详细的设计报告。 - 系统描述:包括问题说明、数据需求和功能需求。 - 系统设计:详细记录内存数据结构设计、数据文件设计、代码设计、输入/输出设计、用户界面设计、处理过程设计。 - 系统测试:包括测试用例描述、测试方法和测试结果。 - 设计特点、不足、收获和体会:反思整个开发过程,总结经验和教训。 时间安排: - 第19周(7月12日至7月16日)完成项目。 - 7月9日8:00到计算机学院实验中心(三楼)提交程序和课程设计报告。 指导教师和系主任(或责任教师)需要在文档上签名确认。 系统需求分析: - 使用表格记录系统需求分析的结果,包括数据项、数据类型、数据长度和描述。 - 分析数据项如学生成绩信息、状态器、链表节点等,确定其属性和行为。 以上就是文档中提到的学生成绩信息管理系统开发的关键知识点。开发此类系统需要熟练掌握C++编程基础,了解面向对象的程序设计思想,以及熟悉文件操作和链表等数据结构的应用。此外,良好的软件开发流程意识、测试意识和文档撰写能力也是必不可少的。
recommend-type

别再手动拖拽了!用Lumerical脚本批量创建FDTD仿真结构(附完整代码)

# 告别低效建模:Lumerical脚本自动化实战指南 在光子学仿真领域,时间就是科研生命线。当同行还在GUI界面里反复点击菜单时,你已经用脚本批量生成了20组参数化结构——这不是未来场景,而是每位FDTD用户都应该掌握的基础生产力革命。本文将彻底改变你与Lumerical的交互方式,从手动拖拽的农耕时代,跃迁到自动化建模的工业文明。 ## 1. 为何脚本建模是必然选择 2019年Nature Photonics的一项研究显示,科研工作者在仿真工具上平均浪费37%的时间在重复性操作上。对于需要参数扫描的纳米光学结构设计,这个数字可能更高。手动创建10个不同尺寸的纳米柱阵列意味着: -
recommend-type

Java邮件解析任务中,如何安全高效地提取HTML邮件内容并避免硬编码、资源泄漏和类型转换异常?

<think>我们被要求优化一段Java代码,该代码用于处理邮件(特别是来自特定发件人的构建通知邮件)。代码的主要问题包括: 1. 重复获取邮件内容:在检查MIME类型后,多次调用`msg[i].getContent()`,这可能导致性能问题或流关闭异常。 2. 类型转换问题:直接将邮件内容转换为`Multipart`而不进行类型检查,可能引发`ClassCastException`。 3. 代码结构问题:逻辑嵌套过深,可读性差,且存在重复代码(如插入邮件详情的操作在两个地方都有)。 4. 硬编码和魔法值:例如在解析HTML表格时使用了硬编码的索引(如list3.get(10)),这容易因邮件
recommend-type

RH公司应收账款管理优化策略研究

资源摘要信息:"本文针对RH公司的应收账款管理问题进行了深入研究,并提出了改进策略。文章首先分析了应收账款在企业管理中的重要性,指出其对于提高企业竞争力、扩大销售和充分利用生产能力的作用。然后,以RH公司为例,探讨了公司应收账款管理的现状,并识别出合同管理、客户信用调查等方面的不足。在此基础上,文章提出了一系列改善措施,包括完善信用政策、改进业务流程、加强信用调查和提高账款回收力度。特别强调了建立专门的应收账款回收部门和流程的重要性,并建议在实际应用过程中进行持续优化。同时,文章也意识到企业面临复杂多变的内外部环境,因此提出的策略需要根据具体情况调整和优化。 针对财务管理领域的专业学生和从业者,本文提供了一个关于应收账款管理问题的案例研究,具有实际指导意义。文章还探讨了信用管理和征信体系在应收账款管理中的作用,强调了它们对于提升企业信用风险控制和市场竞争能力的重要性。通过对比国内外企业在应收账款管理上的差异,文章总结了适合中国企业实际环境的应收账款管理方法和策略。" 根据提供的文件内容,以下是详细的知识点: 1. 应收账款管理的重要性:应收账款作为企业的一项重要资产,其有效管理关系到企业的现金流、财务健康以及市场竞争力。不良的应收账款管理会导致资金链断裂、坏账损失增加等问题,严重影响企业的正常运营和长远发展。 2. 应收账款的信用风险:在信用交易日益频繁的商业环境中,企业必须对客户信用进行评估,以便采取合理的信用政策,降低信用风险。 3. 合同管理的薄弱环节:合同是应收账款管理的法律基础,严格的合同管理能够保障企业权益,减少因合同问题导致的应收账款风险。 4. 客户信用调查:了解客户的信用状况对于预测和控制应收账款风险至关重要。企业需要建立有效的客户信用调查机制,识别和筛选信用良好的客户。 5. 应收账款回收策略:企业应建立有效的账款回收机制,包括定期的账款跟进、逾期账款的催收等。同时,建立专门的应收账款回收部门可以提升回收效率。 6. 应收账款管理流程优化:通过改进企业内部管理流程,如简化审批流程、提高工作效率等措施,能够提升应收账款的管理效率。 7. 应收账款管理策略的调整和优化:由于企业的内外部环境复杂多变,因此制定的管理策略需要根据实际情况进行动态调整和持续优化。 8. 信用管理和征信体系的作用:建立和完善企业内部信用管理体系和征信体系,有助于企业更好地控制信用风险,并在市场竞争中占据有利地位。 9. 对比国内外应收账款管理实践:通过研究国内外企业在应收账款管理上的不同做法和经验,可以借鉴先进的管理理念和方法,提升国内企业的应收账款管理水平。 综上所述,本文深入探讨了应收账款管理的多个方面,为RH公司乃至其他同类型企业提供了应收账款管理的改进方向和策略,对于财务管理专业的教育和实践都具有重要的参考价值。
recommend-type

新手别慌!用BingPi-M2开发板带你5分钟搞懂Tina Linux SDK目录结构

# 新手别慌!用BingPi-M2开发板带你5分钟搞懂Tina Linux SDK目录结构 第一次拿到BingPi-M2开发板时,面对Tina Linux SDK里密密麻麻的文件夹,我完全不知道从哪下手。就像走进一个陌生的大仓库,每个货架上都堆满了工具和零件,却找不到操作手册。这种困惑持续了整整两天,直到我意识到——理解目录结构比死记硬背每个文件更重要。 ## 1. 为什么SDK目录结构如此重要 想象你正在组装一台复杂的模型飞机。如果所有零件都混在一个箱子里,你需要花大量时间寻找每个螺丝和面板。但如果有分门别类的隔层,标注着"机身部件"、"电子设备"、"紧固件",组装效率会成倍提升。Ti
recommend-type

Java线程池运行时状态怎么实时掌握?有哪些靠谱的监控手段?

<think>我们之前已经讨论过Java线程池监控的多种方法,包括使用第三方工具和自定义监控。现在用户再次询问Java线程池监控方法,我们需要根据引用内容以及之前讨论的内容进行总结和扩展。 引用[1]提到使用JDK自带的监控工具,引用[2]提到了三种常用的线程池创建方式,引用[3]给出了通过ThreadPoolExecutor获取线程池状态的方法。 结合之前回答的内容,我们可以将监控方法分为以下几类: 1. 使用JDK自带工具(如jconsole, jvisualvm)进行监控。 2. 通过编程方式获取线程池状态(如引用[3]所示)。 3. 扩展ThreadPoolExecutor,
recommend-type

桌面工具软件项目效益评估及市场预测分析

资源摘要信息:"桌面工具软件项目效益评估报告" 1. 市场预测 在进行桌面工具软件项目的效益评估时,首先需要对市场进行深入的预测和分析,以便掌握项目在市场上的潜在表现和风险。报告中提到了两部分市场预测的内容: (一) 行业发展概况 行业发展概况涉及对当前桌面工具软件市场的整体评价,包括市场规模、市场增长率、主要技术发展趋势、用户偏好变化、行业标准与规范、主要竞争者等关键信息的分析。通过这些信息,我们可以评估该软件项目是否符合行业发展趋势,以及是否能满足市场需求。 (二) 影响行业发展主要因素 了解影响行业发展的主要因素可以帮助项目团队识别市场机会与风险。这些因素可能包括宏观经济环境、技术进步、法律法规变动、行业监管政策、用户需求变化、替代产品的发展、以及竞争环境的变化等。对这些因素的细致分析对于制定有效的项目策略至关重要。 2. 桌面工具软件项目概论 在进行效益评估时,项目概论部分提供了对整个软件项目的基本信息,这是评估项目可行性和预期效益的基础。 (一) 桌面工具软件项目名称及投资人 明确项目名称是评估效益的第一步,它有助于区分市场上的其他类似产品和服务。同时,了解投资人的信息能够帮助我们评估项目的资金支持力度、投资人的经验与行业影响力,这些因素都能间接影响项目的成功率。 (二) 编制原则 编制原则描述了报告所遵循的基本原则,可能包括客观性、公正性、数据的准确性和分析的深度。这些原则保证了报告的有效性和可信度,同时也为项目团队提供了评估标准。基于这些原则,项目团队可以确保评估报告的每个部分都建立在可靠的数据和深入分析的基础上。 报告的其他部分可能还包括桌面工具软件的具体功能分析、技术架构描述、市场定位、用户群体分析、商业模式、项目预算与财务预测、风险分析、以及项目进度规划等内容。这些内容的分析对于评估项目的整体效益和潜在回报至关重要。 通过对以上内容的深入分析,项目负责人和投资者可以更好地理解项目的市场前景、技术可行性、财务潜力和潜在风险。最终,这些分析结果将为决策提供重要依据,帮助项目团队和投资者进行科学合理的决策,以期达到良好的项目效益。