1. 程式人生 > >snownlp中文情感分析[正負面sentiments/相似度sim]

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
  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")

'''

  • 情感係數: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