机器学习:基于机器学习的中文评论情感分析

news2024/11/16 3:51:58

通过机器学习技术对中文评论进行情感分析。我们使用了jieba进行中文分词,移除了停用词,并利用词袋模型(Bag of Words)和多项式朴素贝叶斯分类器对评论进行了情感分类。实验结果表明,该模型在测试集上达到了较高的准确率。

1.数据收集

我们收集了两组中文评论数据,分别代表正面(cp)和负面(hp)情感。

import pandas as pd
cp=pd.read_table(r"./评论/cp.txt",encoding='utf-8')
hp=pd.read_table(r"./评论/hp.txt",encoding='utf-8')

2.使用jieba进行中文分词。将分词结果转换为DataFrame,并保存为Excel文件。

import jieba


# 初始化用于存储负面评论分词结果的列表
cp_segments=[]

# 将负面评论内容转换成列表形式
contents=cp.content.values.tolist()
for content in contents:
# 对每个内容字符串使用 jieba.lcut 方法进行分词
    results=jieba.lcut(content)
# 如果分词结果大于1个,则添加到列表中
    if len(results)>1:
        cp_segments.append(results)
# 将正面评论的分词结果列表转换成DataFrame
cp_fc_results=pd.DataFrame({'content':cp_segments})
# 将DataFrame保存为Excel文件,不保存索引
cp_fc_results.to_excel('cp_fc_results.xlsx',index=False)

# 初始化用于存储正面评论分词结果的列表
hp_segments=[]
contents=hp.content.values.tolist()
for content in contents:
    results=jieba.lcut(content)
    if len(results)>1:
        hp_segments.append(results)
hp_fc_results=pd.DataFrame({'content':hp_segments})
hp_fc_results.to_excel('hp_fc_results.xlsx',index=False)

3.移除停用词,以减少数据的噪声。


