自然语言处理NLP 04案例——苏宁易购优质评论与差评分析

news2025/2/25 23:22:45

  上一篇文章,我们爬取了苏宁易购平台某产品的优质评价和差评,今天我们对优质评价与差评进行分析

selenium爬取苏宁易购平台某产品的评论-CSDN博客

目录

1. 数据加载

2. 中文分词

3. 停用词处理

4. 数据标注与合并

5. 数据集划分

6. 文本特征提取

7. 模型训练与评估

MultinomialNB(多项式朴素贝叶斯)

ComplementNB(补充朴素贝叶斯)

BernoulliNB(伯努利朴素贝叶斯)

完整代码

运行结果

结果如何解读:


1. 数据加载

c_content = pd.read_table(r'.\差评(1).txt', encoding='gbk')
h_content = pd.read_table(r'.\优质评价.txt', encoding='gbk')
  • 功能:从本地读取两个文本文件,分别是差评数据 (差评(1).txt) 和优质评价数据 (优质评价.txt),并使用 gbk 编码加载为 Pandas DataFrame。

  • 说明pd.read_table 用于读取以制表符分隔的文本文件。

2. 中文分词

import jieba
c_segments = []
contents = c_content.content.values.tolist()
for content in contents:
    results = jieba.lcut(content)
    if len(results) > 1:
        c_segments.append(results)
  • 功能:对差评数据进行中文分词,使用 jieba.lcut 将每一条评论分割成词语列表。

  • 说明

    • jieba.lcut 是结巴分词库的函数,用于将中文句子切分为词语列表。

    • if len(results) > 1 过滤掉分词结果中长度小于等于 1 的无效数据。


c_f_results = pd.DataFrame({'content': c_segments})
c_f_results.to_excel('c_f_results.xlsx', index=False)
  • 功能:将分词后的差评数据保存到 Excel 文件 (c_f_results.xlsx) 中。

  • 说明pd.DataFrame 将分词结果转换为 DataFrame,to_excel 用于保存为 Excel 文件。


h_segments = []
contents = h_content.content.values.tolist()
for content in contents:
    results = jieba.lcut(content)
    if len(results) > 1:
        h_segments.append(results)
​
h_f_results = pd.DataFrame({'content': h_segments})
h_f_results.to_excel('h_f_results.xlsx', index=False)
  • 功能:对优质评价数据进行中文分词,并保存到 Excel 文件 (h_f_results.xlsx) 中。

  • 说明:与差评数据处理流程相同。

3. 停用词处理

stopwords = pd.read_csv(r'..\TF_IDF\StopwordsCN.txt', encoding='utf8', engine='python', index_col=False)
  • 功能:加载中文停用词表 (StopwordsCN.txt),用于过滤分词结果中的无意义词语。

  • 说明:停用词表是一个包含常见无意义词语(如“的”、“是”等)的文件。


def drop_stopwords(contents, stopwords):
    segments_clean = []
    for content in contents:
        line_clean = []
        for word in content:
            if word in stopwords:
                continue
            line_clean.append(word)
        segments_clean.append(line_clean)
    return segments_clean
  • 功能:定义一个函数 drop_stopwords,用于从分词结果中移除停用词。

  • 说明

    • 遍历每条分词结果,过滤掉停用词表中的词语。

    • 返回清理后的分词结果。


contents = c_f_results.content.values.tolist()
stopwords = stopwords.stopword.values.tolist()
c_f_contents_clean_s = drop_stopwords(contents, stopwords)
  • 功能:对差评分词结果进行停用词过滤。

  • 说明:调用 drop_stopwords 函数,清理差评数据中的停用词。


contents = h_f_results.content.values.tolist()
h_f_contents_clean_s = drop_stopwords(contents, stopwords)
  • 功能:对优质评价分词结果进行停用词过滤。

  • 说明:与差评数据处理流程相同。

4. 数据标注与合并

c_train = pd.DataFrame({'segments_clean': c_f_contents_clean_s, 'label': 1})
h_train = pd.DataFrame({'segments_clean': h_f_contents_clean_s, 'label': 0})
pj_train = pd.concat([c_train, h_train])
pj_train.to_excel('pj_train.xlsx', index=False)
  • 功能:将差评和优质评价数据合并,并为每条数据打上标签(差评为 1,优质评价为 0)。

  • 说明:

    label: 1 表示差评,label: 0 表示优质评价。

5. 数据集划分

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, test_size=0.2, random_state=48)
  • 功能:将数据集划分为训练集和测试集,测试集占 20%,训练集占 80%。

  • 说明

    • x_trainx_test 是分词后的文本数据。

    • y_trainy_test 是对应的标签数据。

    • random_state=48 确保每次划分的结果一致。


