基於機器學習的NLP情感分析(一)---- 數據採集與詞向量構造方法(京東商品評論情感分析)

基於機器學習的NLP情感分析(一)—- 數據採集與詞向量構造方法

最近實習期間在做一個對新聞文本情感分析的項目。在此,用京東的商品評論練手,從數據採集到模型實現完整地寫一遍,以備未來回顧所需。事實上,我採用的方法並不困難,甚至有點naive,所以權且作爲練手吧。

數據採集

在這裏爲了避免人工標註的麻煩,使用的是京東iPad的用戶評論。事實上,NLP情感分析中最花時間的就是人工標註。

仔細查看調試臺可以很容易地發現商品的評論信息都是用json來傳遞的。如下:

https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv37157&productId=4675696&score=5&sortType=6&page=0&pageSize=10&isShadowSku=0&fold=1

這個URL其實還是比較容易看出設計者的思路的。productId是商品對應的ID,score爲用戶對商品的評分,pageSize應該是一個請求發回的評論數。在實踐中發現這種pageSize一般是不可以無限大的,也就是你別想着把pageSize寫得很大,然後就可以一個請求返回一大堆數據。我的做法就是把pageSize寫得一般大(^-^),然後不斷地遞增page來不斷地爬去數據。

score的規則如下:
* 1:差評
* 2:中評
* 3:好評
* 5:追評

把這個URL放在瀏覽器的搜索地址裏就可以得到返回的相應JSON數據了。這裏就不展示了,自己去看吧。一開始你可能會覺得這個json,但只要仔細看看就知道你想要的數據在哪了。你要知道寫網站的程序員也是程序員而已,程序員都喜歡工整的東西,因爲“簡單源於工整”,所以你只要發現他實現工整的方法,你就可以很簡單地獲取相應的數據了。

事實上,京東對於網絡爬蟲是非常寬容的,就算不加任何的速度控制也可以毫無阻礙地完成數據的採集工作。這裏建議使用Python3.5,因爲3.5對中文的支持比較好,另外需要額外下載Request庫。這就不再贅述了。

構造詞向量的方法

TF-IDF

這裏我採用的是,利用TF-IDF來計算詞庫中最具代表性的詞。

概念

TF-IDF(term frequency–inverse document frequency)是一種用於資訊檢索與資訊探勘的常用加權技術。TF-IDF是一種統計方法,用以評估一字詞對於一個文件集或一個語料庫中的其中一份文件的重要程度。字詞的重要性隨着它在文件中出現的次數成正比增加,但同時會隨着它在語料庫中出現的頻率成反比下降。TF-IDF加權的各種形式常被搜尋引擎應用,作爲文件與用戶查詢之間相關程度的度量或評級。除了TF-IDF以外,因特網上的搜尋引擎還會使用基於連結分析的評級方法,以確定文件在搜尋結果中出現的順序。

原理

在一份給定的文件裏,詞頻 (term frequency, TF) 指的是某一個給定的詞語在該文件中出現的次數。這個數字通常會被歸一化(分子一般小於分母 區別於IDF),以防止它偏向長的文件。(同一個詞語在長文件裏可能會比短文件有更高的詞頻,而不管該詞語重要與否。)

逆向文件頻率 (inverse document frequency, IDF)是一個詞語普遍重要性的度量。某一特定詞語的IDF,可以由總文件數目除以包含該詞語之文件的數目,再將得到的商取對數得到。

某一特定文件內的高詞語頻率,以及該詞語在整個文件集合中的低文件頻率,可以產生出高權重的TF-IDF。因此,TF-IDF傾向於過濾掉常見的詞語,保留重要的詞語

