基于 Spark 的文本情感分析
?
文本情感分析是指對(duì)具有人為主觀情感色彩文本材料進(jìn)行處理、分析和推理的過(guò)程。文本情感分析主要的應(yīng)用場(chǎng)景是對(duì)用戶關(guān)于某個(gè)主題的評(píng)論文本進(jìn)行處理和分析。比如,人們?cè)诖蛩闳タ匆徊侩娪爸?#xff0c;通常會(huì)去看豆瓣電影板塊上的用戶評(píng)論,再?zèng)Q定是否去看這部電影。另外一方面,電影制片人會(huì)通過(guò)對(duì)專業(yè)論壇上的用戶評(píng)論進(jìn)行分析,了解市場(chǎng)對(duì)于電影的總體反饋。本文中文本分析的對(duì)象為網(wǎng)絡(luò)短評(píng),為非正式場(chǎng)合的短文本語(yǔ)料,在只考慮正面傾向和負(fù)面傾向的情況下,實(shí)現(xiàn)文本傾向性的分類。
文本情感分析主要涉及如下四個(gè)技術(shù)環(huán)節(jié)。
為什么采用 Spark
傳統(tǒng)的單節(jié)點(diǎn)計(jì)算已經(jīng)難以滿足用戶生成的海量數(shù)據(jù)的處理和分析的要求。比如,豆瓣網(wǎng)站上《瘋狂動(dòng)物城》電影短評(píng)就有 111421 條,如果需要同時(shí)處理來(lái)自多個(gè)大型專業(yè)網(wǎng)站上所有電影的影評(píng),單臺(tái)服務(wù)器的計(jì)算能力和存儲(chǔ)能力都很難滿足需求。這個(gè)時(shí)候需要考慮引入分布式計(jì)算的技術(shù),使得計(jì)算能力和存儲(chǔ)能力能夠線性擴(kuò)展。
Spark 是一個(gè)快速的、通用的集群計(jì)算平臺(tái),也是業(yè)內(nèi)非常流行的開(kāi)源分布式技術(shù)。Spark 圍繞著 RDD(Resilient Distributed Dataset)彈性分布式數(shù)據(jù)集,擴(kuò)展了廣泛使用的 MapReduce[5]計(jì)算模型,相比起 Hadoop[6]的 MapReduce 計(jì)算框架,Spark 更為高效和靈活。Spark 主要的特點(diǎn)如下:
基于 Spark 如何構(gòu)建文本情感分析系統(tǒng)
在本文第 1 章,介紹了文本情感分析主要涉及的四個(gè)技術(shù)環(huán)節(jié)。基于 Spark 構(gòu)建的文本分類系統(tǒng)的技術(shù)流程也是這樣的。在大規(guī)模的文本數(shù)據(jù)的情況下,有所不同的是文本的特征維度一般都是非常巨大的。試想一下所有的中文字、詞有多少,再算上其他的語(yǔ)言和所有能在互聯(lián)網(wǎng)上找到的文本,那么文本數(shù)據(jù)按照詞的維度就能輕松的超過(guò)數(shù)十萬(wàn)、數(shù)百萬(wàn)維,所以需要尋找一種可以處理極大維度文本數(shù)據(jù)的方法。
在本文后續(xù)章節(jié)中,將依次按照基于 Spark 做數(shù)據(jù)預(yù)處理、文本建模、特征提取、訓(xùn)練分類模型、實(shí)現(xiàn)待輸入文本分類展開(kāi)討論。系統(tǒng)的上下文關(guān)系圖如圖 1 所示,系統(tǒng)的功能架構(gòu)圖如圖 2 所示。
圖 1. 基于 Spark 文本情感分析系統(tǒng)上下文
圖 2. 基于 Spark 文本情感分析系統(tǒng)功能架構(gòu)圖
爬取的數(shù)據(jù)說(shuō)明
為了說(shuō)明文本分類系統(tǒng)的構(gòu)建過(guò)程,作者爬取了豆瓣網(wǎng)絡(luò)上《瘋狂動(dòng)物城》的短評(píng)和評(píng)分(https://movie.douban.com/subject/25662329/comments)。示例數(shù)據(jù)如下所示:
表 1. 示例數(shù)據(jù)
?
| 5 | 做冰棍那機(jī)智的不像話!!!全片最愛(ài)!!!想吃!!! |
| 5 | 絕對(duì)的好片子裂墻推薦。實(shí)在是因?yàn)榱硪粓?chǎng)滿了…隨手挑了這個(gè)片子。真是 5 分鐘一小笑 10 分鐘哄堂大笑。看那個(gè)又懶又慢樹(shù)獺簡(jiǎn)直要錘墻了。旁邊法國(guó)妹子精辟的吐槽!看!這是我們法國(guó)人。我要憋到內(nèi)傷了。最后散場(chǎng)大家都靜坐著等著整首歌放完…五星好評(píng)。2016 年度十佳。 |
| 5 | 不要看任何影評(píng),如果可以預(yù)告片都別看,直接買票就好了。你要啥這電影里有啥! |
| 3 | 最精彩的動(dòng)畫是用想象力拍出真實(shí)世界難以實(shí)現(xiàn)的故事,而不是用動(dòng)物化填充一段如果是真人就普通到不能再普通的爛俗故事。笑料有,萌趣有,但更有的是莫名其妙的主旋律和政治正確,恐怕沒(méi)有評(píng)分所體現(xiàn)的那么出色。 |
| 4 | 換了新領(lǐng)導(dǎo)就是不一樣。迪士尼暗黑大電影,洛杉磯罪案片風(fēng)格和內(nèi)核。還真是動(dòng)物烏托邦,美國(guó)針對(duì)有色人種,歐洲針對(duì)難民,天朝針對(duì)公知和五毛嗎?人設(shè)精彩,細(xì)節(jié)豐富,但要說(shuō)創(chuàng)意超《頭腦特工隊(duì)》顯然就不實(shí)事求是了。 |
| …… | ……………… |
表格中每一行為一條評(píng)論數(shù)據(jù),按照“評(píng)分,評(píng)論文本”排放,中間以制表符切分,評(píng)分范圍從 1 分到 5 分,這樣的數(shù)據(jù)共采集了 116567 條。
數(shù)據(jù)預(yù)處理
這一節(jié)本文是要說(shuō)明用 Spark 是如何做數(shù)據(jù)清洗和抽取的。在該子系統(tǒng)中輸入為爬蟲(chóng)的數(shù)據(jù),輸出為包含相同數(shù)量好評(píng)和壞評(píng)的 Saprk 彈性分布式數(shù)據(jù)集。
Spark 數(shù)據(jù)處理主要是圍繞 RDD(Resilient Distributed Datasets) 彈性分布式數(shù)據(jù)集對(duì)象展開(kāi),本文首先將爬蟲(chóng)數(shù)據(jù)載入到 Spark 系統(tǒng),抽象成為一個(gè) RDD。可以用 distinct 方法對(duì)數(shù)據(jù)去重。數(shù)據(jù)轉(zhuǎn)換主要是用了 map 方法,它接受傳入的一個(gè)數(shù)據(jù)轉(zhuǎn)換的方法來(lái)按行執(zhí)行方法,從而達(dá)到轉(zhuǎn)換的操作它只需要用一個(gè)函數(shù)將輸入和輸出映射好,那么就能完成轉(zhuǎn)換。數(shù)據(jù)過(guò)濾使用 filter 方法,它能夠保留判斷條件為真的數(shù)據(jù)。可以用下面這個(gè)語(yǔ)句,將每一行文本變成一個(gè) list,并且只保留長(zhǎng)度為 2 的數(shù)據(jù)。
清單 2. Spark 做數(shù)據(jù)預(yù)處理
| 1 | originData=sc.textFile('YOUR_FILE_PATH') |
清單 3. 統(tǒng)計(jì)數(shù)據(jù)基本信息
| 1 | fiveRateDocument=rateDocument.filter(lambda line : int(line[0])==5) |
本文得到,五分的數(shù)據(jù)有 30447 條,4 分、3 分、2 分、1 分的數(shù)據(jù)分別有 11711 條,123 條,70 條。打五分的毫無(wú)疑問(wèn)是好評(píng);考慮到不同人對(duì)于評(píng)分的不同偏好,對(duì)于打四分的數(shù)據(jù),本文無(wú)法得知它是好評(píng)還是壞評(píng);對(duì)于打三分及三分以下的是壞評(píng)。
下面就可以將帶有評(píng)分?jǐn)?shù)據(jù)轉(zhuǎn)化成為好評(píng)數(shù)據(jù)和壞評(píng)數(shù)據(jù),為了提高計(jì)算效率,本文將其重新分區(qū)。
清單 4. 合并負(fù)樣本數(shù)據(jù)
| 1 | negRateDocument=oneRateDocument.union(twoRateDocument).\ |
通過(guò)計(jì)算得到,好評(píng)和壞評(píng)分別有 30447 條和 2238 條,屬于非平衡樣本的機(jī)器模型訓(xùn)練。本文只取部分好評(píng)數(shù)據(jù),好評(píng)和壞評(píng)的數(shù)量一樣,這樣訓(xùn)練的正負(fù)樣本就是均衡的。最后把正負(fù)樣本放在一起,并把分類標(biāo)簽和文本分開(kāi),形成訓(xùn)練數(shù)據(jù)集
清單 5. 生?成訓(xùn)練數(shù)?據(jù)集
| 1 | posRateDocument=sc.parallelize(fiveRateDocument.take(negRateDocument.count())).repartition(1) |
文本的向量表示和文本特征提取
這一節(jié)中,本文主要介紹如何做文本分詞,如何用 TF-IDF 算法抽取文本特征。將輸入的文本數(shù)據(jù)轉(zhuǎn)化為向量,讓計(jì)算能夠“讀懂”文本。
解決文本分類問(wèn)題,最重要的就是要讓文本可計(jì)算,用合適的方式來(lái)表示文本,其中的核心就是找到文本的特征和特征值。相比起英文,中文多了一個(gè)分詞的過(guò)程。本文首先用 jieba 分詞器將文本分詞,這樣每個(gè)詞都可以作為文本的一個(gè)特征。jieba 分詞器有三種模式的分詞:
這里本文用的是搜索引擎模式將每一句評(píng)論轉(zhuǎn)化為詞。
清單 6. 分詞
| 1 | words=document.map(lambda w:"/".\ |
出于對(duì)大規(guī)模數(shù)據(jù)計(jì)算需求的考慮,spark 的詞頻計(jì)算是用特征哈希(HashingTF)來(lái)計(jì)算的。特征哈希是一種處理高維數(shù)據(jù)的技術(shù),經(jīng)常應(yīng)用在文本和分類數(shù)據(jù)集上。普通的 k 分之一特征編碼需要在一個(gè)向量中維護(hù)可能的特征值及其到下標(biāo)的映射,而每次構(gòu)建這個(gè)映射的過(guò)程本身就需要對(duì)數(shù)據(jù)集進(jìn)行一次遍歷。這并不適合上千萬(wàn)甚至更多維度的特征處理。
特征哈希是通過(guò)哈希方程對(duì)特征賦予向量下標(biāo)的,所以在不同情況下,同樣的特征就是能夠得到相同的向量下標(biāo),這樣就不需要維護(hù)一個(gè)特征值及其下表的向量。
要使用特征哈希來(lái)處理文本,需要先實(shí)例化一個(gè) HashingTF 對(duì)象,將詞轉(zhuǎn)化為詞頻,為了高效計(jì)算,本文將后面會(huì)重復(fù)使用的詞頻緩存。
清單 7. 訓(xùn)練詞頻矩陣
| 1 | hashingTF = HashingTF() |
缺省情況下,實(shí)例化的 HashingTF 特征維數(shù) numFeatures 取了 220次方維,在 spark 的源碼中可以看到,HashingTF 的過(guò)程就是對(duì)每一個(gè)詞作了一次哈希并對(duì)特征維數(shù)取余得到該詞的位置,然后按照該詞出現(xiàn)的次數(shù)計(jì)次。所以就不用像傳統(tǒng)方法一樣每次維護(hù)一張?jiān)~表,運(yùn)用 HashingTF 就可以方便的得到該詞所對(duì)應(yīng)向量元素的位置。當(dāng)然這樣做的代價(jià)就是向量維數(shù)會(huì)非常大,好在 spark 可以支持稀疏向量,所以計(jì)算開(kāi)銷并不大。
圖 3. HashingTF 源碼
詞頻是一種抽取特征的方法,但是它還有很多問(wèn)題,比如在這句話中“這幾天的天氣真好,項(xiàng)目組的老師打算組織大家一起去春游。“的”相比于“項(xiàng)目組”更容易出現(xiàn)在人們的語(yǔ)言中,“的”和“項(xiàng)目組”同樣只出現(xiàn)一次,但是項(xiàng)目組對(duì)于這句話來(lái)說(shuō)更重要。
本文采用 TF-IDF 作為特征提取的方法,它的權(quán)重與特征項(xiàng)在文檔中出現(xiàn)的評(píng)率成正相關(guān),與在整個(gè)語(yǔ)料中出現(xiàn)該特征項(xiàng)的文檔成反相關(guān)。下面依據(jù) tf 來(lái)計(jì)算逆詞頻 idf,并計(jì)算出 TF-IDF
清單 8. 計(jì)算 TF-IDF 矩陣
| 1 | idfModel = IDF().fit(tf) |
至此,本文就抽取出了文本的特征,并用向量去表示了文本。
訓(xùn)練分類模型
在這一小節(jié)中,本文介紹如何用 Spark 訓(xùn)練樸素貝葉斯分類模型,這一流程的輸入是文本的特征向量及已經(jīng)標(biāo)記好的分類標(biāo)簽。在這里本文得到的是分類模型及文本分類的正確率。
現(xiàn)在,有了文本的特征項(xiàng)及特征值,也有了分類標(biāo)簽,需要用 RDD 的 zip 算子將這兩部分?jǐn)?shù)據(jù)連接起來(lái),并將其轉(zhuǎn)化為分類模型里的 LabeledPoint 類型。并隨機(jī)將數(shù)據(jù)分為訓(xùn)練集和測(cè)試集,60%作為訓(xùn)練集,40%作為測(cè)試集。
清單 9. 生成訓(xùn)練集和測(cè)試集
| 1 | zipped=rate.zip(tfidf) |
本文用訓(xùn)練數(shù)據(jù)來(lái)訓(xùn)練貝葉斯模型,得到 NBmodel 模型來(lái)預(yù)測(cè)測(cè)試集的文本特征向量,并且計(jì)算出各個(gè)模型的正確率,這個(gè)模型的正確率為 74.83%。
清單 10. 訓(xùn)練貝葉斯分類模型
| 1 | NBmodel = NaiveBayes.train(training, 1.0) |
可以看出貝葉斯模型最后的預(yù)測(cè)模型并不高,但是基于本文采集的數(shù)據(jù)資源有限,特征提取過(guò)程比較簡(jiǎn)單直接。所以還有很大的優(yōu)化空間,在第四章中,本文將介紹提高正確率的方法。
分類未標(biāo)記文檔
現(xiàn)在可以用本文訓(xùn)練好的模型來(lái)對(duì)未標(biāo)記文本分類,流程是獲取用戶輸入的評(píng)論,然后將輸入的評(píng)論文本分詞并轉(zhuǎn)化成 tf-idf 特征向量,然后用 3.4 節(jié)中訓(xùn)練好的分類模型來(lái)分類。
清單 11. 分類未分類文本
| 1 | yourDocument=input("輸入待分類的評(píng)論:") |
當(dāng)程序輸入待分類的評(píng)論:“這部電影沒(méi)有意思,劇情老套,真沒(méi)勁, 后悔來(lái)看了”
程序輸出為“NaiveBayes Model Predict: 0.0”。
當(dāng)程序輸入待分類的評(píng)論:“太精彩了講了一個(gè)關(guān)于夢(mèng)想的故事劇情很反轉(zhuǎn)制作也很精良”
程序輸出為“NaiveBayes Model Predict: 1.0”。
至此,最為簡(jiǎn)單的文本情感分類系統(tǒng)就構(gòu)建完整了。
提高正確率的方法
在第三章中,本文介紹了構(gòu)建文本分類系統(tǒng)的方法,但是正確率只有 74.83%,在這一章中,本文將講述文本分類正確率低的原因及改進(jìn)方法。
文本分類正確率低的原因主要有:
下面分別就這四個(gè)方面,本文進(jìn)一步深入的進(jìn)行處理,對(duì)模型進(jìn)行優(yōu)化。
數(shù)據(jù)預(yù)處理中去掉停用詞
停用詞是指出現(xiàn)在所有文檔中很多次的常用詞,比如“的”、“了”、“是”等,可以在提取特征的時(shí)候?qū)⑦@些噪聲去掉。
首先需要統(tǒng)計(jì)一下詞頻,看哪些詞是使用最多的,然后定義一個(gè)停用詞表,在構(gòu)建向量前,將這些詞去掉。本文先進(jìn)行詞頻統(tǒng)計(jì),查看最常用的詞是哪些。
清單 12. 統(tǒng)計(jì)詞頻
| 1 | text=words.flatMap(lambda w:w) |
通過(guò)觀察,選擇出現(xiàn)次數(shù)比較多,但是對(duì)于文本情感表達(dá)沒(méi)有意義的詞,作為停用詞,構(gòu)建停用詞表。然后定義一個(gè)過(guò)濾函數(shù),如果該詞在停用詞表中那么需要將這個(gè)詞過(guò)濾掉。
清單 13. 去掉停用詞
stopwords = set([" ","的","了","是","就","吧",……])
| 1 | def filterStopWords(line): |
嘗試不用的分詞模式
本文在分詞的時(shí)候使用的搜索引擎分詞模式,在這種模式下只抽取了重要的關(guān)鍵字,可能忽略了一些可能的特征詞。可以把分詞模式切換到全分詞模式,盡可能的不漏掉特征詞,同樣的模型訓(xùn)練,正確率會(huì)有 1%~2%的提升。
清單 14. 全分詞模式分詞
| 1 | words=document.map(lambda w:"/".join(jieba.\ |
更換訓(xùn)練模型方法
在不進(jìn)行深入優(yōu)化的情況下,SVM 往往有著比其他分類模型更好的分類效果。下面在相同的條件下,運(yùn)用 SVM 模型訓(xùn)練,最后得到的正確率有 78.59%。
清單 15. 用支持向量機(jī)訓(xùn)練分類模型
| 1 | SVMmodel = SVMWithSGD.train(training, iterations=100) |
訓(xùn)練數(shù)據(jù)的問(wèn)題
本文只是為了演示如何構(gòu)建這套系統(tǒng),所以爬取的數(shù)據(jù)量并不多,獲取的文本數(shù)據(jù)也沒(méi)有人工的進(jìn)一步核對(duì)其正確性。如果本文能夠有更豐富且權(quán)威的數(shù)據(jù)源,那么模型的正確率將會(huì)有較大的提高。
作者對(duì)中國(guó)科學(xué)院大學(xué)的譚松波教授發(fā)布的酒店產(chǎn)品評(píng)論文本做了分類系統(tǒng)測(cè)試,該數(shù)據(jù)集是多數(shù)學(xué)者公認(rèn)并且使用的。用 SVM 訓(xùn)練的模型正確率有 87.59%。
總結(jié)
本文向讀者詳細(xì)的介紹了利用 Spark 構(gòu)建文本情感分類系統(tǒng)的過(guò)程,從數(shù)據(jù)的清洗、轉(zhuǎn)換,Spark 的 RDD 有 Filter、Map 方法可以輕松勝任;對(duì)于抽取文本特征,Spark 針對(duì)大規(guī)模數(shù)據(jù)的處理不僅在計(jì)算模型上有優(yōu)化,還做了算法的優(yōu)化,它利用哈希特征算法來(lái)實(shí)現(xiàn) TF-IDF,從而能夠支持上千萬(wàn)維的模型訓(xùn)練;對(duì)于選擇分類模型,Spark 也實(shí)現(xiàn)好了常用的分類模型,調(diào)用起來(lái)非常方便。
總結(jié)
以上是生活随笔為你收集整理的基于 Spark 的文本情感分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: MySQL之Explain
- 下一篇: 猴子吃桃的问题