【干货】--基于Python的文本情感分类

2018 年 1 月 5 日 R语言中文社区 每天进步一点点


作者:刘顺祥

个人微信公众号:每天进步一点点2015


往期回顾:

【干货】--手把手教你完成文本情感分类

聊聊我的R语言学习路径和感受


前言


      在上一期【干货】--手把手教你完成文本情感分类中我们使用了R语言对酒店评论数据做了情感分类,基于网友的需求,这里再使用Python做一下复现。关于步骤、理论部分这里就不再赘述了,感兴趣的可以前往上面提到的文章查看。下面给出Python的具体代码。

Python代码


# 导入第三包
import jieba
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import GaussianNB
from sklearn.ensemble import RandomForestClassifier
from sklearn.cross_validation import train_test_split
from sklearn import metrics
import pandas as pd
import matplotlib.pyplot as plt

# 读入评论数据
evaluation = pd.read_excel('Hotel Evaluation.xlsx',sheetname=1)
# 展示数据前5行
evaluation.head()


# 读入自定义词
with open('all_words.txt', encoding='UTF-8') as words:
   my_words = [i.strip() for i in words.readlines()]

# 将自定义词加入到jieba分词器中
for word in my_words:
   jieba.add_word(word)

# 读入停止词
with open('mystopwords.txt', encoding='UTF-8') as words:
   stop_words = [i.strip() for i in words.readlines()]

# 基于切词函数,构造自定义函数
def cut_word(sentence):
   words = [i for i in jieba.cut(sentence) if i not in stop_words]
   # 切完的词用空格隔开
   result = ' '.join(words)
   return(result)

上面代码所做的工作是将用户自定义词设置到jieba分词器中,同时,构造切词的自定义函数,添加的附加功能是删除停用词

# TFIDF权重(根据词频,选出高频的20个词)
tfidf = TfidfVectorizer(max_features=20)

# 文档词条矩阵
dtm = tfidf.fit_transform(words).toarray()
# 矩阵的列名称
columns = tfidf.get_feature_names()
# 将矩阵转换为数据框--即X变量
X = pd.DataFrame(dtm, columns=columns)
# 情感标签变量
y = evaluation.Emotion

# 将数据集拆分为训练集和测试集
X_train,X_test,y_train,y_test = train_test_split(X,y,train_size = 0.8, random_state=1)

使用TFIDF权重构造文档词条矩阵,注意,这里根据词频选择了最高频的20个词,作为矩阵的列数。

# 朴素贝叶斯模型
nb = GaussianNB()
# 建模
fit = nb.fit(X_train,y_train)
# 预测
pred = fit.predict(X_test)

# 测试集上的准确率
accuracy = metrics.accuracy_score(y_test,pred)
print(accuracy)


通过构建朴素贝叶斯模型,得到的样本测试集准确率约为70%。

# 模型优度的可视化展现
fpr, tpr, _ = metrics.roc_curve(y_test, pred,pos_label=2)
auc = metrics.auc(fpr, tpr)

# 中文和负号的正常显示
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
# 设置绘图风格
plt.style.use('ggplot')

# 绘制ROC曲线
plt.plot(fpr, tpr,'')
# 绘制参考线
plt.plot((0,1),(0,1),'r--')
# 添加文本注释
plt.text(0.5,0.5,'ROC=%.2f' %auc)
# 设置坐标轴标签和标题
plt.title('朴素贝叶斯模型的AUC曲线')
plt.xlabel(
'1-specificity')
plt.ylabel(
'Sensitivity')

# 去除图形顶部边界和右边界的刻度
plt.tick_params(top='off', right='off')
# 图形显示
plt.show()


# 随机森林模型
rf = RandomForestClassifier()
# 建模
fit2 = rf.fit(X_train,y_train)
# 预测
pred2 = fit2.predict(X_test)
# 测试集上的准确率
accuracy2 = metrics.accuracy_score(y_test,pred2)
print(accuracy2)


# 模型优度的可视化展现
fpr2, tpr2, _ = metrics.roc_curve(y_test, pred2,pos_label=2)
auc2 = metrics.auc(fpr2, tpr2)

# 中文和负号的正常显示
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
# 设置绘图风格
plt.style.use('ggplot')

# 绘制ROC曲线
plt.plot(fpr2, tpr2,'')
# 绘制参考线
plt.plot((0,1),(0,1),'r--')
# 添加文本注释
plt.text(0.5,0.5,'ROC=%.2f' %auc2)
# 设置坐标轴标签和标题
plt.title('随机森林模型的AUC曲线')
plt.xlabel('1-specificity')
plt.ylabel('Sensitivity')

# 去除图形顶部边界和右边界的刻度
plt.tick_params(top='off', right='off')
# 图形显示
plt.show()