words = []
for line_index in range(len(x_train)):
    words.append(' '.join(x_train[line_index]))
  • 功能:将训练集的文本数据转换为以空格分隔的字符串列表。

  • 说明

    ' '.join(x_train[line_index]) 将分词列表拼接为一个字符串。


words2 = []
for line_index in range(len(x_test)):
    words2.append(' '.join(x_test[line_index]))
 
  • 功能:将测试集的文本数据转换为以空格分隔的字符串列表。

  • 说明:与训练集处理方式相同。


6. 文本特征提取

from sklearn.feature_extraction.text import CountVectorizer
vec = CountVectorizer(max_features=4000, lowercase=False, ngram_range=(1, 3))
vec.fit(words)
vec.fit(words2)
  • 功能:使用 CountVectorizer 将文本数据转换为特征向量。

  • 说明:

    • max_features=4000 限制特征向量的最大维度为 4000。

    • lowercase=False 不将文本转换为小写(适用于中文)。

    • ngram_range=(1, 3) 提取 1 元、2 元和 3 元语法特征。


7. 模型训练与评估

这里提供了三种贝叶斯模型供大家参考,在下面完整的代码中我将选择多项式朴素贝叶斯模型训练

MultinomialNB(多项式朴素贝叶斯)
from sklearn.naive_bayes import MultinomialNB
classifier = MultinomialNB(alpha=0.1)
classifier.fit(vec.transform(words), y_train)
train_pr = classifier.predict(vec.transform(words))
test_pr = classifier.predict(vec.transform(words2))
​
from sklearn import metrics
print(metrics.classification_report(y_train, train_pr))
print(metrics.classification_report(y_test, test_pr))
  • 功能:使用多项式朴素贝叶斯模型进行训练和预测,并输出分类报告。

  • 说明:

    • alpha=0.1 是平滑参数,用于防止概率为零的情况。

    • metrics.classification_report 输出模型的精确率、召回率和 F1 分数。


ComplementNB(补充朴素贝叶斯)
from sklearn.naive_bayes import ComplementNB
classifier = ComplementNB(alpha=0.1)
classifier.fit(vec.transform(words), y_train)
train_pr = classifier.predict(vec.transform(words))
test_pr = classifier.predict(vec.transform(words2))
​
from sklearn import metrics
print(metrics.classification_report(y_train, train_pr))
print(metrics.classification_report(y_test, test_pr))
  • 功能:使用补充朴素贝叶斯模型进行训练和预测,并输出分类报告。

  • 说明:补充朴素贝叶斯适用于不平衡数据集。


BernoulliNB(伯努利朴素贝叶斯)
from sklearn.naive_bayes import BernoulliNB
classifier = BernoulliNB(alpha=0.1)
classifier.fit(vec.transform(words), y_train)
train_pr = classifier.predict(vec.transform(words))
test_pr = classifier.predict(vec.transform(words2))
​
from sklearn import metrics
print(metrics.classification_report(y_train, train_pr))
print(metrics.classification_report(y_test, test_pr))
  • 功能:使用伯努利朴素贝叶斯模型进行训练和预测,并输出分类报告。

  • 说明:伯努利朴素贝叶斯适用于二值特征数据。

完整代码

import pandas as pd
​
c_content=pd.read_table(r'.\差评(1).txt',encoding='gbk')
h_content=pd.read_table(r'.\优质评价.txt',encoding='gbk')
​
import jieba
c_segments=[]
contents=c_content.content.values.tolist()
for content in contents:
    results=jieba.lcut(content)
    if len(results)>1:
        c_segments.append(results)
​
c_f_results=pd.DataFrame({'content':c_segments})
c_f_results.to_excel('c_f_results.xlsx',index=False)
​
h_segments=[]
contents=h_content.content.values.tolist()
for content in contents:
    results=jieba.lcut(content)
    if len(results)>1:
        h_segments.append(results)
​
h_f_results=pd.DataFrame({'content':h_segments})
h_f_results.to_excel('h_f_results.xlsx',index=False)
​
stopwords=pd.read_csv(r'..\TF_IDF\StopwordsCN.txt',
                      encoding='utf8',engine='python',index_col=False)
def drop_stopwords(contents,stopwords):
    segments_clean=[]
    for content in contents:
        line_clean=[]
        for word in content:
            if word in stopwords:
                continue
            line_clean.append(word)
        segments_clean.append(line_clean)
    return segments_clean
