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

2024-09-02 02:20

本文主要是介绍机器学习:基于机器学习的中文评论情感分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

通过机器学习技术对中文评论进行情感分析。我们使用了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:continueline_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:continueline_clean.append(word)segments_clean.append(line_clean)return segments_cleancontents=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.chinasem.cn/article/1128726

相关文章

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

Spring中Bean有关NullPointerException异常的原因分析

《Spring中Bean有关NullPointerException异常的原因分析》在Spring中使用@Autowired注解注入的bean不能在静态上下文中访问,否则会导致NullPointerE... 目录Spring中Bean有关NullPointerException异常的原因问题描述解决方案总结

python中的与时间相关的模块应用场景分析

《python中的与时间相关的模块应用场景分析》本文介绍了Python中与时间相关的几个重要模块:`time`、`datetime`、`calendar`、`timeit`、`pytz`和`dateu... 目录1. time 模块2. datetime 模块3. calendar 模块4. timeit

python-nmap实现python利用nmap进行扫描分析

《python-nmap实现python利用nmap进行扫描分析》Nmap是一个非常用的网络/端口扫描工具,如果想将nmap集成进你的工具里,可以使用python-nmap这个python库,它提供了... 目录前言python-nmap的基本使用PortScanner扫描PortScannerAsync异

Oracle数据库执行计划的查看与分析技巧

《Oracle数据库执行计划的查看与分析技巧》在Oracle数据库中,执行计划能够帮助我们深入了解SQL语句在数据库内部的执行细节,进而优化查询性能、提升系统效率,执行计划是Oracle数据库优化器为... 目录一、什么是执行计划二、查看执行计划的方法(一)使用 EXPLAIN PLAN 命令(二)通过 S