一、前期准备
-
数据处理: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))
网硕互联帮助中心

评论前必须登录!
注册