contents=c_f_results.content.values.tolist()
stopwords=stopwords.stopword.values.tolist()
c_f_contents_clean_s=drop_stopwords(contents,stopwords)
​
contents=h_f_results.content.values.tolist()
# stopwords=stopwords.stopword.values.tolist()
h_f_contents_clean_s=drop_stopwords(contents,stopwords)
​
c_train=pd.DataFrame({'segments_clean':c_f_contents_clean_s,'label':1})
h_train=pd.DataFrame({'segments_clean':h_f_contents_clean_s,'label':0})
pj_train=pd.concat([c_train,h_train])
pj_train.to_excel('pj_train.xlsx',index=False)
​
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,test_size=0.2,random_state=48)
words=[]
for line_index in range(len(x_train)):
    words.append(' '.join(x_train[line_index]))
# print(words)
​
words2=[]
for line_index in range(len(x_test)):
    words2.append(' '.join(x_test[line_index]))
​
from sklearn.feature_extraction.text import CountVectorizer
vec=CountVectorizer(max_features=4000,lowercase=False,ngram_range=(1,3))
vec.fit(words)
vec.fit(words2)
​
print('MultinomialNB')
from sklearn.naive_bayes import MultinomialNB
classifier=MultinomialNB(alpha=0.1)
classifier.fit(vec.transform(words),y_train)
train_pr=classifier.predict(vec.transform(words))
test_pr=classifier.predict(vec.transform(words2))
​
from sklearn import  metrics
print(metrics.classification_report(y_train,train_pr))
print(metrics.classification_report(y_test,test_pr))

运行结果

结果如何解读

在代码中,每个模型训练后都会输出一个分类报告,使用 metrics.classification_report 生成。分类报告包括以下指标:

  • 精确率 (Precision):预测为正类的样本中,实际为正类的比例。

  • 召回率 (Recall):实际为正类的样本中,预测为正类的比例。

  • F1 分数 (F1-Score):精确率和召回率的加权平均值,综合衡量模型的性能。

  • 支持数 (Support):每个类别的样本数量。

在我们的运行结果中

  • 类别 0:表示好评的指标。

  • 类别 1:表示差评的指标。

  • accuracy:模型整体的准确率。

  • macro avg:各类别指标的平均值。

  • weighted avg:按样本数量加权的各类别指标平均值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2306063.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图片爬取案例

修改前的代码 但是总显示“失败” 原因是 修改之后的代码 import requests import os from urllib.parse import unquote# 原始URL url https://cn.bing.com/images/search?viewdetailV2&ccidTnImuvQ0&id5AE65CE4BE05EE7A79A73EEFA37578E87AE19421&thidOIP.TnI…

官方文档学习TArray容器

