python的中文文字挖掘庫snownlp進行購物評論文字情感分析例項
昨晚上發現了snownlp這個庫,很開心。先說說我開心的原因。我本科畢業設計做的是文字挖掘,用R語言做的,發現R語言對文字處理特別不友好,沒有很多強大的庫,特別是針對中文文字的,加上那時候還沒有學機器學習演算法。所以很頭疼,後來不得已用了一個視覺化的軟體RostCM,但是一般視覺化軟體最大的缺點是無法調參,很死板,準確率並不高。現在研一,機器學習演算法學完以後,又想起來要繼續學習文字挖掘了。所以前半個月開始了用python進行文字挖掘的學習,很多人都推薦我從《python自然語言處理》這本書入門,學習了半個月以後,可能本科畢業設計的時候有些基礎了,再看這個感覺沒太多進步,並且這裡通篇將nltk庫進行英文文字挖掘的,英文文字挖掘跟中文是有很大差別的,或者說學完英文文字挖掘,再做中文的,也是完全懵逼的。所以我停了下來,覺得太沒效率了。然後我在網上查詢關於python如何進行中文文字挖掘的文章,最後找到了snownlp這個庫,這個庫是國人自己開發的python類庫,專門針對中文文字進行挖掘,裡面已經有了演算法,需要自己呼叫函式,根據不同的文字構建語料庫就可以,真的太方便了。我只介紹一下這個庫具體應用,不介紹其中的有關演算法原理,因為演算法原理可以自己去學習。因為我在學習這個庫的時候,我查了很多資料發現很少或者基本沒有寫這個庫的例項應用,很多都是轉載官網對這個庫的簡介,所以我記錄一下我今天的學習。
首先簡單介紹一下這個庫可以進行哪些文字挖掘。snownlp主要可以進行中文分詞(演算法是Character-Based Generative Model)、詞性標註(原理是TnT、3-gram 隱馬)、情感分析(官網木有介紹原理,但是指明購物類的評論的準確率較高,其實是因為它的語料庫主要是購物方面的,可以自己構建相關領域語料庫,替換原來的,準確率也挺不錯的)、文字分類(原理是樸素貝葉斯)、轉換拼音、繁體轉簡體、提取文字關鍵詞(原理是TextRank)、提取摘要(原理是TextRank)、分割句子、文字相似(原理是BM25)。官網還有更多關於該庫的介紹,在看我這個文章之前,建議先看一下官網,裡面有最基礎的一些命令的介紹。官網連結:https://pypi.python.org/pypi/snownlp/0.11.1。
下面正式介紹例項應用。主要是中文文字的情感分析,我今天從京東網站採集了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%的準確率還是不錯了。
以上是我這次的學習筆記,和大家分享一下,有不足之處請大家批評指正。我還是一個剛涉世資料探勘、機器學習、文字挖掘領域不久的小白,有許多知識還是比較模糊,但對這資料探勘很感興趣。希望能多結識這方面的朋友,共同學習、共同進步。