snownlp中文情感分析[正负面sentiments/相似度sim]

安装

pip install snownlp

导包

from snownlp import SnowNLP
# 加载情感分析模块
from snownlp import sentiment

导入数据集

text=pd.read_excel("./自然语言文本.xlsx")
text.head()

更改行名称

# 改名
text.columns=['comment', 'predict', 'True_cls']
text.head()

训练自定义的neg.txt/pos.txt数据并保存训练模型(此处使用snownlp自带的购物数据)

sentiment的neg.txt和pos.txt,这两个里放的是负向情感和正向情感的句子。所以在训练的时候也只需要这样子放入句子即可:

  • from snownlp import sentiment
  • sentiment.train(neg1.txt,pos1.txt)
  • sentiment.save('sentiment2.marshal')

同时仍然可以训练分词:seg

  1. 我的路径:D:\Anaconda\Lib\site-packages\snownlp\seg\seg.marshal.3
  2. 看到在同一个目录下,有个data.txt,这个就是训练的样本,打开样本可以发现:
  3. 迈/b 向/e 充/b 满/e 希/b 望/e 的/s 新/s 世/b 纪/e中/b 共/m 中/m 央/e 总/b 书/m 记/e
  4. 其中b代表begin,m代表middle,e代表end,分别代表一个词语的开始,中间词和结尾,s代表single,一个字是一个词的意思。
  5. 将训练样本放入data1.txt中,进行训练:
  • seg.train('data1.txt')
  • 如果下次还需要使用的话,将结果保留到seg2.marshal当中,使用的时候只要更改data_path改为seg2.marshal的路径即可
注意:
① 复制路径后,Windows10默认右斜杠,把它改成左斜杠如下才可运行 
② 训练neg.txt/pos.txt,此处使用snownlp自带的(偏购物),
也可以自定义自身业务方向的词库 
③ 保存位置可自己决定,但要把snownlp/seg/__init__.py或
snownlp/sentiment/__init__.py的data_path也改成你保存的位置,不然下次使用还是默认的。
sentiment.train('D:/Anaconda/Lib/site-packages/snownlp/sentiment/neg.txt',
                'D:/Anaconda/Lib/site-packages/snownlp/sentiment/pos.txt')

# 本文将此保存文件移至原模型处,并修改了__init__.py
sentiment.save("./sentiment_my.marshal")

'''

扫描二维码关注公众号,回复: 3221299 查看本文章
  • 情感系数:SnowNLP(i).sentiments
  • 分词:SnowNLP(i).words
  • 转拼音:SnowNLP(i).pinyin
  • 关键词提取:SnowNLP(i).keywords(2) # n默认为5
  • 自动文摘:SnowNLP(i).summary(1) # n默认为5
  • 句子切分:SnowNLP(i).sentences
  • 转简体:SnowNLP(i).han
  • 计算相似度:SnowNLP(i).sim(doc,index)
  • 计算term frequency词频:SnowNLP(i).tf  单个字的词频,暂时没啥用

'''

给每条评论计算得分(情感系数越大则表示正向)

text.comment.map(lambda x : SnowNLP(x).sentiments)
Out:
0    0.475748
1    0.598626
2    0.034824
3    0.939508
4    0.942496
5    0.052602
6    0.462825
7    0.043609
8    0.150083
Name: comment, dtype: float64

# 保存至表格字段中
text['proba']=proba

关键词提取

# 关键词提取 效果不怎么好
[SnowNLP(i).keywords(2) for i in comment]
Out:
[['衣服', '好'],
 ['还', '都'],
 ['太', '态度'],
 ['喜欢', '很'],
 ['衣服', '买'],
 ['不', '回'],
 ['快', '物流'],
 ['购', '网'],
 ['衣服', '一件']]

计算相似度(不是很准确)

tt=[["今天星期日,又到了一个周末,可是我还要加班,非常的生气不开心!"],
   ['还好今天星期一要上班,不然周末该如何是好'],
   ['周末来啦,还是很开心呢'],
    ['周末还是来了!'],
    ['相信未来一切光明。'],
    ['周末来啦'],
    ['周末来啦,还是很开心呢'],
    ['周末来啦,还是很开心呢']
   ]
SnowNLP(tt).sim(['周末来啦,还是很开心呢'])

Out:
[0, 0, 0.4519851237430572, 0, 0, 0, 0.4519851237430572, 0.4519851237430572]

概率大于0.6设置为1,反之设置为-1

# 使用map高阶函数速度要比for循环快
text['proba'].map(lambda x: 1 if x>0.6 else -1)
Out:
0   -1
1   -1
2   -1
3    1
4    1
5   -1
6   -1
7   -1
8   -1
Name: proba, dtype: int64

#或者:
predict=[]
for i in proba:
    if i>0.6:
        predict.append(1)
    else:
        predict.append(-1)
predict
text['predict']=predict

预测的准确率

# 本次预测的准确率
(text.predict==text.True_cls).sum()/text.predict.size
Out: 0.6666666666666666

猜你喜欢

转载自blog.csdn.net/Dorisi_H_n_q/article/details/82713865