# 读取停用词
stopwords = pd.read_csv(r"./StopwordsCN.txt", encoding='utf-8', 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 = cp_fc_results.content.values.tolist()
stopwords_list = stopwords.stopword.values.tolist()
cp_fc_clean_s = drop_stopwords(contents, stopwords_list)

# 移除负面评论的停用词
contents = hp_fc_results.content.values.tolist()
hp_fc_clean_s = drop_stopwords(contents, stopwords_list)

4.使用词袋模型(Bag of Words)将文本数据转换为数值向量

# 创建训练数据集
cp_train = pd.DataFrame({'segments_clean': cp_fc_clean_s, 'label': 1})
hp_train = pd.DataFrame({'segments_clean': hp_fc_clean_s, 'label': 0})
pj_train = pd.concat([cp_train, hp_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, random_state=0)

# 将训练集转换为字符串格式
words=[]
for line_index in range(len(x_train)):
    words.append(' '.join(x_train[line_index]))
print(words)

# 使用词袋模型进行特征提取
from sklearn.feature_extraction.text import CountVectorizer
vec = CountVectorizer(max_features=4000, lowercase=False, ngram_range=(1, 1))
vec.fit(words)

5.采用多项式朴素贝叶斯分类器进行模型训练。

# 训练多项式朴素贝叶斯分类器
from sklearn.naive_bayes import MultinomialNB
classifier = MultinomialNB(alpha=0.1)
classifier.fit(vec.transform(words), y_train)
predict_train = classifier.predict(vec.transform(words))

6.使用准确率、召回率和F1分数等指标来评估模型的性能。

# 打印训练集上的分类报告
from sklearn import metrics
print(metrics.classification_report(y_train,predict_train))

test_words=[]
# 遍历测试集,将每个样本的分词结果转换为字符串格式
for line_index in range(len(x_test)):
    test_words.append(' '.join(x_test[line_index]))
predict_test=classifier.predict(vec.transform(test_words))
print(metrics.classification_report(y_test,predict_test))

7.识别评论

s='这个玩意真好,我很喜欢'
a=[]
# 使用jieba进行分词
a0=jieba.lcut(s)
if len(a0)>1:
    a.append(a0)
# 将分词结果转换为DataFrame
a1=pd.DataFrame({'content':a},)
# 获取分词结果列表
a2=a1.content.values.tolist()
# 移除停用词
a1_clean_s=drop_stopwords(a1,stopwords)

# 将清理后的分词结果转换为字符串格式,以符合模型预测的输入要求
word_1=[]
for line_index in range(len(a1_clean_s)):
    word_1.append(' '.join(a1_clean_s[line_index]))

# 使用分类器进行预测
predict_word_1=classifier=classifier.predict(vec.transform(word_1))
print(predict_word_1)

8.输出结果

9.完整代码

import pandas as pd
cp=pd.read_table(r"./评论/2.txt",encoding='utf-8')
hp=pd.read_table(r"./评论/3.txt",encoding='utf-8')

import jieba
cp_segments=[]
#将内容转换成列表形式
contents=cp.content.values.tolist()
for content in contents:
#对每个内容字符串使用 jieba.lcut 方法进行分词,该方法返回一个列表,包含分词后的结果。
    results=jieba.lcut(content)
    if len(results)>1:
        cp_segments.append(results)
#将列表转换成DataFrame
cp_fc_results=pd.DataFrame({'content':cp_segments})
cp_fc_results.to_excel('cp_fc_results.xlsx',index=False)

hp_segments=[]
contents=hp.content.values.tolist()
for content in contents:
    results=jieba.lcut(content)
    if len(results)>1:
        hp_segments.append(results)
hp_fc_results=pd.DataFrame({'content':hp_segments})
hp_fc_results.to_excel('hp_fc_results.xlsx',index=False)

# 定义函数,用于移除停用词
stopwords=pd.read_csv(r".\StopwordsCN.txt",encoding='utf-8',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=cp_fc_results.content.values.tolist()
stopwords=stopwords.stopword.values.tolist()
cp_fc_clean_s=drop_stopwords(contents,stopwords)

contents=hp_fc_results.content.values.tolist()
hp_fc_clean_s=drop_stopwords(contents,stopwords)


cp_train=pd.DataFrame({'segments_clean':cp_fc_clean_s,'label':1})
hp_train=pd.DataFrame({'segments_clean':hp_fc_clean_s,'label':0})
pj_train=pd.concat([cp_train,hp_train])
pj_train.to_excel('pj_trian.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,random_state=0)

words=[]
for line_index in range(len(x_train)):
    words.append(' '.join(x_train[line_index]))
print(words)

from sklearn.feature_extraction.text import CountVectorizer
vec=CountVectorizer(max_features=4000,lowercase=False,ngram_range=(1,1))
vec.fit(words)

from sklearn.naive_bayes import MultinomialNB
classifier=MultinomialNB(alpha=0.1)
classifier.fit(vec.transform(words),y_train)
predict_train=classifier.predict(vec.transform(words))

from sklearn import metrics
print(metrics.classification_report(y_train,predict_train))

test_words=[]
for line_index in range(len(x_test)):
    test_words.append(' '.join(x_test[line_index]))
predict_test=classifier.predict(vec.transform(test_words))
print(metrics.classification_report(y_test,predict_test))

s='这个玩意真好,我很喜欢'
a=[]
a0=jieba.lcut(s)
if len(a0)>1:
    a.append(a0)
a1=pd.DataFrame({'content':a},)

a2=a1.content.values.tolist()
a1_clean_s=drop_stopwords(a1,stopwords)

word_1=[]
for line_index in range(len(a1_clean_s)):
    word_1.append(' '.join(a1_clean_s[line_index]))
predict_word_1=classifier.predict(vec.transform(word_1))

print(predict_word_1)

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

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

相关文章

如何构建高效的中药材进存销管理系统?——运用Java SpringBoot和Vue实现库存实时监控,简化销售流程,提升药材管理效率。

🍊作者:计算机毕设匠心工作室 🍊简介:毕业后就一直专业从事计算机软件程序开发,至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长:按照需求定制化开发项目…

前端宝典二十一:前端异步编程规范手写Promise、async、await

本文主要探讨前端异步编程的处理方式、处理场景,并且手写Promise的全家桶,介绍async、await方法使用 一、异步处理方式有: 1. 回调函数 function fetchDate(callback) {setTimeout(() > {const date new Date();callback(date);}, 100…

SpringSecurity Oauth2 - 密码模式完成身份认证获取令牌 [自定义UserDetailsService]

文章目录 1. 授权服务器2. 授权类型1. Password (密码模式)2. Refresh Token(刷新令牌)3. Client Credentials(客户端凭证模式) 3. AuthorizationServerConfigurerAdapter4. 自定义 TokenStore 管理令牌1. TokenStore 的作用2. Cu…

嵌入式Linux C应用编程指南-高级I/O(速记版)

第十三章 高级I/O 13.1 非阻塞I/O 阻塞其实就是进入了休眠状态,交出了 CPU 控制权。比如 wait()、pause()、sleep()等函数都会进入阻塞。 阻塞式 I/O 顾名思义就是对文件的 I/O 操作(读写操作)是阻塞式的,非阻塞式 I/O 同理就是对…

SpringSecurity Oauth2 - 访问令牌续期

文章目录 1. 访问令牌的续期2. CustomUserDetailsService3. 配置 AuthorizationServerEndpointsConfigurer4. 测试项目 1. 访问令牌的续期 在Spring Security OAuth2中,访问令牌的续期通常是通过使用**刷新令牌(Refresh Token)**来实现的。当…

走进酒厂,探寻白酒酿造的奥秘

在华夏大地深处,隐藏着一座座充满神秘色彩的酒厂,它们是白酒酿造的地方,也是中华酒文化的摇篮。今天,就让我们一起走进这些酒厂,探寻白酒酿造的奥秘,感受豪迈白酒(HOMANLISM)的不同魅…

当网络适配器的Wireless出现感叹号

1.出现如下情况 链接: :一招搞定Intel(R) Wireless-AC 9560显示感叹号,无法打开wifi模块!_intel(r)wireless-ac9560感叹号-CSDN博客z 重点: 原因是因为电脑静电的问题。

昇腾AI处理器的计算核心 - AI Core即DaVinci Core

昇腾AI处理器的计算核心 - AI Core即DaVinci Core flyfish 从一段代码的解释开始 template <typename T> class GlobalTensor { public:void setGlobalBuffer(T* buffer, uint32_t buffersize) {// 在这里实现设置全局缓冲区的逻辑} };语法的说明&#xff0c;主要用于…

封装_私有类字段和方法

前言 在 JavaScript 中&#xff0c;封装、私有类字段和方法是面向对象编程的一种重要特性。它们允许你将数据&#xff08;属性&#xff09;和对数据的操作&#xff08;方法&#xff09;组合在一起&#xff0c;并控制访问权限&#xff0c;从而提高代码的安全性和可维护性。私有…

异步编程详解

1.什么是async std::async:是一个函数模板,用于启动一个异步任务。它接受一个可调用的对象(如函数、Lambda表达式、函数对象)作为参数,并在一个单独的线程上异步执行对象。std::async自动管理异步任务的生命周期,并返回一个std::future对象,该对象用于获取异步操作的结果。 2.什…

【Java】—— Java面向对象进阶:继承小练习-Java中实现圆柱体类及其体积计算

目录 1. 定义圆类&#xff08;Circle&#xff09; 2. 定义圆柱体类&#xff08;Cylinder&#xff09; 3. 测试圆柱体类 4. 总结 在Java中&#xff0c;我们可以通过面向对象的方式来模拟现实世界中的物体&#xff0c;比如圆柱体。本篇文章将通过一个简单的示例来展示如何定义…

全国大学生数学建模竞赛系统使用手册

注意&#xff01;国赛是学校统一报名&#xff0c;所以如果在操作上有任何不清楚的地方&#xff0c;一定要在赛前即使询问自己学校组织数模的老师&#xff01;并详细阅读本文和官网通知&#xff0c;以及&#xff1a;数模国赛提交MD5码和论文的坑&#xff01; 数模比赛的建模手、…

【Python报错已解决】“ModuleNotFoundError: No module named ‘timm‘”

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言&#xff1a;一、问题描述1.1 报错示例&#xff1a;当我们尝试导入timm库时&#xff0c;可能会看到以下错误信息。…

颠覆传统:基于全文索引驱动下的高效一对多表结构设计!

首发公众号&#xff1a;赵侠客 引言 在数据库表结构设计中&#xff0c;一对多&#xff08;1:N&#xff09;关系的处理是非常常见需求&#xff0c;如一个用户有多个分类或角色。传统关系型数据库表设计方式通常要包括三张表&#xff1a;用户表、分类表、以及用户与分类之间的关…

LC开源电路的学习(一)

TI的升压芯片&#xff0c;电压虽然能升高&#xff0c;但是带来的问题就是最大电流大幅降低&#xff1a; CC1和CC2芯片接快充芯片之后&#xff0c;直接接到单片机的下载口&#xff1a; 这个有点意思&#xff0c;用导线换电阻&#xff1a; 、 PD快充芯片CH224K需要连接typeC的D…

华为云征文|基于Flexus云服务器X实例的应用场景-部署脚手架开源项目若依

&#x1f534;大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 先看这里 写在前面**Flexus X实例**的云服务器简介环境准备若依项目拉取导入数据库启动本地项目&#xff08;后端&#xff09;启动本地项目&#xff08;前端&#xff09;打包后…

图片转为PDF怎么弄?看这里,三款软件助你一键转换!

嘿&#xff0c;朋友们&#xff01;现在信息这么多&#xff0c;图片在我们学习、工作、生活中帮了大忙。但有时候&#xff0c;我们想把图片整理好、分享给别人或者打印出来&#xff0c;PDF格式就特别合适。PDF文件不管在哪儿打开&#xff0c;内容都不会变样&#xff0c;还能加密…

Pandas 9-绘制柱状图

1. 准备数据 首先&#xff0c;需要准备一个DataFrame。 import pandas as pd # 创建一个DataFrame data { Name: [Alice, Bob, Charlie, David], Age: [24, 27, 22, 32], City: [New York, Los Angeles, Chicago, Houston], Score: [85, 92, 78, 88]} df pd.…

【生成模型系列(初级)】自编码器——深度学习的数据压缩与重构

【通俗理解】自编码器——深度学习的数据压缩与重构 第一节&#xff1a;自编码器的类比与核心概念 1.1 自编码器的类比 你可以把自编码器想象成一个“智能压缩机”&#xff0c;它能够把输入的数据&#xff08;比如图片&#xff09;压缩成一个更小的表示&#xff08;编码&#…

超声波模块

HCSR04超声波模块是一种常用的测距模块&#xff0c;它通过检测超声波发射后遇到障碍物所反射的回波&#xff0c;从而测量出与障碍物之间的距离。以下是对HCSR04超声波模块的详细讲解&#xff1a; 一、模块组成与工作原理 组成&#xff1a;HCSR04超声波模块主要由两个压电陶瓷超…