基於中文文本挖掘庫snownlp的購物評論文本情感分析

基於中文文本挖掘庫snownlp的購物評論文本情感分析

本文實例講述了Python實現購物評論文本情感分析操作。分享給大家供大家參考,具體如下:

首先簡單介紹一下這個庫可以進行哪些文本挖掘。snownlp主要可以進行中文分詞(算法是Character-Based Generative Model)、詞性標註(原理是TnT、3-gram 隱馬)、情感分析(官網木有介紹原理,但是指明購物類的評論的準確率較高,其實是因爲它的語料庫主要是購物方面的,可以自己構建相關領域語料庫,替換原來的,準確率也挺不錯的)、文本分類(原理是樸素貝葉斯)、轉換拼音、繁體轉簡體、提取文本關鍵詞(原理是TextRank)、提取摘要(原理是TextRank)、分割句子、文本相似(原理是BM25)。官網還有更多關於該庫的介紹,在看我這個文章之前,建議先看一下官網,裏面有最基礎的一些命令的介紹。官網鏈接:https://pypi.python.org/pypi/snownlp/0.11.1

PS:可以直接使用pip install snownlp或者conda install snownlp (Anaconda纔可使用conda命令進行安裝)命令進行snownlp模塊的快速安裝(注:這裏要求pip版本至少爲18.0)。

下面正式介紹實例應用。主要是中文文本的情感分析,我今天從京東網站採集了249條關於筆記本的評論文本作爲練習數據,由於我只是想練習一下,沒采集更多。然後人工標註每條評論的情感正負性,情感正負性就是指該條評論代表了評論者的何種態度,是褒義還是貶義。以下是樣例

其中-1表示貶義,1表示褒義。由於snownlp全部是unicode編碼,所以要注意數據是否爲unicode編碼。因爲是unicode編碼,所以不需要去除中文文本里面含有的英文,因爲都會被轉碼成統一的編碼(補充一下,關於編碼問題,我還是不特別清楚,所以這裏不多講,還請對這方面比較熟悉的夥伴多多指教)。軟件本身默認的是Ascii編碼,所以第一步先設置軟件的默認編碼爲utf-8,代碼如下:

1、改變軟件默認編碼

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

2、然後準備數據

import pandas as pd #加載pandas
text=pd.read_excel(u'F:/自然語言處理/評論文本.xlsx',header=0) #讀取文本數據
text0=text.iloc[:,0] #提取所有數據
text1=[i.decode('utf-8') for i in text0] #上一步提取數據不是字符而是object,所以在這一步進行轉碼爲字符

3、訓練語料庫

from snownlp import sentiment #加載情感分析模塊
sentiment.train('E:/Anaconda2/Lib/site-packages/snownlp/sentiment/neg.txt', 'E:/Anaconda2/Lib/site-packages/snownlp/sentiment/pos.txt') #對語料庫進行訓練,把路徑改成相應的位置。我這次練習並沒有構建語料庫,用了默認的,所以把路徑寫到了sentiment模塊下。
sentiment.save('D:/pyscript/sentiment.marshal')#這一步是對上一步的訓練結果進行保存,如果以後語料庫沒有改變,下次不用再進行訓練,直接使用就可以了,所以一定要保存,保存位置可以自己決定,但是要把`snownlp/seg/__init__.py`裏的`data_path`也改成你保存的位置,不然下次使用還是默認的。

4、進行預測

from snownlp import SnowNLP
senti=[SnowNLP(i).sentiments for i in text1] #遍歷每條評論進行預測

5、進行驗證準確率
預測結果爲positive的概率,positive的概率大於等於0.6,我認爲可以判斷爲積極情感,小於0.6的判斷爲消極情感。所以以下將概率大於等於0.6的評論標籤賦爲1,小於0.6的評論標籤賦爲-1,方便後面與實際標籤進行比較。

newsenti=[]
for i in senti:
 if (i>=0.6):
   newsenti.append(1)
 else:
   newsenti.append(-1)
text['predict']=newsenti #將新的預測標籤增加爲text的某一列,所以現在text的第0列爲評論文本,第1列爲實際標籤,第2列爲預測標籤
counts=0
for j in range(len(text.iloc[:,0])): #遍歷所有標籤,將預測標籤和實際標籤進行比較,相同則判斷正確。
  if text.iloc[j,2]==text.iloc[j,1]:
    counts+=1
print u"準確率爲:%f"%(float(counts)/float(len(text)))#輸出本次預測的準確率

運行結果爲:

準確率還可以,但還不算高,原因是我考慮時間原因,並且我只是練習一下,所以沒有自己構建該領域的語料庫,如果構建了相關語料庫,替換默認語料庫,準確率會高很多。所以語料庫是非常關鍵的,如果要正式進行文本挖掘,建議要構建自己的語料庫。在沒有構建新的語料庫的情況下,這個83.9357%的準確率還是不錯了。

更多關於Python相關內容感興趣的讀者可查看本站專題:《Python數學運算技巧總結》、《Python數據結構與算法教程》、《Python函數使用技巧總結》、《Python字符串操作技巧彙總》、《Python入門與進階經典教程》及《Python文件與目錄操作技巧彙總》

希望本文所述對大家Python程序設計有所幫助。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章