鄔明強,鄔佳明,辛偉彬
1(廣東東軟學(xué)院 數(shù)字媒體與設(shè)計學(xué)院,佛山 528200)
2(開封大學(xué) 軟件職業(yè)技術(shù)學(xué)院,開封 475004)
進入大數(shù)據(jù)時代、互聯(lián)網(wǎng)+時代,數(shù)據(jù)呈現(xiàn)指數(shù)級增長.微博的社交關(guān)系,淘寶的購物記錄,不同類型的新聞信息,諸如娛樂、軍事、體育等這些形形色色的數(shù)據(jù)包括了人們的各種行為活動的細節(jié)[1].據(jù)統(tǒng)計,1998年3月,我國第一筆互聯(lián)網(wǎng)網(wǎng)上交易成功,標(biāo)志著網(wǎng)上購物在中國的興起;2001年底,我國互聯(lián)網(wǎng)用戶數(shù)增長為3370萬,網(wǎng)上購物的交易額僅為6億元;2010年中國網(wǎng)絡(luò)購物交易規(guī)模就已經(jīng)達到了5000億.線下沒有的,照樣可以網(wǎng)購到,而在琳瑯滿目的物品中挑選出合適物品的一個很重要途徑的就是看評價.因為其他顧客購買該物品后,一般會對產(chǎn)品進行評論,所以只要他或她挑選出了中意的商品,再結(jié)合評論區(qū)的評論就可以很容易的對所購的商品進行更全面的了解.
同時,隨著智能手機的快速普及,一些飲食類APP,如美團、餓了么應(yīng)運而生,住宿類APP如去哪兒網(wǎng)、攜程網(wǎng)等人們已司空見慣,面對眾多的餐館、魚龍混雜的酒店、賓館,用戶如何根據(jù)自己的需求選擇一個性價比最優(yōu)的呢? 顯然最好的方式是查看大量已有的評價數(shù)據(jù).本文正是在此背景下從眾多的數(shù)據(jù)集中選取了一定數(shù)量的其中3類數(shù)據(jù)集,借助計算機信息技術(shù)的優(yōu)勢對已有的文本進行處理,進而構(gòu)造一個可靠的情感分類系統(tǒng),通過情感分類算法對大量的情感分類數(shù)據(jù)進行訓(xùn)練構(gòu)造出相應(yīng)的模型,一旦有新的評價數(shù)據(jù)到來,只需要導(dǎo)入該系統(tǒng)就可以快速地完成情感的分析分類.
1.1.1 情感分類方法介紹
常見的情感分類方法有五大類:基于詞典的方法、基于機器學(xué)習(xí)的方法、詞典與機器學(xué)習(xí)相結(jié)合的方法、基于弱標(biāo)注信息的方法以及基于深度學(xué)習(xí)的方法.其中基于詞典方法的模式是“詞典+規(guī)則”,即以情感詞典作為判斷情感極性的主要依據(jù),同時兼顧評論數(shù)據(jù)中的句法結(jié)構(gòu),設(shè)計相應(yīng)的判斷規(guī)則;基于機器學(xué)習(xí)的方法主要依賴特征工程,通過n-gram方法、Partof-Speech方法、句法特征方法、TF-IDF方法提取出一定數(shù)量的滿足條件的特征,再放到情感詞典中進行匹配,進而推斷出情感的性質(zhì);將詞典與機器學(xué)習(xí)融合起來的方法可以將“詞典+規(guī)則”視為簡單的分類器或者將詞典信息作為特征與現(xiàn)有特征進行結(jié)合,選擇最優(yōu)的特征組合進行情感分類;基于弱標(biāo)注信息的情感分類方法試圖從用戶產(chǎn)生的數(shù)據(jù)中挖掘有助于訓(xùn)練情感分類器的信息,比如評論評分、微博表情符號等,加入情感詞典進行分類.
前面幾種方法都屬于傳統(tǒng)的文本情感分類方法,在文本分類的表現(xiàn)上仍然有很多不足的地方,因為在分類過程中需要加入很多人為因素來對某種場景下的情感進行分類,尤其在語料的訓(xùn)練和情感詞典的建立方面體現(xiàn)的更明顯,如果不是語言學(xué)家或者擁有濃厚的語言背景知識,那么整個情感分類的結(jié)果就會受到很大的影響.而基于深度學(xué)習(xí)的情感分類方法克服了傳統(tǒng)方法的不足,首先要求從大量評論數(shù)據(jù)中學(xué)習(xí)出語義詞向量,然后通過不同的語義合成方法用詞向量得到對應(yīng)句子或文檔的特征表達,再通過構(gòu)建的神經(jīng)網(wǎng)絡(luò)模型導(dǎo)入相關(guān)的句向量就可以讓模型自動通過前向傳播算法和反向傳播算法不斷對參數(shù)進行迭代更新以減少loss函數(shù)值來提升分類準(zhǔn)確率,這個過程中我們只需要設(shè)置一些參數(shù)即可,包括輸入層數(shù)量、隱藏層數(shù)量、各層之間的權(quán)重、隱藏層及之前需要的偏置值、學(xué)習(xí)率、激活函數(shù)等就可以訓(xùn)練出一個情感分類的模型.
1.1.2 深度學(xué)習(xí)情感分類方法發(fā)展
傳統(tǒng)的情感分類方法包括樸素貝葉斯方法、最近鄰方法、支持向量機方法等,準(zhǔn)確率受到了很大限制,隨著深度學(xué)習(xí)的興起以及數(shù)據(jù)處理能力的不斷提升,深度學(xué)習(xí)技術(shù)廣泛用于圖像處理、語音識別、自然語言處理等方面.RNN循環(huán)神經(jīng)網(wǎng)絡(luò)方法作為自然語言處理的一種方法因為不能記住太前或太后的內(nèi)容,所以仍然有一定的局限性,而LSTM神經(jīng)網(wǎng)絡(luò)(Long Short Term Memory)作為RNN網(wǎng)絡(luò)的一種變種,它通過在普通的RNN基礎(chǔ)上,在隱藏層各神經(jīng)元中增加記憶單元,從而使時間序列上的記憶信息可控,每次在隱藏層各個單元間傳遞時通過幾個可控門(遺忘門、輸入門、候選門、輸出門),來控制之前信息和當(dāng)前信息的記憶和遺忘程度,從而具有長期記憶功能[2].本文采用的正是Word2Vec與LSTM相結(jié)合的情感分析方法.
1.2.1 Word2Vec
Word2Vec摒棄了傳統(tǒng)方法的one-hot編碼方式,將一個詞語對應(yīng)一個多維向量,通過該多維向量允許我們用變化較小的數(shù)字來表征詞語,如果用20維向量理論上就可以表征220=1048 576個詞語了,通過一定方法,比如歐氏距離或者余弦相似度就可以把相近意思的詞語放在相近的位置,而且一般用的是實數(shù)向量[3].通過將所有的詞向量化,詞與詞之間就可以定量的度量他們之間的關(guān)系.
1.2.2 LSTM簡介
LSTM,是為了解決長期以來問題而專門設(shè)計出來的它是在RNN的基礎(chǔ)上衍生來的,當(dāng)相關(guān)的信息和要預(yù)測的詞的位置之間的間隔很小時,RNN可以學(xué)會使用先前的信息,但是當(dāng)相關(guān)信息和當(dāng)前預(yù)測位置相隔較遠時,RNN會喪失學(xué)習(xí)到很遠信息的能力.LSTM通過刻意的設(shè)計來避免長期依賴問題.記住長期的信息在實踐中是LSTM的默認(rèn)行為,LSTM重復(fù)模塊中包含四個交互的層.其中遺忘門決定我們從細胞狀態(tài)中丟棄什么信息,輸入門決定多少新信息加入到細胞狀態(tài)中來,輸出門決定輸出什么值[4].LSTM結(jié)構(gòu)圖如圖1所示.
1.2.3 LSTM情感分類處理流程
先使用Word2Vec模型將詞向量的集合對應(yīng)成句子,這樣就能夠得到表征該句子的句向量,然后將句向量作為神經(jīng)網(wǎng)絡(luò)模型的輸入部分,向量的每個分量對應(yīng)神經(jīng)網(wǎng)絡(luò)的輸入層節(jié)點,隱藏層可以根據(jù)經(jīng)驗進行設(shè)置,輸出層的節(jié)點個數(shù)就是我們要分類的類別數(shù).情感分類流程圖如圖2所示.
圖1 LSTM結(jié)構(gòu)圖
圖2 情感分類流程圖
選取了一定數(shù)量的語料后,就進入了數(shù)據(jù)預(yù)處理階段,包括分詞、去停用詞,接著使用Word2Vec模型訓(xùn)練出一定數(shù)量的情感詞典,然后使用Keras模型搭建出一個LSTM結(jié)構(gòu),設(shè)置好網(wǎng)絡(luò)的輸入層、隱藏層、輸出層,然后進行調(diào)優(yōu),包括設(shè)置學(xué)習(xí)率、激活函數(shù)、損失函數(shù),選取優(yōu)化器等.實驗處理的流程如圖3所示.
圖3 本文文本分類處理流程圖
本文分別選取了網(wǎng)上關(guān)于書籍、酒店住宿、手機的評論數(shù)據(jù)作為實驗用的語料,一共21 090條,每一類數(shù)量均為7030.現(xiàn)從每一類隨機抽取一些數(shù)據(jù)集,包括積極、中性、消極3類,每一類的數(shù)據(jù)集均劃分成訓(xùn)練集、驗證集、測試集3部分,比例都為6:2:2,數(shù)據(jù)存儲在csv格式的數(shù)據(jù)文件中.各部分?jǐn)?shù)據(jù)的數(shù)量如表1所示.
表1 數(shù)據(jù)集劃分表
本文使用結(jié)巴庫中的lcut方法對中文句子進行切分,jieba庫作為Python自帶的第三方中文分詞庫,功能非常強大,分詞的準(zhǔn)確率與速度均高于同類的分詞軟件.
通過Google提出的Word2Vec模型來訓(xùn)練情感詞典,將文本的內(nèi)容轉(zhuǎn)換為向量來表征[5].利用向量的夾角公式來計算詞與詞的相似度,詞向量一般是實數(shù)值形式的,表征的范圍更大、效率更高.通過Wikipedia獲取大量的語料進行訓(xùn)練,通過分詞、去停用詞、利用Word2Vec模型進行特征提取等最終將不同性質(zhì)的詞語歸為一類并用高維的實型向量表示[6].
創(chuàng)建單詞到索引的映射以及單詞到詞向量的映射,若單詞的索引數(shù)小于10,則設(shè)置為0,若詞語的索引為0,則詞向量也為0,若詞語的索引不為0,則詞向量的分量為該詞語在情感詞典中的出現(xiàn)次數(shù).接著分別獲取訓(xùn)練集及其標(biāo)簽、驗證集及其標(biāo)簽、測試集及其標(biāo)簽構(gòu)造的詞向量.詞匯的維度假設(shè)為100維,那么訓(xùn)練集、驗證集及測試集的數(shù)據(jù)維度均為提取的詞匯大小×100,標(biāo)簽數(shù)據(jù)對應(yīng)的維度均為詞匯大小×3.
本文通過Keras框架構(gòu)建了一個LSTM神經(jīng)網(wǎng)絡(luò)模型,其中模型的基本結(jié)構(gòu)為:輸入層InputLayer為輸入的序列編碼成的向量維度,有向量維度大小的神經(jīng)元,隱藏層HidenLayer的大小可以自由設(shè)置,這里設(shè)置為64,輸出層Softmax的大小為情感分類的類別,這里進行的是三分類,所以輸出層有3個神經(jīng)元,分別代表積極類、中性類與消極類[7].部分結(jié)構(gòu)代碼設(shè)置如下:
np.concatenate((np.ones(len(pos),dtype=int),np.zero s(len(neu),dtype=int),-1*np.ones(len(neg),dtype=int)))/*pos類類別標(biāo)簽為1,neu類類別標(biāo)簽為0,neg類類別標(biāo)簽為-1 */
model.add(LSTM(HIDDEN_LAYER_SIZE,dropout=0.2,recurrent_dropout=0.2))
model.add(Dense(3,activation=‘softmax’))/*LSTM情感分類模型搭建 */
構(gòu)造LSTM模型之前,先做如下預(yù)處理:
1)變長序列的處理
因為每一類別下的數(shù)據(jù)集中句子的長度都不相等,所以需要將變長序列轉(zhuǎn)換成定長序列來處理:首先在所有句子中選取一個最大長度的句子,這里設(shè)定序列最大長度maxlen為100,不足這個長度的序列補0,然后在embedding層中過濾掉指定字符,通過該層能將序列映射到一個固定維度的空間中,代碼如下:
model.add(Embedding(output_dim=vocab_dim,
input_dim=n_symbols,
input_length=input_length))
2)數(shù)據(jù)歸一化
數(shù)據(jù)歸一化的目的是將原本不同量綱的數(shù)據(jù)經(jīng)過標(biāo)準(zhǔn)化處理后,讓不同的數(shù)據(jù)處于同一數(shù)量級,這樣各數(shù)據(jù)指標(biāo)之間會具有更好的可比性.這里使用Z-score標(biāo)準(zhǔn)化方法:用樣本的數(shù)據(jù)減去均值再除以標(biāo)準(zhǔn)差,如下所示,這里僅列舉出訓(xùn)練集數(shù)據(jù)標(biāo)準(zhǔn)化代碼:
x_train=np.array(x_train,dtype=np.float)#將數(shù)據(jù)類型轉(zhuǎn)換為float
x_train-=np.mean(x_train,axis=1).reshape(16870,1)# zero-center #求出每一行的均值
x_train /=np.std(x_train,axis=1)# normalize
#數(shù)據(jù)未歸一化和歸一化后的測試準(zhǔn)確率比較如表2所示.
表2 歸一化前后準(zhǔn)確率對比表
所以,在模型構(gòu)造時,數(shù)據(jù)不經(jīng)過歸一化處理模型的效果更好.
3)權(quán)重初始化
LSTM作為神經(jīng)網(wǎng)絡(luò)的一種模型,訓(xùn)練過程中也要及時的對權(quán)重進行更新,在更新前,需要給每個權(quán)重一個初始值.這里有3種初始化權(quán)重的方式:
第一種方式是把索引為0的詞語權(quán)重初始化為0,索引為1的詞語開始每個詞語按照其對應(yīng)的詞向量大小進行初始化.
第二種方式是Xavier初始化,具體方式如下:
Weights=np.random.randn(node_in,node_out))/np.sqrt(node_in)
其中node_in為前一層神經(jīng)元節(jié)點,node_out為后一層神經(jīng)元節(jié)點.
第三種初始化的方式是He初始化,它是在Xavier初始化的基礎(chǔ)上,將分母中的方差節(jié)點除以2即可[8].實驗發(fā)現(xiàn),當(dāng)使用He初始化時,測試集數(shù)據(jù)的準(zhǔn)確率最高.
當(dāng)前訓(xùn)練的數(shù)據(jù)量達上萬條,所以需要將數(shù)據(jù)集分成多個小塊,實驗發(fā)現(xiàn)當(dāng)訓(xùn)練輪數(shù)epoch達到30輪之前val loss不斷下降,test loss不斷下降;當(dāng)輪數(shù)超過30輪時,val loss與test loss趨于穩(wěn)定,所以epoch=30為最優(yōu)訓(xùn)練輪數(shù).
影響LSTM模型準(zhǔn)確率的因素非常多,其中就包含各種不同性質(zhì)的超參數(shù),比如損失函數(shù)、優(yōu)化器種類、學(xué)習(xí)率的大小、激活函數(shù)的選取等,這里選取影響LSTM模型的主要因素進行分析,分別如下所示.
1)損失函數(shù)Loss
通過損失函數(shù)的連續(xù)變化,使預(yù)測數(shù)據(jù)的真實值和實際值的誤差不斷減少,這樣就可以對給定的模型進行預(yù)測了,對于多分類來說,常見的損失函數(shù)可以為categorical_crossentropy或mean square error.
當(dāng)選用的損失函數(shù)為mean square error時,測試集的總體準(zhǔn)確率最高.
2)學(xué)習(xí)率Lr
根據(jù)經(jīng)驗,學(xué)習(xí)率是用來控制模型的學(xué)習(xí)進度,一般設(shè)置在0.001~10之間時樣本訓(xùn)練的效果最好[9].當(dāng)學(xué)習(xí)率設(shè)置為0.001,0.01,0.1,1,10時,不同學(xué)習(xí)率對應(yīng)的準(zhǔn)確率如圖4所示.
從圖4可以看出,當(dāng)學(xué)習(xí)率設(shè)置為0.001時,模型的訓(xùn)練效果最好.
3)優(yōu)化器Optimizer
因為LSTM模型可以設(shè)定的參數(shù)很多,參數(shù)空間比較復(fù)雜,所以優(yōu)化問題比較困難,為了尋求最優(yōu)參數(shù),在模型編譯時選擇了不同的優(yōu)化器進行優(yōu)化,其中包括SGD、Momentum、AdaGrad、Adam等[9],其中SGD又稱隨機梯度下降法,函數(shù)會沿著當(dāng)前位置呈“之”字形往下移動,對參數(shù)更新時使用的學(xué)習(xí)率相同,Momentum借用了物理上“動量”的概念,就像小球一樣在地面上滾動,它在面對小而連續(xù)的梯度時,學(xué)習(xí)的更快,AdaGrad優(yōu)化器能在學(xué)習(xí)的過程中不斷減少學(xué)習(xí)率,并隨著學(xué)習(xí)的進行可以適當(dāng)?shù)恼{(diào)整,Adam優(yōu)化器是將Momentum與AdaGrad方法融合到一起創(chuàng)建的,它既可以按照類似小球在碗中滾動的物理規(guī)則進行移動,也可以動態(tài)地調(diào)整更新過程中的學(xué)習(xí)率[9].除此之外,還有Adamax、Nadam、RMSProp等優(yōu)化器.不同優(yōu)化器準(zhǔn)確率如圖5所示.
圖4 不同學(xué)習(xí)率對應(yīng)的準(zhǔn)確率圖
圖5 不同優(yōu)化器對應(yīng)的準(zhǔn)確率圖
可以看出,當(dāng)優(yōu)化器選擇RMSProp時,模型訓(xùn)練效果最好.
4)激活函數(shù)
激活函數(shù)可以將神經(jīng)網(wǎng)絡(luò)線性的輸入轉(zhuǎn)化到一定范圍的非線性值,從而使神經(jīng)網(wǎng)絡(luò)表達能力更加強大,網(wǎng)絡(luò)理論上可以逼近任意函數(shù).在本文的多分類情感分析模型中,主要選擇了3種激活函數(shù):tanh、relu、Softmax[10],在訓(xùn)練輪數(shù)、學(xué)習(xí)率、損失函數(shù)、優(yōu)化器等參數(shù)確定的情況下,通過實驗可以得出不同激活函數(shù)作用下測試集總體的準(zhǔn)確率.如表3所示.
表3 不同激活函數(shù)作用下的準(zhǔn)確率表
從表3可以看出,當(dāng)激活函數(shù)選擇tanh時測試集的準(zhǔn)確率最高.
當(dāng)然,為了防止過擬合,程序中使用了Dropout方法,該方法是在訓(xùn)練過程中隨機選出一定比例隱藏層的神經(jīng)元,將其刪除,被刪除的神經(jīng)元不再進行信號的傳遞,輸出的神經(jīng)元要乘上訓(xùn)練時的刪除比例然后再輸出.經(jīng)過多次實驗證明,dropout=0.2時,效果最好.
本次實驗的硬件環(huán)境為:CPU為i7-6700HQ@2.60 GHz,內(nèi)存為8 GB,顯卡為GTX965M;軟件環(huán)境為:Eclipse作為開發(fā)工具,使用anaconda自帶的Python解釋器作為PyDev的Intepreter,使用keras框架來實現(xiàn)LSTM神經(jīng)網(wǎng)絡(luò)模型,使用Python的工具包gensim來訓(xùn)練Word2Vec模型,使用matplotlib庫來繪制本實驗中相關(guān)的圖形.
經(jīng)過反復(fù)實驗測試,當(dāng)數(shù)據(jù)沒有歸一化、使用He初始化權(quán)重、學(xué)習(xí)率為0.001、損失函數(shù)為Mean Square Error(簡稱MSE)、優(yōu)化器選擇RMSProp、激活函數(shù)選擇tanh、訓(xùn)練輪數(shù)達到30輪時,模型總體測試集的準(zhǔn)確率最高,這些參數(shù)組合到一起時訓(xùn)練的效果最好.這里采用準(zhǔn)確率召回率和f1值進行評估[11].此時,模型訓(xùn)練的準(zhǔn)確率同SVM多分類方法比較如表4所示.
表4 不同方法性能對照表
其中,SVM方法先通過PCA方法將高維的特征向量降低到100維,對于三個類別,先將其轉(zhuǎn)換成兩個類別的分類問題,然后采取投票的方式,確定最終的類別.算法大致如下:
1)將正類中性類負(fù)類的測試集票數(shù)都設(shè)置為0.
2)構(gòu)造正類-負(fù)類分類器如果當(dāng)前測試集數(shù)據(jù)判定的類別為正類,則正類票數(shù)加1,否則負(fù)類票數(shù)加1.
3)接著構(gòu)造正類-中性類分類器、中性類-負(fù)類分類器,按類似方式對測試的數(shù)據(jù)集進行投票.
4)最終正類、中性類和負(fù)類中票數(shù)最多的那一類就是當(dāng)前測試數(shù)據(jù)所屬的類別.
驗證集與測試集各自的損失函數(shù)值隨訓(xùn)練輪數(shù)變化的曲線圖如圖6所示.
圖6 驗證集與測試集損失函數(shù)值隨訓(xùn)練輪數(shù)變化圖
隨著訓(xùn)練輪數(shù)的增加,驗證集與測試集的準(zhǔn)確率不斷接近,沒有過擬合現(xiàn)象發(fā)生,驗證集和測試集的準(zhǔn)確率隨著輪數(shù)的變化曲線圖如圖7所示.
圖7 驗證集和測試集準(zhǔn)確率隨訓(xùn)練輪數(shù)變化圖
將model.compile()函數(shù)中的metrics參數(shù)的值分別修改為recall和f1,再分別定義出召回率recall、精確率precision及f1三個函數(shù),通過30個epoch的迭代計算,就可以得到驗證集與測試集在每一輪中的召回率與f1值隨訓(xùn)練輪數(shù)的變化結(jié)果.如圖8和圖9所示.
圖8 驗證集和測試集召回率隨訓(xùn)練輪數(shù)變化圖
圖9 驗證集和測試集f1值隨訓(xùn)練輪數(shù)變化圖
情感分類問題是一個在很多領(lǐng)域都很常見的問題,除本文用到的評論數(shù)據(jù)外,網(wǎng)上隨處可見的一些新聞評論、微博評論、貼吧評論、qq空間評論,還有歌曲評論、網(wǎng)絡(luò)電影評論等,使用傳統(tǒng)的方法,比如SVM、KNN來分類,不但準(zhǔn)確率提升的幅度有限,而且需要人工提取特征向量,效率很低.
本文使用深度學(xué)習(xí)中的LSTM模型,同時結(jié)合Word2Vec工具創(chuàng)建出當(dāng)前領(lǐng)域范圍的情感詞典,然后將語料中的詞語用高維的詞向量表示,接著用一個Embedding層將詞向量嵌入到LSTM模型的隱層中,最后連上一個Softmax輸出層,這樣就建立了一個多分類的情感分類器.影響神經(jīng)網(wǎng)絡(luò)模型精度的參數(shù)非常多,本文選取了學(xué)習(xí)率、損失函數(shù)、優(yōu)化器、激活函數(shù)等為主要評價指標(biāo),分析了它們對當(dāng)前模型準(zhǔn)確率的影響,最終確定了一組最優(yōu)的參數(shù).實驗證明,該方法能夠在一定規(guī)模的數(shù)據(jù)集上有效地解決多類別情感分類問題!