一.TArray中的元素相等 1.重载一下 元素中的 运算符,有时需要重载排序。接下来,我们将id 作为判断结构体的标识。 定义结构体 USTRUCT() struct FXGEqualStructInfo {GENERATED_USTRUCT_BODY() public:FXGEqualStructInfo(){};FXGEqualStructInfo(in…

Web刷题之PolarDN(中等)

1.到底给不给flag呢 代码审计 一道典型的php变量覆盖漏洞 相关知识 什么是变量覆盖漏洞 自定义的参数值替换原有变量值的情况称为变量覆盖漏洞 经常导致变量覆盖漏洞场景有:$$使用不当,extract()函数使用不当,parse_str()函数使用不当&…

学习笔记-250222

论文: Learning Hierarchical Prompt with Structured Linguistic Knowledge for Vision-Language Models 主要研究llm在图像分类中的能力,当提示输入目标类别时,llm能够生成相关的描述以及相应的结构化关系。 1.首先利用llm从普通的描述中获…

Unity游戏制作中的C#基础(1)界面操作基础

1.脚本有关注意事项 (1).进入项目之后,一般创建一个文件夹Scripts用来存放c#脚本; (2).在Scripts中创建脚本,双击脚本,进入VS编辑器,有如下结构: start&#…

为什么要将PDF转换为CSV?CSV是Excel吗?

在企业和数据管理的日常工作中,PDF文件和CSV文件承担着各自的任务。PDF通常用于传输和展示静态的文档,而CSV因其简洁、易操作的特性,广泛应用于数据存储和交换。如果需要从PDF中提取、分析或处理数据,转换为CSV格式可能是一个高效…

Android KMP初探

Android KMP初探 前言: 最近线上听了Kotlin官网举行的KMP会议,感觉听神奇的,于是就把官方demo下载下来尝试了一下,下载插件和所需要的依赖都用了很久,但是发现里面的代码很少,于是尝试自己手写了一下&…

网络安全之Web后端PHP

目录 一、PHP基础语法 1.PHP基础 (1)php的优点 (2)PhpStorm的优点 2.PHP基本语法 3.PHP变量 4.PHP运算符 二、PHP流控与数组 1.php流程控制语句以及循环 (1)if 语句 (2)if…

Redis——用户签到BitMap,UV统计

目录 BitMap 使用场景 1. 用户签到系统 2. 用户行为标记 3. 布隆过滤器(Bloom Filter) BitMap介绍 Redis中的使用 Redis功能示例 添加: 获取: 批量获取: java中实现 统计本月连续签到次数 UV统计 UV 统计…

pycharm技巧--鼠标滚轮放大或缩小 Pycharm 字体大小

1、鼠标滚轮调整字体 设置 Ctrl 鼠标滚轮调整字体大小 备注: 第一个是活动窗口,即缩放当前窗口 第二个是所有编辑器窗口,即缩放所有窗口的字体 2、插件 汉化包: Chinese Simplified 包

数字信任的底层逻辑:密码学核心技术与现实应用

安全和密码学 --The Missing Semester of Your CS Education 目录 熵与密码强度密码散列函数密钥体系 3.1 对称加密 3.2 非对称加密信任模型对比典型应用案例安全实践建议扩展练习杂项 密码学是构建数字信任的基石。 本文浅析密码学在现实工具中的应用,涵盖 1&…

全面理解-深拷贝与浅拷贝

在 C 中,深拷贝(Deep Copy) 和 浅拷贝(Shallow Copy) 是两种完全不同的对象拷贝策略,主要区别在于对指针和动态分配资源的处理方式。正确理解二者的区别是避免内存泄漏、悬空指针和程序崩溃的关键。 一、核…

Redis分布式锁故障处理:当Redis不可用时的应对策略

Redis分布式锁故障处理:当Redis不可用时的应对策略 在分布式系统中,Redis因其高性能和丰富的特性常被用于实现分布式锁。但当加锁过程中Redis服务不可用时,系统将面临严重挑战。本文将深入探讨这一问题,并提供多维度解决方案。 目…

WordPress平台如何接入Deepseek,有效提升网站流量

深夜改代码到崩溃?《2024全球CMS生态报告》揭露:78%的WordPress站长因API对接复杂,错失AI内容红利。本文实测「零代码接入Deepseek」的保姆级方案,配合147SEO的智能发布系统,让你用3个步骤实现日均50篇EEAT合规内容自动…

ROS ur10机械臂添加140夹爪全流程记录

ROS ur10机械臂添加140夹爪 系统版本:Ubuntu20.04 Ros版本:noetic Moveit版本:moveit-noetic 参考博客: ur3robotiq ft sensorrobotiq 2f 140配置rviz仿真环境_有末端力传感器的仿真环境-CSDN博客 UR5机械臂仿真实例&#xf…

FFMPEG编码容错处理解决办法之途径----升级库文件

在qt开发环境下接收网络数据,调用ffmpeg解码播放视频,出现闪屏现象,具体现象可以使用操作系统自带的ffplay播放器播放原始视频流可复现;而使用操作系统自带的mpv播放器播放视频则不会出现闪屏;闪屏时会报Could not fin…

uniapp h5端和app端 使用 turn.js

前提:添加页后,添加页与当前页会重叠在一起,不知道为什么,没有找到解决办法 1.h5端 <template><view class"container"><view id"flipbook"><view class"page page1">Page 1</view><view class"page pag…

【入门音视频】音视频基础知识

&#x1f308;前言&#x1f308; 这个系列在我学习过程中&#xff0c;对音视频知识归纳总结的笔记。因为音视频相关讲解非常稀少&#xff0c;所以我希望通过这个音视频系列&#xff0c;跟大家一起学习音视频&#xff0c;希望减少初学者在学习上的压力。同时希望也欢迎指出文章的…

数据结构☞泛型

一.基础定义与应用方向 1.定义&#xff1a; 一般的类和方法&#xff0c;只能使用具体的类型 : 要么是基本类型&#xff0c;要么是自定义的类。如果要编写可以 应用于多种类型 的代码&#xff0c;这种刻板的限制对代码的束缚就会很大。----- 来源《 Java 编程思想》对泛型的介…

hot100-二叉树

二叉树 二叉树递归 相当于这个的顺序来回调换 class Solution {private List<Integer> res new ArrayList<>();public List<Integer> inorderTraversal(TreeNode root) {if(root null)return res;inorderTraversal(root.left);res.add(root.val);inorde…