LSTM分類相關

文本情感分類--傳統模型(轉)

clipboard.png

傳統的基於情感詞典的文本情感分類,是對人的記憶和判斷思惟的最簡單的模擬,如上圖。咱們首先經過學習來記憶一些基本詞彙,如否認詞語有「不」,積極詞語有「喜歡」、「愛」,消極詞語有「討厭」、「恨」等,從而在大腦中造成一個基本的語料庫。而後,咱們再對輸入的句子進行最直接的拆分,看看咱們所記憶的詞彙表中是否存在相應的詞語,而後根據這個詞語的類別來判斷情感,好比「我喜歡數學」,「喜歡」這個詞在咱們所記憶的積極詞彙表中,因此咱們判斷它具備積極的情感。
基於上述思路,咱們能夠經過如下幾個步驟實現基於情感詞典的文本情感分類:預處理、分詞、訓練情感詞典、判斷,整個過程能夠以下圖所示。而檢驗模型用到的原材料,包括薛雲老師提供的蒙牛牛奶的評論,以及從網絡購買的某款手機的評論數據(見附件)。

clipboard.png

文本的預處理html

由網絡爬蟲等工具爬取到的原始語料,一般都會帶有咱們不須要的信息,好比額外的Html標籤,因此須要對語料進行預處理。由薛雲老師提供的蒙牛牛奶評論也不例外。咱們隊伍使用Python做爲咱們的預處理工具,其中的用到的庫有Numpy和Pandas,而主要的文本工具爲正則表達式。通過預處理,原始語料規範爲以下表,其中咱們用-1標註消極情感評論,1標記積極情感評論。git

clipboard.png

句子自動分詞github

爲了判斷句子中是否存在情感詞典中相應的詞語,咱們須要把句子準確切割爲一個個詞語,即句子的自動分詞。咱們對比了現有的分詞工具,綜合考慮了分詞的準確性和在Python平臺的易用性,最終選擇了「結巴中文分詞」做爲咱們的分詞工具。正則表達式

下表僅展現各常見的分詞工具對其中一個典型的測試句子的分詞效果:算法

測試句子:工信處女幹事每個月通過下屬科室都要親口交代24口交換機等技術性器件的安裝工做編程

clipboard.png

載入情感詞典數組

通常來講,詞典是文本挖掘最核心的部分,對於文本感情分類也不例外。情感詞典分爲四個部分:積極情感詞典、消極情感詞典、否認詞典以及程度副詞詞典。爲了獲得更加完整的情感詞典,咱們從網絡上收集了若干個情感詞典,而且對它們進行了整合去重,同時對部分詞語進行了調整,以達到儘量高的準確率。網絡

clipboard.png

咱們隊伍並不是單純對網絡收集而來的詞典進行整合,並且還有針對性和目的性地對詞典進行了去雜、更新。特別地,咱們加入了某些行業詞彙,以增長分類中的命中率。不一樣行業某些詞語的詞頻會有比較大的差異,而這些詞有多是情感分類的關鍵詞之一。好比,薛雲老師提供的評論數據是有關蒙牛牛奶的,也就是飲食行業的;而在飲食行業中,「吃」和「喝」這兩個詞出現的頻率會至關高,並且一般是對飲食的正面評價,而「不吃」或者「不喝」一般意味着對飲食的否認評價,而在其餘行業或領域中,這幾個詞語則沒有明顯情感傾向。另一個例子是手機行業的,好比「這手機很耐摔啊,還防水」,「耐摔」、「防水」就是在手機這個領域有積極情緒的詞。所以,有必要將這些因素考慮進模型之中。app

文本情感分類編程語言

基於情感詞典的文本情感分類規則比較機械化。簡單起見,咱們將每一個積極情感詞語賦予權重1,將每一個消極情感詞語賦予權重-1,而且假設情感值知足線性疊加原理;而後咱們將句子進行分詞,若是句子分詞後的詞語向量包含相應的詞語,就加上向前的權值,其中,否認詞和程度副詞會有特殊的判別規則,否認詞會致使權值反號,而程度副詞則讓權值加倍。最後,根據總權值的正負性來判斷句子的情感。基本的算法如圖。

clipboard.png

要說明的是,爲了編程和測試的可行性,咱們做了幾個假設(簡化)。假設一:咱們假設了全部積極詞語、消極詞語的權重都是相等的,這只是在簡單的判斷狀況下成立,更精準的分類顯然不成立的,好比「恨」要比「討厭」來得嚴重;修正這個缺陷的方法是給每一個詞語賦予不一樣的權值,咱們將在本文的第二部分探討權值的賦予思路。假設二:咱們假設了權值是線性疊加的,這在多數狀況下都會成立,而在本文的第二部分中,咱們會探討非線性的引入,以加強準確性。假設三:對於否認詞和程度副詞的處理,咱們僅僅是做了簡單的取反和加倍,而事實上,各個否認詞和程度副詞的權值也是不同的,好比「很是喜歡」顯然比「挺喜歡」程度深,但咱們對此並無區分。

