楊立月 王移芝
(北京交通大學計算機與信息技術學院 北京 100044)
近年來隨著互聯網的發展,文本情感分析成為一個新興的課題,并體現出了非常廣闊的應用價值。比如,根據微博的文本情感分析可以監測輿論傾向、預測股票漲跌、預測電影票房等[1];根據對商品評論信息的文本情感分析可以得到用戶對于商品的喜愛程度、發掘商品供求和推銷信息等[2]。由于中文語義的復雜性和強順序性,機器學習中的單一分類器往往不能取得非常好的分類效果[3]。近幾年來,利用集成學習的方法進行綜合的文本情感分類,取得了非常好的效果[4]。但集成學習由傳統的單個分類器改為多分類器集成,造成了計算量的成倍增長[5],隨著微博和微信等社交工具的流行,文本信息數量呈現爆炸性的增長,單機環境已經不能滿足集成學習的算力要求,集成學習的時間成本已經成為大規模文本情感分析的一個痛點。
近幾年,以Spark和MapReduce為代表的大數據分析技術的發展,為解決集成學習中單點算力的痛點帶來了曙光[6]。集成學習過程中,在模型結果進行集成算法前單個模型的相對獨立性能夠盡可能地減少網絡通信和shuffle過程,充分發揮分布式計算框架的性能,非常契合Spark這種分布式計算框架。本文使用Spark集群,利用其編程模型中的parallel算子將集成學習中的分類任務進行模型分離,并利用Yarn調度器進行任務均衡分發和監控,最后將各模型的結果收集回driver端進行集成得到最終結果。實驗證明該算法具有良好的拓展性和加速比,很好地解決了大規模集成學習中單機實驗的時間瓶頸問題,大幅度降低了使用集成學習進行大規模文本情感分析的時間成本。
文本情感分析是自然語言處理中一個非常重要和實用方法。目前針對文本的情感傾向分析方法主要有兩種:基于情感詞典的方法和基于機器學習的方法。兩種方法各有優劣,情感詞典的方法主要優點是穩定,常常根據情感詞就可以推斷出整個文本的情感傾向,缺點是對于不在情感詞典中的詞無能為力,而且無法結合語義上下文的語境,而同一個詞在不同語境中可能完全表達相反的含義[7]。機器學習方法常常需要人工標注語料作為訓練集,提取出文本的特征,用特征構建一個分類器,再做情感的分類。但是這種方法因為機器學習中單個模型特征的抽取方法不同,通用性不好,而且抽取過程中受訓練語料噪音的影響進而導致分類效果并不太理想[8]。
集成學習是近幾年興起的一種新型的機器學習方式,通過構建并結合多個學習器來完成學習任務,在集成學習中通過各個學習器進行結合,可以獲得比單一學習器更優越的泛化性能。通常情況下,有監督的學習方法都是針對一個問題從一個有限的假設空間中搜索最適合結果。而集成學習就是將多個假設空間放到一起來形成一個更好的方案。集成學習的結果是一個單一的假設空間,不一定是在原始分類器的假設空間中,因此具有更高的靈活性[9]。理論上說,集成學習可以在訓練集上比單一的模型有更好的擬合能力,如bagging等集成學習方法在實際中能更好地降低過擬合的問題。總而言之,集成學習能夠集百家之長,擁有更高更穩定的分類準確性,是文本情感傾向分析中的一個重要方向。但集成學習由于需要計算多個模型的數據結果,因此通常意味著計算量的成倍增加,而且伴隨模型調參和集成方法測試等優化方法的使用更進一步放大了該問題,大規模集成學習文本情感分析的時間成本成為一個痛點。
Spark是一個Apache開源的分布式計算框架,具有速度快且通用性好的特點。其原本是UC Berkeley的AMP實驗室開發的一個類似于谷歌的MapReduce的并行框架[10],但不同于MapReduce,Apache Spark計算的中間結果可以優先保存在內存中,從而不再需要頻繁地讀寫硬盤,因此能夠獲得更快的大數據處理速度[11]。圖1展示了Spark的基本框架,用戶首先通過spark-submit命令向集群提交作業,然后Driver向Master注冊本次作業并且向集群申請資源。由于Master與各個worker之間有心跳包報告機器資源狀況,因此Master能夠找到最合適的機器資源給本任務,再在各個有資源的節點上啟動Executor進程去運行用戶提交任務中的每一個task,Executor向Driver通過心跳包報告運行狀態,直到作業完成。像Spark這種分布式計算框架的瓶頸往往在于網絡IO,而集成學習中在模型切分后單個模型之間是相對獨立的,不需要與其他的節點通過網絡進行數據交互,因此能夠充分發揮集群機器的計算性能。

圖1 Spark框架的工作流程
集成學習模型并行算法分為模型切分與任務分發、文本數據處理與預測、預測結果拉回和模型集成四個階段。首先利用Spark中的parallel算子生成與模型個數相匹配的簡單分布式數據集RDD,然后通過對該RDD的MapPartition操作將各個模型進行均勻分發。在該操作內部進行模型的加載并且讀取HDFS中的文本數據,進行文本處理和當前模型的結果預測,將預測結果通過Itertor迭代器的形式返回[12]。最后執行collect算子操作,將所有預測的數據拉回driver端,然后根據各個模型的結果使用集成算法進行集成,并將最后的預測結果和評價數據寫入HDFS中。圖2展示了利用Spark平臺進行大規模集成學習分析文本情感的作業流程。

