snownlp中文情感分析[正負面sentiments/相似度sim]
阿新 • • 發佈:2018-12-10
安裝
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
- 我的路徑:D:\Anaconda\Lib\site-packages\snownlp\seg\seg.marshal
- 看到在同一個目錄下,有個data.txt,這個就是訓練的樣本,開啟樣本可以發現:
- 邁/b 向/e 充/b 滿/e 希/b 望/e 的/s 新/s 世/b 紀/e中/b 共/m 中/m 央/e 總/b 書/m 記/e
- 其中b代表begin,m代表middle,e代表end,分別代表一個詞語的開始,中間詞和結尾,s代表single,一個字是一個詞的意思。
- 將訓練樣本放入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")
'''
- 情感係數: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]
# 計算BM2.5 相似性
s = SnowNLP([[u'這篇', u'文章',u'非常好'],
[u'那篇', u'文章',u'一般般'],
[u'這個']])
#s.tf
s.idf
s.sim([u'這篇', u'文章',u'非常好'])# [0.3756070762985226, 0, 0]
概率大於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