结语


      OK,关于使用Python完成情感分类的实战我们就分享到这里,大家注意,上面的方法是通过构造DFIDF权重的文档词条矩阵(词袋法)。如果你的文本非常大的话,使用这种方法会导致“词汇鸿沟”,即形成非常庞大的矩阵(而且还是稀疏矩阵),就会吃掉电脑的很多内存。而且这种方法还不能考虑到词与词之间的逻辑顺序。为了克服这个问题,科学家想出了词向量、文档向量等方法,后期我也会把这部分内容的理论和实战给大家做一个分享。如果你有任何问题,欢迎在公众号的留言区域表达你的疑问。同时,也欢迎各位朋友继续转发与分享文中的内容,让更多的人学习和进步。


往期精彩内容整理合集:

R语言中文社区历史文章整理(作者篇)

R语言中文社区历史文章整理(类型篇)


公众号后台回复关键字即可学习

回复 R              R语言快速入门免费视频 
回复 统计          统计方法及其在R中的实现
回复 用户画像   民生银行客户画像搭建与应用 
回复 大数据      大数据系列免费视频教程
回复 可视化      利用R语言做数据可视化
回复 数据挖掘   数据挖掘算法原理解释与应用
回复 机器学习   R&Python机器学习入门 

登录查看更多
5

相关内容

情感分类是对带有感情色彩的主观性文本进行分析、推理的过程,即分析对说话人的态度,倾向正面,还是反面。它与传统的文本主题分类又不相同,传统主题分类是分析文本讨论的客观内容,而情感分类是要从文本中得到它是否支持某种观点的信息。
【2020新书】实战R语言4,323页pdf
专知会员服务
100+阅读 · 2020年7月1日
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
194+阅读 · 2020年6月29日
【2020新书】从Excel中学习数据挖掘,223页pdf
专知会员服务
90+阅读 · 2020年6月28日
Python导论,476页pdf,现代Python计算
专知会员服务
260+阅读 · 2020年5月17日
【ACL2020-复旦大学NLP】异构图神经网络的文档摘要提取
专知会员服务
34+阅读 · 2020年5月1日
【干货书】机器学习Python实战教程,366页pdf
专知会员服务
340+阅读 · 2020年3月17日
Transformer文本分类代码
专知会员服务
116+阅读 · 2020年2月3日
【干货】用BRET进行多标签文本分类(附代码)
专知会员服务
84+阅读 · 2019年12月27日
盘一盘 Python 系列 8 - Sklearn
平均机器
5+阅读 · 2019年5月30日
文本分析与可视化
Python程序员
9+阅读 · 2019年2月28日
实战 | 用Python做图像处理(三)
七月在线实验室
15+阅读 · 2018年5月29日
文本挖掘中特征选择(附python实现)
七月在线实验室
4+阅读 · 2018年5月22日
[机器学习] 用KNN识别MNIST手写字符实战
机器学习和数学
4+阅读 · 2018年5月13日
在Python中使用SpaCy进行文本分类
专知
24+阅读 · 2018年5月8日
【干货】基于Keras的注意力机制实战
专知
59+阅读 · 2018年5月4日
文本挖掘之特征选择(python 实现)
数据挖掘入门与实战
4+阅读 · 2017年7月19日
NLP自然语言处理(二)——基础文本分析
乐享数据DataScientists
12+阅读 · 2017年2月7日
Neural Approaches to Conversational AI
Arxiv
8+阅读 · 2018年12月13日
Arxiv
3+阅读 · 2018年11月29日
VIP会员
相关VIP内容
【2020新书】实战R语言4,323页pdf
专知会员服务
100+阅读 · 2020年7月1日
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
194+阅读 · 2020年6月29日
【2020新书】从Excel中学习数据挖掘,223页pdf
专知会员服务
90+阅读 · 2020年6月28日
Python导论,476页pdf,现代Python计算
专知会员服务
260+阅读 · 2020年5月17日
【ACL2020-复旦大学NLP】异构图神经网络的文档摘要提取
专知会员服务
34+阅读 · 2020年5月1日
【干货书】机器学习Python实战教程,366页pdf
专知会员服务
340+阅读 · 2020年3月17日
Transformer文本分类代码
专知会员服务
116+阅读 · 2020年2月3日
【干货】用BRET进行多标签文本分类(附代码)
专知会员服务
84+阅读 · 2019年12月27日
相关资讯
盘一盘 Python 系列 8 - Sklearn
平均机器
5+阅读 · 2019年5月30日
文本分析与可视化
Python程序员
9+阅读 · 2019年2月28日
实战 | 用Python做图像处理(三)
七月在线实验室
15+阅读 · 2018年5月29日
文本挖掘中特征选择(附python实现)
七月在线实验室
4+阅读 · 2018年5月22日
[机器学习] 用KNN识别MNIST手写字符实战
机器学习和数学
4+阅读 · 2018年5月13日
在Python中使用SpaCy进行文本分类
专知
24+阅读 · 2018年5月8日
【干货】基于Keras的注意力机制实战
专知
59+阅读 · 2018年5月4日
文本挖掘之特征选择(python 实现)
数据挖掘入门与实战
4+阅读 · 2017年7月19日
NLP自然语言处理(二)——基础文本分析
乐享数据DataScientists
12+阅读 · 2017年2月7日
Top
微信扫码咨询专知VIP会员