TFIDF的主要思想是:如果某個詞或短語在一篇文章中出現的頻率TF高,並且在其他文章中很少出現,則認爲此詞或者短語具有很好的類別區分能力,適合用來分類。TFIDF實際上是:TF * IDF,TF詞頻(Term Frequency),IDF反文檔頻率(Inverse Document Frequency)。TF表示詞條在文檔d中出現的頻率(另一說:TF詞頻(Term Frequency)指的是某一個給定的詞語在該文件中出現的次數)。IDF的主要思想是:如果包含詞條t的文檔越少,也就是n越小,IDF越大,則說明詞條t具有很好的類別區分能力。如果某一類文檔C中包含詞條t的文檔數爲m,而其它類包含t的文檔總數爲k,顯然所有包含t的文檔數n=m+k,當m大的時候,n也大,按照IDF公式得到的IDF的值會小,就說明該詞條t類別區分能力不強。(另一說:IDF反文檔頻率(Inverse Document Frequency)是指果包含詞條的文檔越少,IDF越大,則說明詞條具有很好的類別區分能力。)但是實際上,如果一個詞條在一個類的文檔中頻繁出現,則說明該詞條能夠很好代表這個類的文本的特徵,這樣的詞條應該給它們賦予較高的權重,並選來作爲該類文本的特徵詞以區別與其它類文檔。這就是IDF的不足之處.

在一份給定的文件裏,詞頻(term frequency,TF)指的是某一個給定的詞語在該文件中出現的頻率。這個數字是對詞數(term count)的歸一化,以防止它偏向長的文件。(同一個詞語在長文件裏可能會比短文件有更高的詞數,而不管該詞語重要與否。)對於在某一特定文件裏的詞語 來說,它的重要性可表示爲:

Stary 2017-07-18 at 4.13.35 P

Stary 2017-07-18 at 4.13.28 P

某一特定文件內的高詞語頻率,以及該詞語在整個文件集合中的低文件頻率,可以產生出高權重的TF-IDF。因此,TF-IDF傾向於過濾掉常見的詞語,保留重要的詞語。

補充說明

這裏提出的TF-IDF的詳細介紹只是給出了一種實現TF-IDF的一般做法,但是需要注意到的是,一般實現方法下的TF-IDF確實能夠選出最能夠區分不同文檔的字詞。但我希望做到的是,選出最能用於區分不同情感的字詞,因此,這裏我對公式做出了一點簡單的修改。

在計算tf的時候,我認爲,整個語料庫裏只有兩種文檔,一種是好評文檔,一種是差評文檔,不去細分每一條評論。具體見實現。

PMI 點相互信息

PMI(Pointwise Mutual Information)這個指標來衡量兩個事物之間的相關性(比如兩個詞)。

在概率論中,我們知道,如果x跟y不相關,則p(x,y)=p(x)p(y)。二者相關性越大,則p(x,y)就相比於p(x)p(y)越大。用後面的式子可能更好理解,在y出現的情況下x出現的條件概率p(x|y)除以x本身出現的概率p(x),自然就表示x跟y的相關程度。
這裏的log來自於信息論的理論,可以簡單理解爲,當對p(x)取log之後就將一個概率轉換爲了信息量(要再乘以-1將其變爲正數),以2爲底時可以簡單理解爲用多少個bits可以表示這個變量。

補充說明

與前面的TF-IDF一樣,我希望選出的是對分類情感最有效的詞,所以在這裏對公式做出一點簡單的修改。

PMI(word,pos)=logP(word,pos)P(pos)P(word)

pos表示的文檔的情感,word表示某一個詞。

分母表示同時在表現爲pos情感和出現word詞的概率。

完整代碼

在實現中,我們需要解決的就是分詞和計算詞頻的問題了。

對於NLP來說,第一個問題就是要實現分詞。市面上有很多的分詞庫,而且效果都還不錯。比較難過的是,NLTK沒有支持中文的分詞方法,這裏我使用的是jieba分詞。jieba分詞比較易用,而且可以很容易地添加自定義詞庫。在這個項目中,沒有必須要加入自定義詞庫的需求,原因對於商品評論來說,沒有非常特別的固定使用詞。但是在我實習的項目,因爲有很多固定用法的詞,就非常有需要加自定義詞庫。

另外需要注意的是,雖然不用加入自定義詞庫,但還是需要刪除一些“無效詞”(stopwords),這裏無效指的是對錶達情感時,沒有明確的情感指向但卻是非常常用的詞,也就是這些詞的詞頻會非常高,因此這些詞的TF-IDF仍然可能非常高,所以需要主動刪除,以避免引入噪聲。

