文字情感分析作為nlp的常見任務,具有很高的實際應用價值。本文將採用lstm模型,訓練乙個能夠識別文字postive, neutral, negative三種情感的分類器。
本文的目的是快速熟悉lstm做情感分析任務,所以本文提到的只是乙個baseline,並在最後分析了其優劣。對於真正的文字情感分析,在本文提到的模型之上,還可以做很多任務作,以後有空的話,筆者可以再做優化。
rnn應用場景
word2vec 演算法
建模環節中最重要的一步是特徵提取,在自然語言處理中也不例外。在自然語言處理中,最核心的乙個問題是,如何把乙個句子用數字的形式有效地表達出來?如果能夠完成這一步,句子的分類就不成問題了。顯然,乙個最初等的思路是:給每個詞語賦予唯一的編號1,2,3,4...,然後把句子看成是編號的集合,比如假設1,2,3,4分別代表「我」、「你」、「愛」、「恨」,那麼「我愛你」就是[1, 3, 2],「我恨你」就是[1, 4, 2]。這種思路看起來有效,實際上非常有問題,比如乙個穩定的模型會認為3跟4是很接近的,因此[1, 3, 2]和[1, 4, 2]應當給出接近的分類結果,但是按照我們的編號,3跟4所代表的詞語意思完全相反,分類結果不可能相同。因此,這種編碼方式不可能給出好的結果。
讀者也許會想到,我將意思相近的詞語的編號湊在一堆(給予相近的編號)不就行了?嗯,確實如果,如果有辦法把相近的詞語編號放在一起,那麼確實會大大提高模型的準確率。可是問題來了,如果給出每個詞語唯一的編號,並且將相近的詞語編號設為相近,實際上是假設了語義的單一性,也就是說,語義僅僅是一維的。然而事實並非如此,語義應該是多維的。
比如我們談到「家園」,有的人會想到近義詞「家庭」,從「家庭」又會想到「親人」,這些都是有相近意思的詞語;另外,從「家園」,有的人會想到「地球」,從「地球」又會想到「火星」。換句話說,「親人」、「火星」都可以看作是「家園」的二級近似,但是「親人」跟「火星」本身就沒有什麼明顯的聯絡了。此外,從語義上來講,「大學」、「舒適」也可以看做是「家園」的二級近似,顯然,如果僅通過乙個唯一的編號,是很難把這些詞語放到適合的位置的。
word2vec:高維來了
從上面的討論可以知道,很多詞語的意思是各個方向發散開的,而不是單純的乙個方向,因此唯一的編號不是特別理想。那麼,多個編號如何?換句話說,將詞語對應乙個多維向量?不錯,這正是非常正確的思路。
為什麼多維向量可行?首先,多維向量解決了詞語的多方向發散問題,僅僅是二維向量就可以360度全方位旋轉了,何況是更高維呢(實際應用中一般是幾百維)。其次,還有乙個比較實際的問題,就是多維向量允許我們用變化較小的數字來表徵詞語。怎麼說?我們知道,就中文而言,詞語的數量就多達數十萬,如果給每個詞語唯一的編號,那麼編號就是從1到幾十萬變化,變化幅度如此之大,模型的穩定性是很難保證的。如果是高維向量,比如說20維,那麼僅需要0和1就可以表達2^20=1048576220=1048576(100萬)個詞語了。變化較小則能夠保證模型的穩定性。
扯了這麼多,還沒有真正談到點子上。現在思路是有了,問題是,如何把這些詞語放到正確的高維向量中?而且重點是,要在沒有語言背景的情況下做到這件事情?(換句話說,如果我想處理英語語言任務,並不需要先學好英語,而是只需要大量收集英語文章,這該多麼方便呀!)在這裡我們不可能也不必要進行更多的原理上的展開,而是要介紹:而基於這個思路,有乙個google開源的著名的工具——word2vec。
簡單來說,word2vec就是完成了上面所說的我們想要做的事情——用高維向量(詞向量,word embedding)表示詞語,並把相近意思的詞語放在相近的位置,而且用的是實數向量(不侷限於整數)。我們只需要有大量的某語言的語料,就可以用它來訓練模型,獲得詞向量。詞向量好處前面已經提到過一些,或者說,它就是問了解決前面所提到的問題而產生的。另外的一些好處是:詞向量可以方便做聚類,用歐氏距離或余弦相似度都可以找出兩個具有相近意思的詞語。這就相當於解決了「一義多詞」的問題(遺憾的是,似乎沒什麼好思路可以解決一詞多義的問題。)
關於word2vec的數學原理,讀者可以參考這系列文章。而word2vec的實現,google官方提供了c語言的源**,讀者可以自行編譯。而python的gensim庫中也提供現成的word2vec作為子庫(事實上,這個版本貌似比官方的版本更加強大)。
句向量接下來要解決的問題是:我們已經分好詞,並且已經將詞語轉換為高維向量,那麼句子就對應著詞向量的集合,也就是矩陣,類似於影象處理,影象數位化後也對應乙個畫素矩陣;可是模型的輸入一般只接受一維的特徵,那怎麼辦呢?乙個比較簡單的想法是將矩陣展平,也就是將詞向量乙個接乙個,組成乙個更長的向量。這個思路是可以,但是這樣就會使得我們的輸入維度高達幾千維甚至幾萬維,事實上是難以實現的。(如果說幾萬維對於今天的計算機來說不是問題的話,那麼對於1000x1000的影象,就是高達100萬維了!)
在自然語言處理中,通常用到的方法是遞迴神經網路或迴圈神經網路(都叫rnns)。它們的作用跟卷積神經網路是一樣的,將矩陣形式的輸入編碼為較低維度的一維向量,而保留大多數有用資訊。
分類 情感分析
此課程是coursera 華盛頓大學開設的machine learning 專項的第一部分內容,僅做筆記 學習使用。通過使用者對amazon 產品的評價,通過對評價文字進行分詞,建立分類器分辨使用者評價屬於好評還是差評 不涉及中評 使用第三方庫為graphlab create。對於句子進行分詞,將帶...
python 文字情感分類
對於乙個簡單的文字情感分類來說,其實就是乙個二分類,這篇部落格主要講述的是使用scikit learn 來做文字情感分類。分類主要分為兩步 1 訓練,主要根據訓練集來學習分類模型的規則。2 分類,先用已知的測試集評估分類的準確率等,如果效果還可以,那麼該模型對無標註的待測樣本進行 下面實現了svm,...
使用飛槳實現基於LSTM的情感分析模型
接下來讓我們看看如何使用飛槳實現乙個基於長短時記憶網路的情感分析模型。在飛槳中,不同深度學習模型的訓練過程基本一致,流程如下 資料處理 選擇需要使用的資料,並做好必要的預處理工作。網路定義 使用飛槳定義好網路結構,包括輸入層,中間層,輸出層,損失函式和優化演算法。網路訓練 將準備好的資料送入神經網路...