在算法的實現上,咱們則選用了Python做爲實現平臺。能夠看到,藉助於Python豐富的擴展支持,咱們僅用了一百行不到的代碼,就實現了以上全部步驟,獲得了一個有效的情感分類算法,這充分體現了Python的簡潔。下面將檢驗咱們算法的有效性。

模型結果檢驗
做爲最基本的檢驗,咱們首先將咱們的模型運用於薛雲老師提供的蒙牛牛奶評論中,結果是讓人滿意的,達到了82.02%的正確率,詳細的檢驗報告以下表

clipboard.png

(其中,正樣本爲積極情感評論,負樣本爲消極情感數據,

clipboard.png

讓咱們驚喜的是,將從蒙牛牛奶評論數據中調整出來的模型,直接應用到某款手機的評論數據的情感分類中,也達到了81.96%準確率!這代表咱們的模型具備較好的強健性,能在不一樣行業的評論數據的情感分類中都有不錯的表現。

clipboard.png

結論:咱們隊伍初步實現了基於情感詞典的文本情感分類,測試結果代表,經過簡單的判斷規則就可以使這一算法具備不錯的準確率,同時具備較好的強健性。通常認爲,正確率達80%以上的模型具備必定的生產價值,能適用於工業環境。顯然,咱們的模型已經初步達到了這個標準。

困難所在
通過兩次測試,能夠初步認爲咱們的模型正確率基本達到了80%以上。另外,一些比較成熟的商業化程序,它的正確率也只有85%到90%左右(如BosonNLP)。這說明咱們這個簡單的模型確實已經達到了讓人滿意的效果,另外一方面,該事實也代表,傳統的「基於情感詞典的文本情感分類」模型的性能可提高幅度至關有限。這是因爲文本情感分類的本質複雜性所致的。通過初步的討論,咱們認爲文本情感分類的困難在如下幾個方面。

語言系統是至關複雜的

歸根結底,這是由於咱們大腦中的語言系統是至關複雜的。(1)咱們如今作的是文本情感分類,文本和文本情感都是人類文化的產物,換言之,人是惟一準確的判別標準。(2)人的語言是一個至關複雜的文化產物,一個句子並非詞語的簡單線性組合,它有至關複雜的非線性在裏面。(3)咱們在描述一個句子時,都是將句子做爲一個總體而不是詞語的集合看待的,詞語的不一樣組合、不一樣順序、不一樣數目都可以帶來不一樣的含義和情感,這致使了文本情感分類工做的困難。

所以,文本情感分類工做其實是對人腦思惟的模擬。咱們前面的模型,實際上已經對此進行了最簡單的模擬。然而,咱們模擬的不過是一些簡單的思惟定式,真正的情感判斷並非一些簡單的規則,而是一個複雜的網絡。

大腦不只僅在情感分類

事實上,咱們在判斷一個句子的情感時,咱們不只僅在想這個句子是什麼情感,並且還會判斷這個句子的類型(祈使句、疑問句仍是陳述句?);當咱們在考慮句子中的每一個詞語時,咱們不只僅關注其中的積極詞語、消極詞語、否認詞或者程度副詞,咱們會關注每個詞語(主語、謂語、賓語等等),從而造成對整個句子總體的認識;咱們甚至還會聯繫上下文對句子進行判斷。這些判斷咱們多是無心識的,但咱們大腦確實作了這個事情,以造成對句子的完整認識,才能對句子的感情作了準確的判斷。也就是說,咱們的大腦其實是一個很是高速而複雜的處理器,咱們要作情感分類,卻同時還作了不少事情。

活水:學習預測

人類區別於機器、甚至人類區別於其餘動物的顯著特徵,是人類具備學習意識和學習能力。咱們得到新知識的途徑,除了其餘人的傳授外,還包括本身的學習、總結和猜想。對於文本情感分類也不例外,咱們不只僅能夠記憶住大量的情感詞語,同時咱們還能夠總結或推測出新的情感詞語。好比,咱們只知道「喜歡」和「愛」都具備積極情感傾向,那麼咱們會猜想「喜好」也具備積極的情感色彩。這種學習能力是咱們擴充咱們的詞語的重要方式,也是記憶模式的優化(即咱們不須要專門往大腦的語料庫中塞進「喜好」這個詞語,咱們僅須要記得「喜歡」和「愛」,並賦予它們某種聯繫,以得到「喜好」這個詞語,這是一種優化的記憶模式)。


優化思路
通過上述分析,咱們看到了文本情感分類的本質複雜性以及人腦進行分類的幾個特徵。而針對上述分析,咱們提出以下幾個改進措施。

非線性特徵的引入

前面已經說起過,真實的人腦情感分類其實是嚴重非線性的,基於簡單線性組合的模型性能是有限的。因此爲了提升模型的準確率,有必要在模型中引入非線性。

所謂非線性,指的是詞語之間的相互組合造成新的語義。事實上,咱們的初步模型中已經簡單地引入了非線性——在前面的模型中,咱們將積極詞語和消極詞語相鄰的狀況,視爲一個組合的消極語塊,賦予它負的權值。更精細的組合權值能夠經過「詞典矩陣」來實現,即咱們將已知的積極詞語和消極詞語都放到同一個集合來,而後逐一編號,經過以下的「詞典矩陣」,來記錄詞組的權值。

clipboard.png

並非每個詞語的組合都是成立的,但咱們依然能夠計算它們之間的組合權值,情感權值的計算能夠閱讀參考文獻。然而,情感詞語的數目至關大,而詞典矩陣的元素個數則是其平方,其數據量是至關可觀的,所以,這已經初步進入大數據的範疇。爲了更加高效地實現非線性,咱們須要探索組合詞語的優化方案,包括構造方案和儲存、索引方案。

情感詞典的自動擴充

在現在的網絡信息時代,新詞的出現如雨後春筍,其中包括「新構造網絡詞語」以及「將已有詞語賦予新的含義」;另外一方面,咱們整理的情感詞典中,也不可能徹底包含已有的情感詞語。所以,自動擴充情感詞典是保證情感分類模型時效性的必要條件。目前,經過網絡爬蟲等手段,咱們能夠從微博、社區中收集到大量的評論數據,爲了從這大批量的數據中找到新的具備情感傾向的詞語,咱們的思路是無監督學習式的詞頻統計。

咱們的目標是「自動擴充」,所以咱們要達到的目的是基於現有的初步模型來進行無監督學習,完成詞典擴充,從而加強模型自身的性能,而後再以一樣的方式進行迭代,這是一個正反饋的調節過程。雖然咱們能夠從網絡中大量抓取評論數據,可是這些數據是無標註的,咱們要經過已有的模型對評論數據進行情感分類,而後在同一類情感(積極或消極)的評論集合中統計各個詞語的出現頻率,最後將積極、消極評論集的各個詞語的詞頻進行對比。某個詞語在積極評論集中的詞頻至關高,在消極評論集中的詞頻至關低,那麼咱們就有把握將該詞語添加到消極情感詞典中,或者說,賦予該詞語負的權值。

舉例來講,假設咱們的消極情感詞典中並無「黑心」這個詞語,可是「可惡」、「討厭」、「反感」、「喜歡」等基本的情感詞語在情感詞典中已經存在,那麼咱們就會可以將下述句子正確地進行情感分類:

clipboard.png

其中,因爲消極情感詞典中沒有「黑心」這個詞語,因此「這家店鋪真黑心!」就只會被判斷爲中性(即權值爲0)。分類完成後,對全部詞頻爲正和爲負的分別統計各個詞頻,咱們發現,新詞語「黑心」在負面評論中出現不少次,可是在正面評論中幾乎沒有出現,那麼咱們就將黑心這個詞語添加到咱們的消極情感詞典中,而後更新咱們的分類結果:

clipboard.png
因而咱們就經過無監督式的學習擴充了詞典,同時提升了準確率,加強了模型的性能。這是一個反覆迭代的過程,前一步的結果能夠幫助後一步的進行。

本文結論

綜合上述研究,咱們得出以下結論:

基於情感詞典的文本情感分類是容易實現的,其核心之處在於情感詞典的訓練。

語言系統是至關複雜的,基於情感詞典的文本情感分類只是一個線性的模型,其性能是有限的。

在文本情感分類中適當地引入非線性特徵,可以有效地提升模型的準確率。
引入擴充詞典的無監督學習機制,能夠有效地發現新的情感詞,保證模型的強健性和時效性。

參考文獻
Deep Learning(深度學習)學習筆記整理:http://blog.csdn.net/zouxy09/...
Yoshua Bengio, Réjean Ducharme Pascal Vincent, Christian Jauvin. A Neural Probabilistic Language Model, 2003
一種新的語言模型:http://blog.sciencenet.cn/blo...
評論數據的情感分析數據集:http://www.datatang.com/data/...
「結巴」中文分詞:https://github.com/fxsjy/jieba
NLPIR漢語分詞系統:http://ictclas.nlpir.org/
smallseg:https://code.google.com/p/sma...
yaha分詞:https://github.com/jannson/yaha
情感分析用詞語集(beta版):http://www.keenage.com/html/c...
NTUSD-簡體中文情感極性詞典:http://www.datatang.com/data/...
程度副詞及強度和否認詞表:http://www.datatang.com/data/...
現有情感詞典彙總:http://www.datatang.com/data/...
BosonNLP:http://bosonnlp.com/product

實現平臺
咱們隊所作的編程工具,在如下環境中測試完成:

Windows 8.1 微軟操做系統。

Python 3.4 開發平臺/編程語言。選擇3.x而不是2.x版本的主要緣由是3.x版本對中文字符的支持更好。

Numpy Python的一個數值計算庫,爲Python提供了快速的多維數組處理的能力。

Pandas Python的一個數據分析包。

結巴分詞 Python平臺的一箇中文分詞工具,也有Java、C++、Node.js等版本。

代碼列表
預處理

#-*- coding: utf-8 -*-
 
import numpy as np #導入numpy
import pandas as pd
import jieba
 
def yuchuli(s,m): #導入文本,文本預處理
    wenjian = pd.read_csv(s, delimiter='     xxx     ', encoding='utf-8', \
    header= None, names=['comment']) #導入文本
    wenjian = wenjian['comment'].str.replace('(<.*?>.*?<.*?>)','').str.replace('(<.*?>)','')\
    .str.replace('(@.*?[ :])',' ') #替換無用字符
    wenjian = pd.DataFrame({'comment':wenjian[wenjian != '' ]})
    wenjian.to_csv('out_'+s, header=False, index=False)
    wenjian['mark'] = m #樣本標記
    return wenjian.reset_index()
 
neg = yuchuli('data_neg.txt',-1)
pos = yuchuli('data_pos.txt',1)
 
mydata = pd.concat([neg,pos],ignore_index=True)[['comment','mark']] #結果文件
#預處理基本結束

加載情感詞典

#開始加載情感詞典
negdict = [] #消極情感詞典
posdict = [] #積極情感詞典
nodict = [] #否認詞詞典
plusdict = [] #程度副詞詞典
sl = pd.read_csv('dict/neg.txt', header=None, encoding='utf-8')
for i in range(len(sl[0])):
    negdict.append(sl[0][i])
sl = pd.read_csv('dict/pos.txt', header=None, encoding='utf-8')
for i in range(len(sl[0])):
    posdict.append(sl[0][i])
sl = pd.read_csv('dict/no.txt', header=None, encoding='utf-8')
for i in range(len(sl[0])):
    nodict.append(sl[0][i])
sl = pd.read_csv('dict/plus.txt', header=None, encoding='utf-8')
for i in range(len(sl[0])):
    plusdict.append(sl[0][i])
#加載情感詞典結束

預測函數

#預測函數
def predict(s, negdict, posdict, nodict, plusdict):
    p = 0
    sd = list(jieba.cut(s))
    for i in range(len(sd)):
        if sd[i] in negdict:
            if i>0 and sd[i-1] in nodict:
                p = p + 1
            elif i>0 and sd[i-1] in plusdict:
                p = p - 2
            else: p = p - 1
        elif sd[i] in posdict:
            if i>0 and sd[i-1] in nodict:
                p = p - 1
            elif i>0 and sd[i-1] in plusdict:
                p = p + 2
            elif i>0 and sd[i-1] in negdict:
                p = p - 1
            elif i<len(sd)-1 and sd[i+1] in negdict:
                p = p - 1
            else: p = p + 1
        elif sd[i] in nodict:
            p = p - 0.5
    return p
#預測函數結束

簡單的測試

#簡單的測試
tol = 0
yes = 0
mydata['result'] = 0
for i in range(len(mydata)):
    print(i)
    tol = tol + 1
    if predict(mydata.loc[i,'comment'], negdict, posdict, nodict, plusdict)*mydata.loc[i,'mark'] > 0:
        yes = yes + 1
        mydata.loc[i,'result'] = 1
 
print(yes/tol)

轉載到請包括本文地址:http://spaces.ac.cn/archives/...

若是您以爲本文還不錯,歡迎點擊下面的按鈕對博主進行打賞。打賞並不是要從中得到收益,而是但願知道有多少人曾在科學空間駐足。固然,若是你無視它,也不會影響你的閱讀。再次表示歡迎和感謝!

相關文章
相關標籤/搜索