从零构建中文情感分析系统:文本预处理、词向量与分类实战
本文将完整演示一个中文情感分析系统的构建流程,涵盖数据预处理、中文分词、停用词过滤、词向量转换、模型训练与评估等核心环节。
二、数据预处理:让计算机“看懂”中文
2.1 原始数据读取
首先,我们需要准备两类数据:好评和差评的评论文本,每行一条评论。使用 Pandas 读取数据:
import pandas as pd
cp_content = pd.read_table("差评.txt", encoding='gbk')
yzpj_content = pd.read_table("优质评价.txt", encoding='gbk')
2.2 中文分词:jieba的核心作用
与英文不同,中文文本是连续的字符序列,没有天然的空格分隔。要让计算机理解中文,第一步就是分词——把连续的文本"敲碎",变成一块块有意义的"积木"。
jieba 是目前最流行的 Python 中文分词库之一,对初学者非常友好。使用 jieba.lcut() 可以对每条评论进行精准分词:
import jieba
cp_segments = []
contents = cp_content.content.values.tolist()
for content in contents:
results = jieba.lcut(content)
if len(results) > 1: # 过滤无效短评论
cp_segments.append(results)
分词的质量直接影响后续所有环节的效果——分词错误会在后续的处理链条中被不断放大。
2.3 停用词过滤:去除“噪音”
中文中有大量无实际意义的词,如“的”、“了”、“是”、“在”等。这些词在文本中频繁出现但信息量极低,如果不加处理,会干扰模型学习真正有意义的特征。
停用词过滤的核心代码如下:
python
stopwords = pd.read_csv("StopwordsCN.txt", encoding='utf8', engine='python')
def drop_stopwords(contents, stopwords):
segments_clean = []
for content in contents:
line_clean = [word for word in content if word not in stopwords]
if line_clean:
segments_clean.append(line_clean)
return segments_clean
常用的中文停用词表包括哈工大停用词表、四川大学停用词表等。
三、词向量转换:把文字变成数字
这是整个流程中最关键的一步。机器学习算法只能处理数值数据,因此需要将文本转换为数值向量。
3.1 词袋模型(Bag of Words)
词袋模型的核心思想非常朴素:不管词在句子里的顺序,只统计每个词出现了多少次。它将文本视为一个“装满词的袋子”,通过词汇的出现频率来描述文本特征。
例如,对于“dog cat fish”和“dog cat cat”两条文本,词袋模型会统计:
-
dog: 1次 / 1次
-
cat: 1次 / 2次
-
fish: 1次 / 0次
3.2 CountVectorizer:一键向量化
CountVectorizer 是 scikit-learn 中用于将文本转换为词频矩阵的核心工具。它的工作流程分为三个步骤:文本预处理 → 构建词汇表 → 生成词频矩阵。
基本用法如下:
python
from sklearn.feature_extraction.text import CountVectorizer
将分词结果用空格连接成字符串(CountVectorizer要求)
words = [' '.join(text) for text in x_train]
初始化向量化器
vec = CountVectorizer(
max_features=4000, # 最多保留4000个特征词
lowercase=False, # 中文不需要转小写
ngram_range=(1, 3) # 提取1-3个连续词的组合
)
拟合并转换
x_train_vec = vec.fit_transform(words)
3.3 关键参数解析
max_features:控制保留的最大特征数量。设置过大容易过拟合,设置过小可能丢失重要信息。
ngram_range:决定提取词的连续组合范围。(1,2)表示既提取单个词,也提取相邻两个词的组合。例如“质量很好”可以拆分为“质量”、“很好”和“质量很好”三个特征,能更好地捕捉短语级别的语义。
lowercase:对中文必须设为False,因为中文没有大小写概念。
重要提醒:CountVectorizer默认按空格分词,因此中文文本必须先经过jieba分词,并用空格连接成“词1 词2 词3”的格式,否则CountVectorizer会把整条句子当作一个词。
3.4 输出解读
fit_transform()返回的是一个稀疏矩阵,只记录非零值以节省存储空间。通过toarray()可以查看完整的词频矩阵——每一行代表一条文本,每一列代表一个词汇,数值代表该词在文本中的出现次数。
print(cv_fit) # 稀疏矩阵
print(cv.get_feature_names_out()) # 所有特征词
print(cv_fit.toarray()) # 完整的词频矩阵
四、模型训练与评估
完成向量化后,就可以使用机器学习模型进行分类了。朴素贝叶斯(MultinomialNB)是文本分类中常用且高效的算法。
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
from sklearn import metrics
划分训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(
features, labels, test_size=0.2, random_state=42
)
训练模型
classifier = MultinomialNB(alpha=0.1)
classifier.fit(x_train_vec, y_train)
预测与评估
predictions = classifier.predict(x_test_vec)
print(metrics.classification_report(y_test, predictions))
五、完整技术路线总结
一个完整的中文情感分析系统通常遵循以下技术路线:
| 中文分词 | jieba | 将连续文本切分为词语 |
| 停用词过滤 | 停用词表 | 去除无意义的高频词 |
| 文本向量化 | CountVectorizer / TfidfVectorizer | 将文本转为数值特征 |
| 数据平衡 | SMOTE(可选) | 处理类别不平衡问题 |
| 模型训练 | 朴素贝叶斯 / SVM | 训练分类器 |
| 模型评估 | classification_report | 评估模型效果 |
六、常见问题与注意事项
1. 中文编码问题:读取中文文本时必须确保编码正确(通常为UTF-8或GBK),否则会出现乱码或报错。
2. 数据不平衡:如果好评和差评数量差距悬殊,模型会偏向多数类。可以通过过采样(SMOTE)或欠采样来处理。
3. 特征数量选择:max_features并非越大越好。过多的特征会导致维度灾难和过拟合,一般建议通过交叉验证来确定最优值。
4. 模型过拟合:训练集准确率很高但测试集表现差,说明模型过拟合了。可以通过增加训练数据、减少特征数量、调整正则化参数等方式改善。
七、最后
从原始的中文评论文本到可用的情感分类模型,核心路径可以概括为:文本 → 分词 → 去停用词 → 向量化 → 分类。每一步都有其不可替代的作用——分词决定了语义单元的质量,停用词过滤去除了噪音,向量化让机器“理解”了文本,分类器则完成了最终的判断。
CountVectorizer作为scikit-learn中经典的文本特征提取工具,以其简单直观、高效实用的特点,在文本分类、情感分析等任务中被广泛应用。

![[特殊字符]DeepSeek‑Harness(DSH)小白保姆教程-171主机测评](https://www.171host.com/wp-content/uploads/2026/08/20260816085112-6a817a009aabf-220x150.png)
