目录

一、项目背景

二、环境准备

三、核心知识点前置讲解

CountVectorizer 功能演示

四、完整情感分析实战流程

1. 数据准备

2. 读取评论数据

3. 中文分词(jieba)

4. 移除停用词

5. 构建训练数据集

6. 数据集划分

7. 文本向量化

8. 朴素贝叶斯模型训练

9. 模型评估

10. 自定义文本预测

五、代码优化与总结

1. 优化建议

2. 项目总结

六、完整代码获取


一、项目背景

在电商、评论分析等场景中,情感分析是核心应用之一,通过算法自动识别文本的情感倾向(好评 / 差评),能快速完成海量评论的分类统计,替代人工低效审核。

本文将使用 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. 数据准备

  1. 准备两个文本文件:好评.txt差评.txt,编码为 UTF-8
  2. 准备中文停用词表:StopwordsCN.txt(包含的、了、吗、呢等无意义词汇)
  3. 数据格式:每行一条评论,包含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. 优化建议

  1. 扩充停用词表,提升过滤效果
  2. 调整max_featuresalpha参数,优化模型精度
  3. 可替换为TfidfVectorizer,效果通常优于 CountVectorizer
  4. 增加数据量,提升模型泛化能力

2. 项目总结

本文完整实现了中文情感分析全流程,核心步骤:

  1. 数据读取 → jieba 分词 → 停用词过滤
  2. 文本向量化 → 数据集划分
  3. 朴素贝叶斯训练 → 模型评估 → 自定义预测

代码简洁易懂,适合 NLP 入门学习,也可直接应用于电商评论、舆情分析等实际场景。

六、完整代码获取

本文所有代码可直接复制运行,只需替换数据文件路径即可。如果对你有帮助,欢迎点赞、收藏、关注~

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