圖2 Spark中集成學習文本分析流程
并行算法的工程化主要是使用scala語言,按照Spark中RDD的編程模型,主要使用的算子包括mapPartition、parallel、collect等,具體偽代碼如算法1所示。
算法1Spark集成學習文本情感分析算法
輸入:文本數據,模型,節點配置
輸出:集成學習分類結果與評價指標
1. val context=SparkContext()
2. val textConfig=context.getConf.get()
3. val modelNum=context.getConf.get()
4. val dataPath=context.getConf.get()
5. val classify=context.parallelize(0 until modelNum,modelNum).mapPartitions {part=>
data=HDFS.read(dataPath)
model=HDFS.read(model)
singelResult=model.fit(data)
singelResult.iterator()
}
6. val result=classify.collect()
7. val ensembleResult=result.ensemble()
8. save ensembleResult and evaluate
本實驗所用的機器為購買的4臺阿里云的CES服務器,在線安裝配置了Spark和HDFS環境。為了方便進行對比實驗,單機數據采用的機器環境和Spark集群中單個節點的機器配置完全相同。表1給出了Spark集群中單個節點的主要硬件配置,表2給出了單節點主要的軟件環境及對應的版本號。

表1 Spark集群單節點硬件配置信息

表2 Spark集群單節點軟件配置信息
實驗選擇標準的SVM、CRF和LR模型進行文本情感傾向分類的普通投票法集成學習分類。為了檢驗上述的指標,實驗分別選擇了單機、2節點、3節點、4節點共四組進行橫向對比;選擇了100萬、200萬和400萬條三個不同數量的微博文本進行縱向對比。主要選取程序運行時間、集成學習的F-score、加速比和可拓展性作為本次實驗的主要評價指標。各評價指標說明如下:
(1) 運行時間(Runtime):該指標是本次實驗最主要的目的指標,具體的運行時間計算是從提交作業成功開始到模型集成學習完畢所需的總時間。
(2) F-score:由于在分類實驗中的準確率P和召回率R有時候會出現互相矛盾的情況,這樣就需要綜合考慮兩者,最常見的方法就是F-score,其與準確率P和召回率R的關系如下:
當參數α=1時,就是最常見的F1指標,即:
本文計算的F-score選用F1指標。
(3) 加速比(Speedup):該指標是基本運行時間與并行時間的比值,主要是用于驗證并行算法的效率,根據Amdahl定律,集群的加速比在理想的狀態下一般被定義為:
(4) 可拓展性(Extension):該指標主要能夠反映出集群機器數目的改變對該算法的主要性能影響的大小,一般通過這項指標可以預判集群機器數目與該算法的效率匹配性。
實驗1本次實驗對比了集成學習的運行時間隨著集群的節點數N的變化。實驗數據如表3所示。

表3 運行時間實驗結果
通過橫向對比可以發現,集成學習的時間隨著集群節點數的增加而明顯下降,且基本呈現線性關系。通過縱向對比可以發現,集成學習的時間隨著樣本數目的增加而大幅增加,且基本呈現倍數關系,實驗數據基本符合先驗預期。
實驗2該實驗是評價分類模型優劣的標準之一,通過計算F-score的方式綜合考慮分類任務的準確率和召回率。實驗數據如表4所示,可以看出,無論從橫向的節點數目來看還是從縱向的分類樣本數目來看,文本情感分類的F-score基本保持比較穩定的狀態,且樣本數量越大穩定性越好,這與單機實驗的相關指標基本一致。

表4 F-score實驗結果
實驗3在集群不同節點數下的加速比折線圖如圖3所示。

圖3 加速比示意圖
可以看出,利用Spark平臺進行分布式集成學習文本情感分類,加速比隨著集群規模而成倍增加,但是隨著文本數量的持續增加,加速比曲線的上升速度有了一定程度的下降。這是因為當數據量增加后,集群中單節點需要處理的數據也隨之增加,由于Spark平臺使用的Scala語言是運行在Java虛擬機上的語言[13],因此更多的數據量就會觸發更多次的GC(垃圾回收),從而使加速比上升速度出現一定的下降。
實驗4將運行時間隨節點數的變化作折線圖如圖4所示。

圖4 擴展性示意圖
可以看出,使用集成學習方法在三個不同數量的文本樣本進行情感傾向分類,運行時間基本隨著集群節點數的上升而下降,基本呈現線性關系。結果說明,該集成學習的并行算法有著非常良好的拓展性,可以推測該算法在更大規模的集群上也能有非常好的表現。
隨著微博、微信等社交工具的流行,傳統利用Python等語言進行單機集成學習的算法在面對指數級增長的文本數量時,完成一次大規模的文本情感分析往往需要非常巨大的時間成本,嚴重影響了文本分類實驗的效率。Spark這種分布式計算框架為集成學習中模型的并行化提供了非常簡單有效的方法,大大縮短了單次實驗的時間,提高了模型優化和調參的效率。實驗表明,利用Spark平臺進行集成學習中模型的并行化可以基本線性地縮短文本分類時間,分類F-score等指標與單機算法基本相同,且并行算法的可拓展性良好,能夠在可預見的情況下支撐更大規模的文本情感分類。