python情感分析语料库_python中⽂情感分析Snownlp库的使
不⽢⼼的时候,就是在进步;痛苦的时候,就是在成长。
⽂章⽬录
⼀、Snownlp 简介
SnowNLP是⼀个python写的类库,可以⽅便的处理中⽂⽂本内容,是受到了TextBlob的启发⽽写的,由于现在⼤部分的⾃然语⾔处理库基本都是针对英⽂的,于是写了⼀个⽅便处理中⽂的类库,并且和TextBlob不同的是,这⾥没有⽤NLTK,所有的算法都是⾃⼰实现的,并且⾃带了⼀些训练好的字典。注意本程序都是处理的unicode编码,所以使⽤时请⾃⾏decode成unicode编码。# 安装
pip install snownlp -i pypi.douban/simple --trusted-host pypi.douban
⼆、Snownlp 特性中⽂分词(Character-Based Generative Model)
词性标注(TnT 3-gram 隐马)
情感分析(官⽹没有介绍具体原理,但是指明购物类的评论的准确率较⾼,其实是因为它的语料库主要是购物⽅⾯的)
⽂本分类(原理是朴素贝叶斯)
转换成拼⾳ (Trie树实现的最⼤匹配)
繁体转简体 (Trie树实现的最⼤匹配)
提取⽂本关键词(TextRank算法)
提取⽂本摘要(TextRank算法)
tf,idf
Tokenization(分割成句⼦)
⽂本相似(BM25)
三、Snownlp库的基本使⽤from snownlp import SnowNLP
word = u'这个姑娘真好看'
s = SnowNLP(word)
print(s.words) # 分词
print(list(s.tags)) # 词性标注
print(s.sentiments) # 情感分数
print(s.pinyin) # 拼⾳
print(SnowNLP(u'蒹葭蒼蒼,⽩露為霜。所謂伊⼈,在⽔⼀⽅。').han) # 繁体字转简体
运⾏结果如下:
['这个', '姑娘', '真', '好看']
[('这个', 'r'), ('姑娘', 'n'), ('真', 'd'), ('好看', 'a')]
0.9002381975487243
['zhe', 'ge', 'gu', 'niang', 'zhen', 'hao', 'kan']
蒹葭苍苍,⽩露为霜。所谓伊⼈,在⽔⼀⽅。from snownlp import SnowNLP
text = u'''
⾃然语⾔处理是计算机科学领域与⼈⼯智能领域中的⼀个重要⽅向。
它研究能实现⼈与计算机之间⽤⾃然语⾔进⾏有效通信的各种理论和⽅法。
⾃然语⾔处理是⼀门融语⾔学、计算机科学、数学于⼀体的科学。
因此,这⼀领域的研究将涉及⾃然语⾔,即⼈们⽇常使⽤的语⾔,
所以它与语⾔学的研究有着密切的联系,但⼜有重要的区别。
⾃然语⾔处理并不是⼀般地研究⾃然语⾔,
⽽在于研制能有效地实现⾃然语⾔通信的计算机系统,
特别是其中的软件系统。因⽽它是计算机科学的⼀部分。
'''
s = SnowNLP(text)
print(s.keywords(limit=3)) # 关键词提取
print('--------------------------------')
summary = s.summary(limit=4) # ⽂本概括
for i in summary:
print(i)
print('--------------------------------')
print(s.sentences) # 句⼦
运⾏结果如下:
['语⾔', '⾃然', '计算机']
--------------------------------
python官方文档中文版
因⽽它是计算机科学的⼀部分
⾃然语⾔处理是计算机科学领域与⼈⼯智能领域中的⼀个重要⽅向
⾃然语⾔处理是⼀门融语⾔学、计算机科学、数学于⼀体的科学
所以它与语⾔学的研究有着密切的联系
--------------------------------
['⾃然语⾔处理是计算机科学领域与⼈⼯智能领域中的⼀个重要⽅向', '它研究能实现⼈与计算机之间⽤⾃然语⾔进⾏有效通信的各种理论和⽅法', '⾃然语⾔处理是⼀门融语⾔学、计算机科学、数学于⼀体的科学', '因此', '这⼀领域的研究将涉及⾃然语⾔', '即⼈们⽇常使⽤的语⾔', '所以它与语⾔学的研究有着密切的联系', '但⼜有重要的区别', '⾃然语⾔处理并不是⼀般地研究⾃然语⾔', '⽽在于研制能有效地实现⾃然语⾔通信的计算机系统', '特别是其中的软件系统', '因⽽它是计算机科学的⼀部分']
Process finished with exit code 0# 评价词语对⽂本的重要程度
# TF-IDF是⼀种统计⽅法,⽤以评估⼀字词对于⼀个⽂件集或⼀个语料库中的其中⼀份⽂件的重要程度。
# TF词频越⼤越重要,但是⽂中会的“的”,“你”等⽆意义词频很⼤,却信息量⼏乎为0,这种情况导致单纯看词频评价词语重要性是不准确的。因此加⼊了idf
# IDF的主要思想是:如果包含词条t的⽂档越少,也就是n越⼩,IDF越⼤,则说明词条t越重要
# TF-IDF综合起来,才能准确的综合的评价⼀词对⽂本的重要性。
from snownlp import SnowNLP
s = SnowNLP([[u'这篇', u'⽂章', u'写得', u'不错'],
[u'那篇', u'论⽂', u'好'],
[u'这个', u'东西', u'好吃']])
print(s.tf) # tf 意思是词频(Term Frequency)
print('---------------------------------------------------')
print(s.idf) # idf 意思是逆⽂本频率指数(Inverse Document Frequency)
print('-----------------------------------------------------')
# ⽂本相似度
print(s.sim([u'⽂章']))
print(s.sim([u'好']))
运⾏结果如下:
[{'这篇': 1, '⽂章': 1, '写得': 1, '不错': 1}, {'那篇': 1, '论⽂': 1, '好': 1}, {'这个': 1, '东西': 1, '好吃': 1}]
---------------------------------------------------
{'这篇': 0.5108256237659907, '⽂章': 0.5108256237659907, '写得': 0.5108256237659907, '不错':
0.5108256237659907, '那篇': 0.5108256237659907, '论⽂': 0.5108256237659907, '好': 0.5108256237659907, '这个': 0.5108256237659907, '东西': 0.5108256237659907, '好吃': 0.5108256237659907}
-----------------------------------------------------
[0.4686473612532025, 0, 0]
[0, 0.5348959411162205, 0]# 关于训练
# 现在提供训练的包括分词,词性标注,情感分析,都是⽤的snownlp库⾃带的原始⽂件 以分词为例 分词在snownlp/seg⽬录下
from snownlp import seg
seg.save('seg.marshal')
# 这样训练好的⽂件就保存为seg.marshal了,之后修改snownlp/seg/__init__.py⾥的data_path指向刚训练好的⽂件即可
四、NLP测试
1. 获取数据
爬取部分好评、中评和差评数据,分别保存到三个txt⾥。
2. 处理数据from pathlib import Path
import pandas as pd
# 获取当前⽬录下 存储好评 中评 差评数据的txt
p = Path(r'D:\python\pycharm2020\program\数据分析\中⽂情感分析')
review_txt = list(p.glob('**/*.txt'))
all_data = pd.DataFrame()
for item in review_txt:
emotion = item.stem # 获取⽂件名 除后缀的部分
with Path(item).open(mode='r') as f:
con = f.read().split('\n')
data = pd.DataFrame({'评论内容': con, '标签': [emotion] * len(con)})
all_data = all_data.append(data)
_excel('评论数据.xlsx', index=False)
3. NLP测试from snownlp import SnowNLP
import pandas as pd
import re
df = pd.read_excel('评论数据.xlsx')
content = df['评论内容']
# 去除⼀些⽆⽤的字符 只提取出中⽂出来
content = [' '.join(re.findall('[\u4e00-\u9fa5]+', item, re.S)) for item in content]
# 对每条评论进⾏情感打分
scores = [SnowNLP(i).sentiments for i in content]
emotions = []
# 根据分数来划定好评 中评 差评
for i in scores:
if i >= 0.75:
emotions.append('好评')
elif 0.45 <= i < 0.75:
emotions.append('中评')
else:
emotions.append('差评')
df['情感分数'] = scores
df['情感'] = emotions
<_excel('NLP测试后数据.xlsx')import pandas as pd
# 计算预测准确率
df = pd.read_excel('NLP测试后数据.xlsx')
# 看准确率 通过Snownlp情感打分 设置梯度得出的情感 好评 中评 差评 与实际标签相⽐较data = df[df['标签'] == df['情感']]
print('准确率为:{:.3%}'.format(len(data) / len(df)))
运⾏结果如下:
准确率为:72.292%
Process finished with exit code 0准确率还可以,但还不算⾼,分析原因可能为如下⽅⾯:
因为只是做练习、熟悉Snownlp库的基本使⽤,通过情感打分和设置梯度来判断情感,没有⾃⼰构建该领域的语料库,如果构建了相关语料库,替换默认语料库,准确率会⾼很多。所以语料库是⾮常关键的,如果要正式进⾏⽂本挖掘,建议要构建⾃⼰的语料库。
这个商品下的评论,中评、差评的界限⽐较模糊,每条评论的标签⽤的是爬取时默认标签:属于什么评论,没有⼈⼯去看,会有相当的误差。
对⽂本的处理也只是滤掉其他字符,提取中⽂。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。