python 多分类情感_文本情感分类(一):传统模型
前言:四五月份的時候,我參加了兩個數據挖掘相關的競賽,分別是物電學院舉辦的“亮劍杯”,以及第三屆 “泰迪杯”全國大學生數據挖掘競賽。很碰巧的是,兩個比賽中,都有一題主要涉及到中文情感分類工作。在做“亮劍杯”的時候,由于我還是初涉,水平有限,僅僅是基于傳統的思路實現了一個簡單的文本情感分類模型。而在后續的“泰迪杯”中,由于學習的深入,我已經基本了解深度學習的思想,并且用深度學習的算法實現了文本情感分類模型。因此,我打算將兩個不同的模型都放到博客中,供讀者參考。剛入門的讀者,可以從中比較兩者的不同,并且了解相關思路。高手請一笑置之。
基于情感詞典#
人的最簡單的判斷思維
傳統的基于情感詞典的文本情感分類,是對人的記憶和判斷思維的最簡單的模擬,如上圖。我們首先通過學習來記憶一些基本詞匯,如否定詞語有“不”,積極詞語有“喜歡”、“愛”,消極詞語有“討厭”、“恨”等,從而在大腦中形成一個基本的語料庫。然后,我們再對輸入的句子進行最直接的拆分,看看我們所記憶的詞匯表中是否存在相應的詞語,然后根據這個詞語的類別來判斷情感,比如“我喜歡數學”,“喜歡”這個詞在我們所記憶的積極詞匯表中,所以我們判斷它具有積極的情感。
基于上述思路,我們可以通過以下幾個步驟實現基于情感詞典的文本情感分類:預處理、分詞、訓練情感詞典、判斷,整個過程可以如下圖所示。而檢驗模型用到的原材料,包括薛云老師提供的蒙牛牛奶的評論,以及從網絡購買的某款手機的評論數據(見附件)。
基于情感詞典的文本情感分類
文本的預處理
由網絡爬蟲等工具爬取到的原始語料,通常都會帶有我們不需要的信息,比如額外的Html標簽,所以需要對語料進行預處理。由薛云老師提供的蒙牛牛奶評論也不例外。我們隊伍使用Python作為我們的預處理工具,其中的用到的庫有Numpy和Pandas,而主要的文本工具為正則表達式。經過預處理,原始語料規范為如下表,其中我們用-1標注消極情感評論,1標記積極情感評論。
\begin{array}{c|c|c}
\hline
& comment & mark\\
\hline
0 & 蒙牛又出來丟人了 & -1\\
1 & 珍愛生命遠離蒙牛 & -1\\
\vdots & \vdots & \vdots \\
1171 & 我一直都很愛喝蒙牛的純牛奶 一直,很愛 & 1\\
1172 & 送蒙牛...健康才是最好的禮物。 & 1\\
\vdots & \vdots & \vdots \\
\hline
\end{array}
句子自動分詞
為了判斷句子中是否存在情感詞典中相應的詞語,我們需要把句子準確切割為一個個詞語,即句子的自動分詞。我們對比了現有的分詞工具,綜合考慮了分詞的準確性和在Python平臺的易用性,最終選擇了“結巴中文分詞”作為我們的分詞工具。
下表僅展示各常見的分詞工具對其中一個典型的測試句子的分詞效果:測試句子:工信處女干事每月經過下屬科室都要親口交代24口交換機等技術性器件的安裝工作分詞工具
測試結果
結巴中文分詞
工信處/ 女干事/ 每月/ 經過/ 下屬/ 科室/ 都/ 要/ 親口/ 交代/ 24/ 口/ 交換機/ 等/ 技術性/ 器件/ 的/ 安裝/ 工作
中科院分詞
工/n 信/n 處女/n 干事/n 每月/r 經過/p 下屬/v 科室/n 都/d 要/v 親口/d 交代/v 24/m 口/q 交換機/n 等/udeng 技術性/n 器件/n 的/ude1 安裝/vn 工作/vn
smallseg
工信/ 信處/ 女干事/ 每月/ 經過/ 下屬/ 科室/ 都要/ 親口/ 交代/ 24/ 口/ 交換機/ 等/ 技術性/ 器件/ 的/ 安裝/ 工作
Yaha 分詞
工信處 / 女 / 干事 / 每月 / 經過 / 下屬 / 科室 / 都 / 要 / 親口 / 交代 / 24 / 口 / 交換機 / 等 / 技術性 / 器件 / 的 / 安裝 / 工作
載入情感詞典
一般來說,詞典是文本挖掘最核心的部分,對于文本感情分類也不例外。情感詞典分為四個部分:積極情感詞典、消極情感詞典、否定詞典以及程度副詞詞典。為了得到更加完整的情感詞典,我們從網絡上收集了若干個情感詞典,并且對它們進行了整合去重,同時對部分詞語進行了調整,以達到盡可能高的準確率。
構建情感詞典
我們隊伍并非單純對網絡收集而來的詞典進行整合,而且還有針對性和目的性地對詞典進行了去雜、更新。特別地,我們加入了某些行業詞匯,以增加分類中的命中率。不同行業某些詞語的詞頻會有比較大的差別,而這些詞有可能是情感分類的關鍵詞之一。比如,薛云老師提供的評論數據是有關蒙牛牛奶的,也就是飲食行業的;而在飲食行業中,“吃”和“喝”這兩個詞出現的頻率會相當高,而且通常是對飲食的正面評價,而“不吃”或者“不喝”通常意味著對飲食的否定評價,而在其他行業或領域中,這幾個詞語則沒有明顯情感傾向。另外一個例子是手機行業的,比如“這手機很耐摔啊,還防水”,“耐摔”、“防水”就是在手機這個領域有積極情緒的詞。因此,有必要將這些因素考慮進模型之中。
文本情感分類
基于情感詞典的文本情感分類規則比較機械化。簡單起見,我們將每個積極情感詞語賦予權重1,將每個消極情感詞語賦予權重-1,并且假設情感值滿足線性疊加原理;然后我們將句子進行分詞,如果句子分詞后的詞語向量包含相應的詞語,就加上向前的權值,其中,否定詞和程度副詞會有特殊的判別規則,否定詞會導致權值反號,而程度副詞則讓權值加倍。最后,根據總權值的正負性來判斷句子的情感。基本的算法如圖。
基于情感詞典的文本分類-程序框圖
要說明的是,為了編程和測試的可行性,我們作了幾個假設(簡化)。假設一:我們假設了所有積極詞語、消極詞語的權重都是相等的,這只是在簡單的判斷情況下成立,更精準的分類顯然不成立的,比如“恨”要比“討厭”來得嚴重;修正這個缺陷的方法是給每個詞語賦予不同的權值,我們將在本文的第二部分探討權值的賦予思路。假設二:我們假設了權值是線性疊加的,這在多數情況下都會成立,而在本文的第二部分中,我們會探討非線性的引入,以增強準確性。假設三:對于否定詞和程度副詞的處理,我們僅僅是作了簡單的取反和加倍,而事實上,各個否定詞和程度副詞的權值也是不一樣的,比如“非常喜歡”顯然比“挺喜歡”程度深,但我們對此并沒有區分。
在算法的實現上,我們則選用了Python作為實現平臺。可以看到,借助于Python豐富的擴展支持,我們僅用了一百行不到的代碼,就實現了以上所有步驟,得到了一個有效的情感分類算法,這充分體現了Python的簡潔。下面將檢驗我們算法的有效性。
模型結果檢驗#
作為最基本的檢驗,我們首先將我們的模型運用于薛云老師提供的蒙牛牛奶評論中,結果是讓人滿意的,達到了82.02%的正確率,詳細的檢驗報告如下表
\begin{array}{c|c|c|c|c|c}
\hline
數據內容 & 正樣本數 & 負樣本數 & 準確率 & 真正率 & 真負率\\
\hline
牛奶評論 & 1005 & 1170 & 0.8202 & 0.8209 & 0.8197\\
\hline
\end{array}
(其中,正樣本為積極情感評論,負樣本為消極情感數據,
$$\begin{aligned}
&\text{準確率}=\frac{\text{被正確判斷的樣本數}}{\text{總樣本數}}\\
&\text{真正率}=\frac{\text{被判斷為積極的正樣本數}}{\text{正樣本總數}}\\
&\text{真負率}=\frac{\text{被判斷為消極的負樣本數}}{\text{負樣本總數}}
\end{aligned}$$。)
讓我們驚喜的是,將從蒙牛牛奶評論數據中調整出來的模型,直接應用到某款手機的評論數據的情感分類中,也達到了81.96%準確率!這表明我們的模型具有較好的強健性,能在不同行業的評論數據的情感分類中都有不錯的表現。
\begin{array}{c|c|c|c|c|c}
\hline
數據內容 & 正樣本數 & 負樣本數 & 準確率 & 真正率 & 真負率\\
\hline
手機評論 & 1158 & 1159 & 0.8196 & 0.7539 & 0.8852\\
\hline
\end{array}
結論:我們隊伍初步實現了基于情感詞典的文本情感分類,測試結果表明,通過簡單的判斷規則就能夠使這一算法具有不錯的準確率,同時具有較好的強健性。一般認為,正確率達80%以上的模型具有一定的生產價值,能適用于工業環境。顯然,我們的模型已經初步達到了這個標準。
困難所在#
經過兩次測試,可以初步認為我們的模型正確率基本達到了80%以上。另外,一些比較成熟的商業化程序,它的正確率也只有85%到90%左右(如BosonNLP)。這說明我們這個簡單的模型確實已經達到了讓人滿意的效果,另一方面,該事實也表明,傳統的“基于情感詞典的文本情感分類”模型的性能可提升幅度相當有限。這是由于文本情感分類的本質復雜性所致的。經過初步的討論,我們認為文本情感分類的困難在以下幾個方面。
語言系統是相當復雜的
歸根結底,這是因為我們大腦中的語言系統是相當復雜的。(1)我們現在做的是文本情感分類,文本和文本情感都是人類文化的產物,換言之,人是唯一準確的判別標準。(2)人的語言是一個相當復雜的文化產物,一個句子并不是詞語的簡單線性組合,它有相當復雜的非線性在里面。(3)我們在描述一個句子時,都是將句子作為一個整體而不是詞語的集合看待的,詞語的不同組合、不同順序、不同數目都能夠帶來不同的含義和情感,這導致了文本情感分類工作的困難。
因此,文本情感分類工作實際上是對人腦思維的模擬。我們前面的模型,實際上已經對此進行了最簡單的模擬。然而,我們模擬的不過是一些簡單的思維定式,真正的情感判斷并不是一些簡單的規則,而是一個復雜的網絡。
大腦不僅僅在情感分類
事實上,我們在判斷一個句子的情感時,我們不僅僅在想這個句子是什么情感,而且還會判斷這個句子的類型(祈使句、疑問句還是陳述句?);當我們在考慮句子中的每個詞語時,我們不僅僅關注其中的積極詞語、消極詞語、否定詞或者程度副詞,我們會關注每一個詞語(主語、謂語、賓語等等),從而形成對整個句子整體的認識;我們甚至還會聯系上下文對句子進行判斷。這些判斷我們可能是無意識的,但我們大腦確實做了這個事情,以形成對句子的完整認識,才能對句子的感情做了準確的判斷。也就是說,我們的大腦實際上是一個非常高速而復雜的處理器,我們要做情感分類,卻同時還做了很多事情。
活水:學習預測
人類區別于機器、甚至人類區別于其他動物的顯著特征,是人類具有學習意識和學習能力。我們獲得新知識的途徑,除了其他人的傳授外,還包括自己的學習、總結和猜測。對于文本情感分類也不例外,我們不僅僅可以記憶住大量的情感詞語,同時我們還可以總結或推測出新的情感詞語。比如,我們只知道“喜歡”和“愛”都具有積極情感傾向,那么我們會猜測“喜愛”也具有積極的情感色彩。這種學習能力是我們擴充我們的詞語的重要方式,也是記憶模式的優化(即我們不需要專門往大腦的語料庫中塞進“喜愛”這個詞語,我們僅需要記得“喜歡”和“愛”,并賦予它們某種聯系,以獲得“喜愛”這個詞語,這是一種優化的記憶模式)。
優化思路#
經過上述分析,我們看到了文本情感分類的本質復雜性以及人腦進行分類的幾個特征。而針對上述分析,我們提出如下幾個改進措施。
非線性特征的引入
前面已經提及過,真實的人腦情感分類實際上是嚴重非線性的,基于簡單線性組合的模型性能是有限的。所以為了提高模型的準確率,有必要在模型中引入非線性。
所謂非線性,指的是詞語之間的相互組合形成新的語義。事實上,我們的初步模型中已經簡單地引入了非線性——在前面的模型中,我們將積極詞語和消極詞語相鄰的情況,視為一個組合的消極語塊,賦予它負的權值。更精細的組合權值可以通過“詞典矩陣”來實現,即我們將已知的積極詞語和消極詞語都放到同一個集合來,然后逐一編號,通過如下的“詞典矩陣”,來記錄詞組的權值。
\begin{array}{c|cccccc}
詞語 & (空詞) & 喜歡 & 愛 & \dots & 討厭 & \dots\\
\hline
(空詞) & 0 & 1 & 2 & \dots & -1 & \dots\\
喜歡 & 1 & 2 & 3 & \dots & -2 & \dots\\
愛 & 2 & 3 & 4 & \dots & -2 & \dots\\
\vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \dots\\
討厭 & -1 & -2 & -3 & \dots & -2 & \dots\\
\vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \dots
\end{array}
并不是每一個詞語的組合都是成立的,但我們依然可以計算它們之間的組合權值,情感權值的計算可以閱讀參考文獻。然而,情感詞語的數目相當大,而詞典矩陣的元素個數則是其平方,其數據量是相當可觀的,因此,這已經初步進入大數據的范疇。為了更加高效地實現非線性,我們需要探索組合詞語的優化方案,包括構造方案和儲存、索引方案。
情感詞典的自動擴充
在如今的網絡信息時代,新詞的出現如雨后春筍,其中包括“新構造網絡詞語”以及“將已有詞語賦予新的含義”;另一方面,我們整理的情感詞典中,也不可能完全包含已有的情感詞語。因此,自動擴充情感詞典是保證情感分類模型時效性的必要條件。目前,通過網絡爬蟲等手段,我們可以從微博、社區中收集到大量的評論數據,為了從這大批量的數據中找到新的具有情感傾向的詞語,我們的思路是無監督學習式的詞頻統計。
我們的目標是“自動擴充”,因此我們要達到的目的是基于現有的初步模型來進行無監督學習,完成詞典擴充,從而增強模型自身的性能,然后再以同樣的方式進行迭代,這是一個正反饋的調節過程。雖然我們可以從網絡中大量抓取評論數據,但是這些數據是無標注的,我們要通過已有的模型對評論數據進行情感分類,然后在同一類情感(積極或消極)的評論集合中統計各個詞語的出現頻率,最后將積極、消極評論集的各個詞語的詞頻進行對比。某個詞語在積極評論集中的詞頻相當低,在消極評論集中的詞頻相當高,那么我們就有把握將該詞語添加到消極情感詞典中,或者說,賦予該詞語負的權值。
舉例來說,假設我們的消極情感詞典中并沒有“黑心”這個詞語,但是“可惡”、“討厭”、“反感”、“喜歡”等基本的情感詞語在情感詞典中已經存在,那么我們就會能夠將下述句子正確地進行情感分類:
\begin{array}{c|c}
\hline
句子 & 權值\\
\hline
這個黑心老板太可惡了 & -2\\
\hline
我很反感這黑心企業的做法 & -2\\
\hline
很討厭這家黑心店鋪 & -2\\
\hline
這家店鋪真黑心! & 0\\
\hline
\vdots & \vdots\\
\hline
\end{array}
其中,由于消極情感詞典中沒有“黑心”這個詞語,所以“這家店鋪真黑心!”就只會被判斷為中性(即權值為0)。分類完成后,對所有詞頻為正和為負的分別統計各個詞頻,我們發現,新詞語“黑心”在負面評論中出現很多次,但是在正面評論中幾乎沒有出現,那么我們就將黑心這個詞語添加到我們的消極情感詞典中,然后更新我們的分類結果:
\begin{array}{c|c}
\hline
句子 & 權值\\
\hline
這個黑心老板太可惡了 & -3\\
\hline
我很反感這黑心企業的做法 & -3\\
\hline
很討厭這家黑心店鋪 & -3\\
\hline
這家店鋪真黑心! & -2\\
\hline
\vdots & \vdots\\
\hline
\end{array}
于是我們就通過無監督式的學習擴充了詞典,同時提高了準確率,增強了模型的性能。這是一個反復迭代的過程,前一步的結果可以幫助后一步的進行。
本文結論
綜合上述研究,我們得出如下結論:基于情感詞典的文本情感分類是容易實現的,其核心之處在于情感詞典的訓練。
語言系統是相當復雜的,基于情感詞典的文本情感分類只是一個線性的模型,其性能是有限的。
在文本情感分類中適當地引入非線性特征,能夠有效地提高模型的準確率。
引入擴充詞典的無監督學習機制,可以有效地發現新的情感詞,保證模型的強健性和時效性。
參考文獻#
Yoshua Bengio, Réjean Ducharme Pascal Vincent, Christian Jauvin. A Neural Probabilistic Language Model, 2003
一種新的語言模型:http://blog.sciencenet.cn/blog-795431-647334.html
實現平臺#
我們隊所做的編程工具,在以下環境中測試完成:Windows 8.1 微軟操作系統。
Python 3.4 開發平臺/編程語言。選擇3.x而不是2.x版本的主要原因是3.x版本對中文字符的支持更好。
Numpy Python的一個數值計算庫,為Python提供了快速的多維數組處理的能力。
Pandas Python的一個數據分析包。
結巴分詞 Python平臺的一個中文分詞工具,也有Java、C++、Node.js等版本。
代碼列表#
預處理
加載情感詞典
預測函數
簡單的測試
更詳細的轉載事宜請參考:《科學空間FAQ》
如果您還有什么疑惑或建議,歡迎在下方評論區繼續討論。
如果您覺得本文還不錯,歡迎分享/打賞本文。打賞并非要從中獲得收益,而是希望知道科學空間獲得了多少讀者的真心關注。當然,如果你無視它,也不會影響你的閱讀。再次表示歡迎和感謝!
打賞
微信打賞
支付寶打賞
因為網站后臺對打賞并無記錄,因此歡迎在打賞時候備注留言。你還可以點擊這里或在下方評論區留言來告知你的建議或需求。
如果您需要引用本文,請參考:
蘇劍林. (2015, Jun 22). 《文本情感分類(一):傳統模型 》[Blog post]. Retrieved from https://spaces.ac.cn/archives/3360
總結
以上是生活随笔為你收集整理的python 多分类情感_文本情感分类(一):传统模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redis 主从_Redis的主从复制
- 下一篇: layui多个file与提交同时进行_如