Github

實驗結果

構造向量的時候,不可能直接把所有的詞都用上,只能選擇其中的一部分。這裏我選擇的是PMI最大的前30個詞。

好評文檔

不錯
速度
正品
挺
喜歡
很快
屏幕
質量
沒
沒有
滿意
流暢
值得
性價比
高
第一次
好用
快遞
送貨
運行
好評
評價
系統
清晰
發貨
全新
信賴
好好
送
特別

差評文檔

降價
沒有
客服
沒
差評
屏幕
送
激活
太
退
剛買
退貨
差
垃圾
贈品
想
申請
問
發現
降
貨
完
不好
失望
快遞
坑
找
第一次
保護
差價

總結

這裏選出的有一些詞,可能很難想象爲什麼他們可以很好地表現文檔情感。有一些詞可能是常用詞,需要在把他們放入到常用詞的文檔中,在分詞中就提前剔除。有一些則確實表現出人們的情感,但不一定是普遍意義上的情感詞,而這就是爲什麼我會希望使用這個方法來構造情感分析的詞向量。基於語義規則的情感分析只能把握一些人們都熟知的情感詞,同時研究人員也需要非常多的時間去閱讀文本來找到文本中一些能夠體現情感的特別的詞,例如在這個例子中,差價價格保護等詞常常會出現在差評中,這反映了人們對商品服務的認識。當然這裏其實也可以認爲是提取熱詞,只不過是反映情感的熱詞

這裏,我採集的數據爲好評和差評各一千條,所以總共是兩千條評論。事實上,如果你願意,也可以採集更多的評論來訓練分類器。京東其實是非常“樂意”被爬蟲的。
另外,根據VC Theory,參數的維度越大所需要的訓練數據集就要越大,一般來說,十倍參數的維度是訓練集的下限,所以我使用了好評詞彙和差評詞彙中TF-IDF最大的前75個,構成150維的feature,以及1500條評論爲訓練集。當然在具體實踐中,需要重新修改這個feature數目。

至此,數據採集和構造詞向量的部分就結束了。NLP情感分析中一般有兩種方法,第一種是根據語義和依存關係來量化文本的情感色彩。但這種方法首先需要很完善的情感詞庫,另外需要很好的語言學基礎,也就是說需要知道一個句子通常在什麼情況爲表現爲Positive和Negative。我個人是覺得,我們永遠無法窮經所有的語法規則和感情詞彙,這也就無形之中增加了構造分類規則的難度。另外是,我個人是非常信奉大數據的。也就是說,我認爲大數據是可以揭示一些超越人認知能力的信息,而這些信息是很難被人所察覺的。這就是機器學習或者說人工智能,會被如此的崇尚。第二種方法,就是基於機器學習的方法。基於機器學習,本質上就是要轉化爲機器學習能解決的問題。情感分析實際上就是認爲是機器學習中的二分類問題。但是機器是無法理解文本的,所以我們必須能夠實現讓文本轉化爲向量,從而讓機器能夠理解。但其實,對於情感分析來說,最主流的還是第一種方法,原因就在於,並不是所有的文本都是已經標註好的。也就是說,我們很難想爬去京東的數據一樣,一抓下來就知道這條文本是positive還是Negative。大多數情況都是需要對數據進行人工標註的。這個工作非常耗費人力。我自己親身試驗過人工標註,一天就只能標註大概400條的數據,並且已經非常累了。而且對於特定領域來說,判斷情感還並不是一般人能做的,這其中需要很多的專業知識,例如要判斷一條金融新聞是利好還是利空,事實上並沒有這麼容易。

那麼,其實這個feature selection的問題還沒有這麼簡單。我這裏只使用了單個詞的TF-IDF,顯然這是非常粗糙的選參方法。當然也可以嘗試加上bigram之類的。那都是後話了。

大概就是這麼多了。下一部分,我將會嘗試着對此處建立的”word2vec”的方法,相應地構造機器學習模型,並對模型進行相應的優化。

引用

TF-IDF及其算法
PMI算法

下集

基於機器學習的NLP情感分析(二)—- 分類問題

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