Python文本向量化工具CountVectorizer:基于朴素贝叶斯的好评差评文本分类实战
·
目录
一、项目背景
在电商、评论分析等场景中,情感分析是核心应用之一,通过算法自动识别文本的情感倾向(好评 / 差评),能快速完成海量评论的分类统计,替代人工低效审核。
本文将使用 Python 完整实现基于朴素贝叶斯的中文情感分析模型,流程涵盖:数据读取、jieba 分词、停用词过滤、文本向量化、模型训练与预测,代码可直接复用落地。
二、环境准备
需要安装核心依赖库,直接执行以下命令:
pip install scikit-learn pandas jieba
核心库作用:
jieba:中文分词必备工具pandas:数据读取与处理scikit-learn:文本向量化、模型训练、评估
三、核心知识点前置讲解
在实战前,先理解代码中最核心的文本向量化工具CountVectorizer,这是 NLP 任务的基础:
CountVectorizer 功能演示
作用:将文本转换为词频矩阵,统计每个词汇在文本中出现的次数,同时支持 N-gram 语法(提取连续 1-3 个词的组合)。
from sklearn.feature_extraction.text import CountVectorizer
# 测试文本
texts = ["dog cat fish","dog cat cat","fish bird","bird"]
# 初始化:最大特征数10,提取1-3个连续词
cv = CountVectorizer(max_features=10, ngram_range=(1,3))
# 拟合+转换文本
cv_fit = cv.fit_transform(texts)
# 输出结果
print("稀疏矩阵:\n", cv_fit)
print("\n所有特征词:\n", cv.get_feature_names_out())
print("\n词频矩阵:\n", cv_fit.toarray())
稀疏矩阵:
(0, 4) 1
(0, 0) 1
(0, 3) 1
(1, 1) 2
(1, 0) 1
(2, 2) 1
(2, 4) 1
(3, 2) 1
所有特征词:
['cat' 'cat cat' 'bird' 'fish' 'dog']
词频矩阵:
[[0 1 0 1 1]
[1 2 0 0 0]
[0 0 1 1 0]
[0 0 1 0 0]]
- 稀疏矩阵:节省存储空间,只记录非零值
- 特征词:模型学习的所有词汇 / 词组
- 词频矩阵:每一行代表一条文本,数值代表词汇出现次数
四、完整情感分析实战流程
1. 数据准备
- 准备两个文本文件:
好评.txt、差评.txt,编码为 UTF-8 - 准备中文停用词表:
StopwordsCN.txt(包含的、了、吗、呢等无意义词汇) - 数据格式:每行一条评论,包含
content列
2. 读取评论数据
import pandas as pd
# 读取好评、差评数据
cp_content = pd.read_table("差评.txt", encoding='utf8')
yzpj_content = pd.read_table("好评.txt", encoding='utf8')
3. 中文分词(jieba)
使用jieba.lcut()对每条评论精准分词,过滤无效短评论:
import jieba
# ====== 差评分词 ======
cp_segments = []
contents = cp_content.content.values.tolist()
for content in contents:
# 精确分词
results = jieba.lcut(content)
# 过滤只有1个词的无效评论
if len(results) > 1:
cp_segments.append(results)
# 保存分词结果
cp_fc_results = pd.DataFrame({'content': cp_segments})
cp_fc_results.to_excel('cp_fc_results.xlsx', index=False)
# ====== 好评分词 ======
yzpj_segments = []
contents = yzpj_content.content.values.tolist()
for content in contents:
results = jieba.lcut(content)
if len(results) > 1:
yzpj_segments.append(results)
# 保存分词结果
yzpj_fc_results = pd.DataFrame({'content': yzpj_segments})
yzpj_fc_results.to_excel('yzpj_fc_results.xlsx', index=False)
4. 移除停用词
无意义词汇会干扰模型学习,必须过滤:
# 读取停用词表
stopwords = pd.read_csv(r"./StopwordsCN.txt", encoding='utf8', engine='python', index_col=False)
stopwords = stopwords.stopword.values.tolist()
# 定义去停用词函数
def drop_stopwords(contents, stopwords):
segments_clean = []
for content in contents:
line_clean = []
for word in content:
if word not in stopwords:
line_clean.append(word)
segments_clean.append(line_clean)
return segments_clean
# 处理好评、差评数据
cp_contents = cp_fc_results.content.values.tolist()
cp_clean = drop_stopwords(cp_contents, stopwords)
yzpj_contents = yzpj_fc_results.content.values.tolist()
yzpj_clean = drop_stopwords(yzpj_contents, stopwords)
5. 构建训练数据集
给数据打标签:差评 = 1,好评 = 0,合并数据集:
# 添加标签
cp_train = pd.DataFrame({'segments_clean': cp_clean, 'label': 1})
yzpj_train = pd.DataFrame({'segments_clean': yzpj_clean, 'label': 0})
# 合并数据
pj_train = pd.concat([cp_train, yzpj_train])
print("数据集预览:\n", pj_train.head())
6. 数据集划分
将数据划分为训练集和测试集:
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(
pj_train['segments_clean'].values,
pj_train['label'].values,
random_state=0
)
# 转换为CountVectorizer可识别的文本格式
def convert_to_text(data):
words = []
for line in data:
words.append(' '.join(line))
return words
train_words = convert_to_text(x_train)
test_words = convert_to_text(x_test)
7. 文本向量化
使用CountVectorizer将文本转为数字特征:
from sklearn.feature_extraction.text import CountVectorizer
# 初始化向量化工具
vec = CountVectorizer(max_features=4000, lowercase=False, ngram_range=(1,3))
# 拟合训练集
vec.fit(train_words)
# 转换训练集、测试集
x_train_vec = vec.transform(train_words)
x_test_vec = vec.transform(test_words)
8. 朴素贝叶斯模型训练
选择适合文本分类的多项式朴素贝叶斯模型:
from sklearn.naive_bayes import MultinomialNB
# 初始化模型
classifier = MultinomialNB(alpha=0.1)
# 训练模型
classifier.fit(x_train_vec, y_train)
9. 模型评估
使用精确率、召回率、F1 分数评估模型效果:
from sklearn import metrics
# 训练集评估
train_pred = classifier.predict(x_train_vec)
print("训练集评估报告:\n", metrics.classification_report(y_train, train_pred))
# 测试集评估
test_pred = classifier.predict(x_test_vec)
print("测试集评估报告:\n", metrics.classification_report(y_test, test_pred))
10. 自定义文本预测
输入任意评论,实时预测情感倾向:
# 测试自定义文本
def predict_sentiment(text):
# 分词
words = jieba.lcut(text)
# 格式转换
standard = [' '.join(words)]
# 预测
result = classifier.predict(vec.transform(standard))
# 输出结果
if result[0] == 1:
return "差评"
else:
return "好评"
# 测试
test_text1 = "这个玩意真好,我很喜欢"
test_text2 = "质量太差了,再也不买了"
print(predict_sentiment(test_text1)) # 输出:好评
print(predict_sentiment(test_text2)) # 输出:差评
五、代码优化与总结
1. 优化建议
- 扩充停用词表,提升过滤效果
- 调整
max_features和alpha参数,优化模型精度 - 可替换为
TfidfVectorizer,效果通常优于 CountVectorizer - 增加数据量,提升模型泛化能力
2. 项目总结
本文完整实现了中文情感分析全流程,核心步骤:
- 数据读取 → jieba 分词 → 停用词过滤
- 文本向量化 → 数据集划分
- 朴素贝叶斯训练 → 模型评估 → 自定义预测
代码简洁易懂,适合 NLP 入门学习,也可直接应用于电商评论、舆情分析等实际场景。
六、完整代码获取
本文所有代码可直接复制运行,只需替换数据文件路径即可。如果对你有帮助,欢迎点赞、收藏、关注~
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)