王衛(wèi)紅,金凌劍
(浙江工業(yè)大學(xué) 計算機科學(xué)與技術(shù)學(xué)院,浙江 杭州 310023)
情感分析是指在給定的評論中確定評論者的情緒傾向,一般分為正面情緒和負面情緒。廣泛使用的情感分析方法有以情感詞典為基礎(chǔ)的方法、以傳統(tǒng)機器學(xué)習(xí)為基礎(chǔ)的方法和以深度學(xué)習(xí)為基礎(chǔ)的方法。情感分析是從一句簡單的評論中得出評論者的情緒,是近年來自然語言處理的一個熱門。Spark是一個優(yōu)秀的大數(shù)據(jù)處理框架,相比較于Hadoop在速度、通用性、易用性、兼容性等方面都有更好的表現(xiàn),同時Spark提供了各種機器學(xué)習(xí)算法,可以更好地進行數(shù)據(jù)分析[1]。隨著社會的發(fā)展,傳統(tǒng)的情感分析方法已經(jīng)不能滿足不斷增大的信息量和人們對于準確性的要求。針對這兩點,國內(nèi)外學(xué)者進行了大量的研究[2]。Mogha等[3]基于Spark,比較了樸素貝葉斯、決策樹、隨機森林等算法的分類準確性,結(jié)果顯示決策樹算法的結(jié)果最好。Baltas等[4]在Spark平臺下對Twitter數(shù)據(jù)進行情感分析,得出樸素貝葉斯的分類效果最佳。Hai等[5]在Spark集群中研究樸素貝葉斯和隨機森林兩種算法的分類結(jié)果,發(fā)現(xiàn)兩種算法的準確率都不錯。上面的文章都是在Spark平臺上對不同算法進行的比較,并沒有對算法的創(chuàng)新,更多的是在尋找最佳資源和最佳參數(shù)配置。Govindarajan等[6]基于樸素貝葉斯和遺傳算法提出了混合的分類算法,此方法在精度上要比單獨的樸素貝葉斯和遺傳算法更好。雖然對于單獨的樸素貝葉斯和遺傳算法來說,測試時間由于數(shù)據(jù)維度的減少而減少了,但對于集成算法來說效率還有待提升。Sharma等[7]提出基于Boosting的SVM情感分析模型,Boosting算法由Kearns等[8]提出,這種算法可以有效地提高SVM模型的效率,使準確性顯著優(yōu)于單一支持向量機,可是這樣一來算法的復(fù)雜度增加了,而且運算效率也不如從前。Dong等[9]基于神經(jīng)網(wǎng)絡(luò),以自適應(yīng)和遞歸的方法提出了AdaRNN,該算法的分析中加入了對上下文以及句子語法的標記,以自適應(yīng)的方式傳播,使情感分類具有關(guān)鍵詞依賴性,提高了準確率,但同樣也增加了復(fù)雜度。這幾篇文章對算法作出了自己的改進,提高了分類的準確性,但同時也降低了效率。
在上述的背景下,筆者提出了一種以Spark平臺為基礎(chǔ),結(jié)合多種算法的集成算法來進行英文評論數(shù)據(jù)的情感分析。首先對評論數(shù)據(jù)進行預(yù)處理,得出情感標簽和評論內(nèi)容;然后對評論內(nèi)容進行分詞處理,并去除停用詞、標點符號和稀有詞;接著使用改進后的TF-IDF算法獲得特征向量,以AdaBoost算法對決策樹和SVM進行弱分類器訓(xùn)練,最后將兩種分類器的所有分類器根據(jù)權(quán)值集成為最終分類器,使用最終分類器得到最終分類結(jié)果。
圖1為文本數(shù)據(jù)處理流程圖。先輸入文本數(shù)據(jù),然后篩除非法詞,再篩除無影響詞,接著提取特征向量并輸出。
圖1 文本數(shù)據(jù)處理流程圖Fig.1 The flow chart of the text data processing
這里的特征向量提取使用了改進后的TF-IDF算法,此算法通過修飾情感詞的副詞來決定情感詞的權(quán)重,關(guān)注了詞與詞之間的聯(lián)系,這種內(nèi)在聯(lián)系可以使后續(xù)的處理效果提升。
非法詞包括不是英文字母的字符、數(shù)字和單個字母。將評論數(shù)據(jù)以空格為分隔符進行分詞,使用正則表達式去除非英文字母的字符和數(shù)字。將剩下的單詞進行長度計算,篩除長度為一的單詞。
無影響詞包括停用詞和稀有詞。停用詞包括a、the、and、be、as等891 個與情感無關(guān)的詞,稀有詞指只出現(xiàn)過一次的詞。將篩除非法詞后的數(shù)據(jù)進行進一步的篩選,引入停用詞表,將數(shù)據(jù)中的停用詞刪除。統(tǒng)計所有詞匯出現(xiàn)的次數(shù),將出現(xiàn)次數(shù)為一的也刪除。
筆者使用的是改進后的TF-IDF特征向量提取算法。詞頻-逆向文件頻率(TF-IDF)[10]是一種在文本挖掘和向量化中常用的加權(quán)技術(shù),它主要用來表現(xiàn)某個詞語在某篇文章中的重要程度。TF-IDF實際上是TF與IDF的乘積。TF詞頻,指的是某個詞語在某篇文章中出現(xiàn)的次數(shù)。IDF逆向文件頻率用來衡量一個詞語普遍重要性。任意一個特定詞語的IDF,都可以用總文件數(shù)目除以包含該詞語的文件的數(shù)目,再對上述結(jié)果取對數(shù)得到。某個詞語在某個文件中的較高頻率,以及該詞語在所有文件中的較低頻率,可以產(chǎn)生出高權(quán)重的TF-IDF。因此,TF-IDF傾向于過濾掉常見的詞語,保留重要的詞語。在TF-IDF的原理中,某個詞語在某篇文章中出現(xiàn)的頻率高,在其他文件中出現(xiàn)的頻率很低,那么這個詞語就具有很好的分類能力,適合用來分類。TF,IDF可表示為
(1)
(2)
TFi,j-IDFi=TFi,j×IDFi
(3)
傳統(tǒng)的TF-IDF算法存在明顯的不足之處。它簡單地認為文本頻率小的單詞就重要,而文本頻率大的則沒什么用處。這使得它不能很好地反應(yīng)單詞的有用程度,對于分類問題來說,最重要的是單詞能夠反應(yīng)它所在的類,然而傳統(tǒng)的方法沒有考慮特征項在不同類別里的分布。同時傳統(tǒng)方法不能很好地辨別情感詞,也沒有關(guān)聯(lián)上下文的功能,程度副詞如“很”“非?!钡仍~在修飾情感詞時應(yīng)當提高情感詞的得分。
根據(jù)上述的不足提出一種改進的特征提取方法,修改TF特征值的權(quán)重為
(4)
(5)
計算單詞ti在各個分類中的平均詞頻為
(6)
則類間的離散度[11]用標準差與平均值之商表示為
(7)
當特征項只在一個類別出現(xiàn)時,離散度取值最大為1,當特征值在所有類別都出現(xiàn)時,離散度取值最小為0。綜上所述TF-IDF可以轉(zhuǎn)換為
(8)
最終對每一個特征項進行評估時就不是簡單地將詞頻與逆文檔頻率相乘,而是考慮了情感詞與程度副詞的關(guān)系和特征項與類別的關(guān)系。
決策樹(Decision tree)[12-13],作為一種歸納學(xué)習(xí)算法,其重點是將看似無序、雜亂的已知實例,通過某種技術(shù)手段將它們轉(zhuǎn)化成可以預(yù)測未知實例的樹狀模型,每個內(nèi)部節(jié)點都是對某個屬性的一次測試,樹中的每一條路徑代表某個測試的輸出,每條路徑都有一個終點,稱之為葉節(jié)點,每個葉節(jié)點則代表不同的類別。決策樹算法的優(yōu)勢在于,它不僅簡單易于理解,而且高效實用,構(gòu)建一次,就可以多次使用,或者只對樹模型進行簡單地維護就可以保持其分類的準確性。支持向量機(Support vector machine)[14-15]是一類按監(jiān)督學(xué)習(xí)方式對數(shù)據(jù)進行二元分類的廣義線性分類器,其決策邊界是對學(xué)習(xí)樣本求解的最大邊距超平面。SVM使用鉸鏈損失函數(shù)計算經(jīng)驗風(fēng)險并在求解系統(tǒng)中加入了正則化項以優(yōu)化結(jié)構(gòu)風(fēng)險,是一個具有稀疏性和穩(wěn)健性的分類器。因為梯度提升決策樹算法(Gradient boosting decision tree)在各方面的優(yōu)越表現(xiàn)[16-17],讓筆者明白了決策樹算法的迭代能夠有效提高算法的準確性。SVM基于結(jié)構(gòu)風(fēng)險最小化的學(xué)習(xí)技術(shù),使它在很多數(shù)據(jù)集上都有優(yōu)秀的表現(xiàn),特別是在平衡的數(shù)據(jù)集上具有較好的分類性能和泛化能力,因為筆者使用的是較平衡的數(shù)據(jù)且AdaBoost又是一個迭代的算法,所以選用它們兩個作為弱分類算法。
AdaBoost算法是一種提升方法,將多個弱分類器,組合成強分類器,由Yoav Freund和Robert E Schapire在1995年提出[18]。作為一種Boosting方法,AdaBoost在很多算法上都有著不俗的表現(xiàn)[19-22]。它主要是將前面一個弱分類器分錯的樣本進行權(quán)值加強,然后使用權(quán)值更新后的樣本來訓(xùn)練下面一個新的弱分類器。在每輪訓(xùn)練中,用樣本總體訓(xùn)練新的弱分類器,產(chǎn)生新的樣本權(quán)值以及該弱分類器的話語權(quán),一直迭代直到達到預(yù)定的錯誤率或達到指定的最大迭代次數(shù)。通過第一步和第二步的操作,分別得出決策樹算法和SVM算法的弱分類器,最后通過第三步將兩個算法的弱分類器集成為一個強分類器模型。步驟如下:
1) 訓(xùn)練數(shù)據(jù)(每個樣本)的權(quán)值賦予。設(shè)有N個樣本,則每一個訓(xùn)練的樣本點最開始時都給一個一樣的權(quán)值w,值為1/N,其權(quán)值表達式為
D1=(w11,w12,…,w1i,…,w1N)
(9)
式中:D1為第1次迭代每個樣本的權(quán)值;w1i為第1次迭代時的第i個樣本的權(quán)值;N為樣本總數(shù)。
2) 訓(xùn)練弱分類器。設(shè)進行m次迭代,此時的權(quán)值為Dm,此時的基本分類器為Gm(x)。計算Gm(x)在訓(xùn)練數(shù)據(jù)集上的分類誤差率為
(10)
式中yi為訓(xùn)練數(shù)據(jù)中的類別標簽??梢灾勒`差率就是被誤分類樣本的權(quán)值之和。根據(jù)誤差率可以計算各分類器的權(quán)值,也就是基本分類器在最終分類器中的權(quán)重為
(11)
然后更新訓(xùn)練數(shù)據(jù)的權(quán)值,在訓(xùn)練過程中,如果某個樣本的類別已經(jīng)確認,那么在下一次訓(xùn)練中,它的權(quán)重就被降低;相反,如果某個樣本的類別還沒有確認,那么它的權(quán)重Dm就得到提高,其計算式為
Dm+1=(wm+1,1,wm+1,2,…,wm+1,i,…,wm+1,N)
(12)
i=1,2,…,N
(13)
式中:Dm+1為下一次迭代時的樣本權(quán)值;wm+1,i為下一次迭代時第i個樣本的權(quán)值;Zm為歸一化因子,使得所有樣本對應(yīng)的權(quán)值之和為1,可表示為
(14)
3) 強分類器的構(gòu)建。每次訓(xùn)練結(jié)束都會得到一個弱分類器,通過計算它們的誤差率來確定它們在最終分類函數(shù)中的話語權(quán)。誤差率高的弱分類器話語權(quán)低,誤差率低的弱分類器話語權(quán)高。換言之,誤差率低的弱分類器在最終分類器中占的比例較大,反之較小。這里得到的弱分類器有兩種,分別是決策樹弱分類器和支持向量機弱分類器。因為兩種分類器的權(quán)值可能處于不同數(shù)量級,所以將它們的權(quán)值分別進行標準化操作,其計算式為
(15)
(16)
(17)
式中:G_DTm(x)為決策樹弱分類器;G_SVMm(x)為支持向量機弱分類器。得到最終分類器為
(18)
算法的實現(xiàn)流程如圖2所示。
圖2 集成算法的實現(xiàn)流程圖Fig.2 The implementation flow chart of the integration algorithm
本實驗采用Hadoop和Spark分布式架構(gòu)來進行實驗,實驗中使用的軟件版本和環(huán)境配置如表1所示。
表1 實驗環(huán)境Table 1 Experimental environment
筆者數(shù)據(jù)采用kaggle[23]網(wǎng)站中Amazon用戶的英文評論。選取了訓(xùn)練數(shù)據(jù)100 000 條,其中包含正面情緒數(shù)據(jù)和負面情緒數(shù)據(jù)各50 000 條;測試數(shù)據(jù)10 000 條,其中包含正面情緒數(shù)據(jù)和負面情緒數(shù)據(jù)各5 000 條。數(shù)據(jù)包含兩個部分,一個是區(qū)分正負面情緒的標簽,_label_1表示負面情緒,_label_2表示正面情緒;另一個是評論的內(nèi)容。
根據(jù)1.3節(jié)中改進的TF-IDF算法和2節(jié)中的集成分類模型,針對不同的分布式平臺進行了實驗,如表2所示。
表2 不同平臺下不同算法的耗時
表2記錄了Hadoop平臺和Spark平臺對于不同算法在數(shù)據(jù)預(yù)處理和算法預(yù)測上的平均耗時。其中IDT和ISVM表示使用了改進后的TF-IDF算法,I-集成算法不但使用了改進后的TF-IDF算法還將決策樹和SVM集成,而集成算法僅僅集成了決策樹和SVM,使用的還是傳統(tǒng)的TF-IDF。從整體數(shù)據(jù)上看,Spark無論是在數(shù)據(jù)處理上的耗時還是算法預(yù)測上的耗時都少于Hadoop平臺。單個比較數(shù)據(jù)處理的耗時來看,Spark在數(shù)據(jù)處理上的速度是Hadoop的好幾倍;而從算法預(yù)測的耗時上看Spark的優(yōu)勢并不明顯。
此處還添加了名為AdaBoostSVM的集成算法[24],此算法采用基于SVM的AdaBoost算法。從實驗數(shù)據(jù)上看:由于使用傳統(tǒng)的TF-IDF算法,且沒有集成其他算法,所以在數(shù)據(jù)處理上的耗時與SVM算法相差不大,與筆者的集成算法相比要少。而從算法預(yù)測耗時上看:無論是在Hadoop平臺還是Spark平臺,此算法就比筆者的集成算法要多不少。
如圖3所示,筆者還實驗了不同的節(jié)點數(shù)對于耗時的影響,這里主要使用的是集成算法在兩大平臺的耗時。對于兩大平臺來說,一開始的耗時是隨著節(jié)點數(shù)的增加,耗時也減少,到了一定節(jié)點數(shù)之后節(jié)點數(shù)對于耗時的影響就不大了。
圖3 不同節(jié)點數(shù)的耗時Fig.3 Time-consuming of different number of nodes
對于不同的算法,進行了情感分析的分類實驗,圖4展示了不同算法的分類準確率。其中DT和SVM算法都使用了原始的TF-IDF算法,而IDT和ISVM算法都使用了改進后的TF-IDF算法。從圖4中可以看出:使用了改進后的TF-IDF相比較傳統(tǒng)的TF-IDF來說,在SVM算法上的準確率提高了8%,在決策樹算法上的準確率提高了將近10%。集成算法使用的是傳統(tǒng)的TF-IDF在準確率上相比較于使用了改進后TF-IDF的IDT和ISVM算法來說提升并不明顯,而I-集成算法不但使用了改進后的TF-IDF,還集成了兩個算法,在準確率比集成算法高了近4%。由此可知改進的TF-IDF算法對集成算法有加強的效果。對于AdaBoostSVM集成算法,在實驗中可以看到它的準確率與筆者的集成算法相差不大,甚至有所不如,而與I-集成算法相比較來說就低了不少。
1—DT;2—SVM;3—IDT;4—ISVM;5—AdaBoostSVM; 6—集成算法;7—I-集成算法。圖4 不同算法的分類準確率Fig.4 Classification accuracy of different algorithms
對于上述的實驗,集成算法的迭代采用的都是20 次,同樣的迭代次數(shù)難免會對集成算法的最好結(jié)果會有影響,所以對于不同迭代次數(shù)下集成算法的準確性也需要進行研究。
如圖5所示,當?shù)?~20 次時,集成算法的準確率隨迭代次數(shù)的增加而增加,而迭代超過20 次之后,集成算法的準確率基本不再變化。同時在迭代達到30 次之后,所花費的時間比30 次之前要長幾百甚至幾千倍。
圖5 不同迭代次數(shù)下集成算法的分類準確率Fig.5 Classification accuracy of ensemble algorithm under different iterations
通過對大數(shù)據(jù)分類方法的研究,在Spark平臺的基礎(chǔ)上,提出了一種情感分析集成算法。該算法采用改進后的TF-IDF算法提取特征向量,并使用類似AdaBoost算法的方式將決策樹算法和SVM算法集成。同時對于不同平臺的耗時和不同節(jié)點數(shù)的耗時,還有不同算法的準確率以及不同迭代次數(shù)對于集成算法準確率的影響進行了實驗。從實驗結(jié)果來看:Spark在數(shù)據(jù)處理上比Haoop快,但兩者在算法運行速度上相差不大;兩個平臺對于節(jié)點數(shù)的增加耗時都會減少,但到達一定節(jié)點數(shù)之后耗時就基本不會減少;集成算法對于其他原生算法來說準確率提高不少;迭代次數(shù)的增加會對集成算法的準確率有所提高,但次數(shù)達到一定大小后準確率也會趨于平穩(wěn),同時隨著迭代次數(shù)的增加,耗時也會不斷增加,到了后期耗費的時間可能會成幾百上千倍地增加。從整體結(jié)果上看:集成算法雖然相比較基本算法準確率有所提高,但從其他更高級算法的來看還遠遠不夠,下一步可以繼續(xù)改進特征向量提取算法,集成更加優(yōu)秀的基本算法或者減少集成算法的耗時。