云计算百科
云计算领域专业知识百科平台

基于朴素贝叶斯的评论情感分析

一、前期准备

  • 数据处理:Pandas,高效读取文本 / Excel 文件,完成数据格式转换与拼接;

  • 中文分词:jieba,Python 最常用的中文分词库,轻量高效,支持精准分词;

  • 文本向量化:CountVectorizer,将分词后的文本转化为词频矩阵,实现 “文本→数值” 的核心转换;

  • 分类算法:朴素贝叶斯(MultinomialNB),基于概率统计的算法,对文本分类任务适配性强、训练速度快、效果稳定;

  • 模型评估:sklearn.metrics,提供精准率、召回率、F1 值等多维度评估指标,验证模型性能。

二、实现流程

2.1 数据读取:加载好评 / 差评原始数据

        使用 “好评.txt” 和 “差评.txt” 数据集(每行一条评论),同时准备中文停用词表“StopwordsCN.txt”(包含的、了、吗等无实际情感意义的词汇)。使用 Pandas 的read_table读取文本文件,自动按行分割数据

import pandas as pd

# 读取差评、好评数据,编码为utf-8
cp_content = pd.read_table(r".\\差评.txt", encoding='utf-8')
yzpj_content = pd.read_table(r".\\好评.txt", encoding='utf-8')
# 读取停用词表,engine='python'解决文件读取编码问题
stopwords = pd.read_csv(r".\\StopwordsCN.txt", encoding='utf8', engine='python', index_col=False)

2.2 中文分词:将整句评论拆分为词汇

import jieba

# 定义分词函数(可选,简化重复代码)
def jieba_cut(data):
segments = []
# 提取评论列并转为列表
contents = data.content.values.tolist()
for content in contents:
# 精准分词,返回列表
results = jieba.lcut(content)
# 过滤分词后仅1个词汇的无效评论
if len(results) > 1:
segments.append(results)
# 转为DataFrame方便后续处理
return pd.DataFrame({'content': segments})

# 差评分词并保存
cp_fc_results = jieba_cut(cp_content)
cp_fc_results.to_excel('cp_fc_results.xlsx', index=False)
# 好评分词并保存
hp_fc_results = jieba_cut(yzpj_content)
hp_fc_results.to_excel('hp_fc_results.xlsx', index=False)

2.3 文本预处理:去除停用词

        停用词是指在文本中频繁出现,但无实际情感或语义价值的词汇(如 “的”“了”“我”“很” 等),这些词汇会干扰模型训练,必须去除。本次通过自定义函数实现停用词去除,核心逻辑是遍历分词后的词汇列表,过滤掉在停用词表中的词汇.

# 定义去除停用词函数
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()
hp_contents = hp_fc_results.content.values.tolist()
stopwords_list = stopwords.stopword.values.tolist()

# 去除停用词
cp_fc_contents_clean = drop_stopwords(cp_contents, stopwords_list)
hp_fc_contents_clean = drop_stopwords(hp_contents, stopwords_list)

2.4数据标注与合并:构建训练数据集

情感分析属于监督学习任务,需要为数据添加标签(label),本次定义:

  • 差评标签:1(代表负面情感)

  • 好评标签:0(代表正面情感)

将去除停用词后的差评、好评数据分别标注,再通过pd.concat合并为统一的训练数据集,为后续模型训练做准备

# 为差评、好评添加标签并构建DataFrame
cp_train = pd.DataFrame({'segments_clean': cp_fc_contents_clean, 'label': 1})
hp_train = pd.DataFrame({'segments_clean': hp_fc_contents_clean, 'label': 0})

# 合并差评、好评数据,形成完整训练集
pj_train = pd.concat([cp_train, hp_train], ignore_index=True)

ignore_index=True重置索引,避免合并后索引重复

2.5 数据集划分:训练集与测试集分离

为了验证模型的泛化能力(即对新数据的预测能力),需要将合并后的数据集划分为训练集(70%)和测试集(30%):

  • 训练集:用于训练模型,让模型学习 “词汇特征→情感标签” 的映射关系;

  • 测试集:用于评估模型性能,验证模型在未见过的数据上的分类效果。

使用 sklearn 的train_test_split实现随机划分,保证数据的随机性和代表性

from sklearn.model_selection import train_test_split

# 划分训练集和测试集,test_size=0.3表示30%为测试集
# random_state=0固定随机种子,保证实验可复现
x_train, x_test, y_train, y_test = train_test_split(
pj_train['segments_clean'].values,
pj_train['label'].values,
test_size=0.3,
random_state=0
)

2.6 文本向量化:将词汇列表转为词频矩阵

        机器学习模型只能处理数值型数据,而当前的文本数据是词汇列表格式,因此需要通过文本向量化将其转化为数值矩阵。本次使用 CountVectorizer,核心原理是构建词库,统计每个评论中词汇的出现频率。

2.6.1 向量化前的格式转换

        CountVectorizer 要求输入为字符串列表(每个元素是一条以空格分隔的词汇字符串),因此需要将词汇列表转为指定格式

# 训练集格式转换:词汇列表→空格分隔的字符串
train_words = []
for line in x_train:
train_words.append(' '.join(line))

# 测试集格式转换
test_words = []
for line in x_test:
test_words.append(' '.join(line))

2.6.2 构建词库并完成向量化

设置 CountVectorizer 关键参数,构建词库并将训练集、测试集转为词频矩阵

from sklearn.feature_extraction.text import CountVectorizer

# 初始化CountVectorizer
vec = CountVectorizer(
max_features=4000, # 只保留词频前4000的词汇,减少计算量
lowercase=False, # 不转换为小写(中文无大小写区分,关闭提升效率)
ngram_range=(1,3) # 提取1-3元词,兼顾单个词汇和词汇组合(如“很差”“非常差”)
)

# 基于训练集构建词库(关键:只使用训练集,避免数据泄露)
vec.fit(train_words)
# 训练集向量化
x_train_vec = vec.transform(train_words)
# 测试集向量化(使用训练集词库,保证一致性)
x_test_vec = vec.transform(test_words)

2.7 模型训练:基于朴素贝叶斯训练分类模型

朴素贝叶斯是文本分类的经典算法,其中 MultinomialNB(多项式朴素贝叶斯)。设置平滑系数alpha=0.1(避免出现概率为 0 的情况),训练模型

from sklearn.naive_bayes import MultinomialNB

# 初始化朴素贝叶斯分类器
classifier = MultinomialNB(alpha=0.1)
# 训练模型:传入训练集词频矩阵和对应标签
classifier.fit(x_train_vec, y_train)

2.8 模型评估

模型训练完成后,使用 sklearn 的classification_report生成精准率(precision)、召回率(recall)、F1 值(f1-score)等核心指标,全面验证模型效果

from sklearn import metrics

# 训练集预测
train_pr = classifier.predict(x_train_vec)
# 训练集评估,digits=6保留6位小数,提升精度
print("===== 训练集模型评估 =====")
print(metrics.classification_report(y_train, train_pr, digits=6))

# 测试集预测
test_pr = classifier.predict(x_test_vec)
# 测试集评估
print("\\n===== 测试集模型评估 =====")
print(metrics.classification_report(y_test, test_pr))

赞(0)
未经允许不得转载:网硕互联帮助中心 » 基于朴素贝叶斯的评论情感分析
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!