0
雷鋒網(wǎng)按:本文作者王樹(shù)義,原載于微信公眾號(hào)玉樹(shù)芝蘭(nkwangshuyi),雷鋒網(wǎng)經(jīng)授權(quán)發(fā)布。
商品評(píng)論挖掘、電影推薦、股市預(yù)測(cè)……情感分析大有用武之地。本文幫助你一步步用Python做出自己的情感分析結(jié)果,難道你不想試試看?
如果你關(guān)注數(shù)據(jù)科學(xué)研究或是商業(yè)實(shí)踐,“情感分析”(sentiment analysis)這個(gè)詞你應(yīng)該不陌生吧?
維基百科上,情感分析的定義是:
文本情感分析(也稱為意見(jiàn)挖掘)是指用自然語(yǔ)言處理、文本挖掘以及計(jì)算機(jī)語(yǔ)言學(xué)等方法來(lái)識(shí)別和提取原素材中的主觀信息。
聽(tīng)著很高大上,是吧?如果說(shuō)得具體一點(diǎn)呢?
給你一段文本,你就可以用情感分析的自動(dòng)化方法獲得這一段內(nèi)容里包含的情感色彩是什么。
神奇吧?
情感分析不是炫技工具。它是悶聲發(fā)大財(cái)?shù)姆椒āT缭?010年,就有學(xué)者指出,可以依靠Twitter公開(kāi)信息的情感分析來(lái)預(yù)測(cè)股市的漲落,準(zhǔn)確率高達(dá)87.6%!
在這些學(xué)者看來(lái),一旦你能夠獲得大量實(shí)時(shí)社交媒體文本數(shù)據(jù),且利用情感分析的黑魔法,你就獲得了一顆預(yù)測(cè)近期投資市場(chǎng)趨勢(shì)的水晶球。
這種用數(shù)據(jù)科學(xué)碾壓競(jìng)爭(zhēng)者的感受,是不是妙不可言???
大數(shù)據(jù)時(shí)代,我們可以獲得的文本數(shù)據(jù)實(shí)在太多了。僅僅是大眾點(diǎn)評(píng)、豆瓣和亞馬遜上海量的評(píng)論信息就足夠我們揮鍬掄鎬,深挖一通了。
你是不是疑惑,這么高深的技術(shù),自己這個(gè)非計(jì)算機(jī)專業(yè)的文科生,如何才能應(yīng)用呢?
不必?fù)?dān)心。從前情感分析還只是實(shí)驗(yàn)室或者大公司的獨(dú)門(mén)秘籍?,F(xiàn)在早已飛入尋常百姓家。門(mén)檻的降低使得我們普通人也可以用Python的幾行代碼,完成大量文本的情感分析處理。
是不是摩拳擦掌,打算動(dòng)手嘗試了?
那我們就開(kāi)始吧。
為了更好地使用Python和相關(guān)軟件包,你需要先安裝Anaconda套裝。詳細(xì)的流程步驟請(qǐng)參考《 如何用Python做詞云 》一文。
到你的系統(tǒng)“終端”(macOS, Linux)或者“命令提示符”(Windows)下,進(jìn)入我們的工作目錄demo,執(zhí)行以下命令。
pip install snownlp
pip install -U textblob
python -m textblob.download_corpora
好了,至此你的情感分析運(yùn)行環(huán)境已經(jīng)配置完畢。
在終端或者命令提示符下鍵入:
jupyter notebook
你會(huì)看到目錄里之前的那些文件,忽略他們就好。
好了,下面我們就可以愉快地利用Python來(lái)編寫(xiě)程序,做文本情感分析了。
我們先來(lái)看英文文本的情感分析。
這里我們需要用到的是 TextBlob 包 ,相關(guān)鏈接為:
其實(shí),從上圖可以看出,這個(gè)包可以做許許多多跟文本處理相關(guān)的事情。本文我們只專注于情感分析這一項(xiàng)。其他功能以后有時(shí)間我們?cè)俳榻B。
我們新建一個(gè)Python 2筆記本,并且將其命名為“sentiment-analysis”。
先準(zhǔn)備一下英文文本數(shù)據(jù)。
text = "I am happy today. I feel sad today."
這里我們輸入了兩句話,把它存入了text這個(gè)變量里面。學(xué)了十幾年英語(yǔ)的你,應(yīng)該立即分辨出這兩句話的情感屬性。第一句是“我今天很高興”,正面;第二句是“我今天很沮喪”,負(fù)面。
下面我們看看情感分析工具TextBlob能否正確識(shí)別這兩句話的情感屬性。
首先我們呼喚TextBlob出來(lái)。
from textblob import TextBlob
blob = TextBlob(text)
blob
按Shift+Enter執(zhí)行,結(jié)果好像只是把這兩句話原封不動(dòng)打印了出來(lái)而已嘛。
別著急,TextBlob已經(jīng)幫我們把一段文本分成了不同的句子。我們不妨看看它的劃分對(duì)不對(duì)。
blob.sentences
執(zhí)行后輸出結(jié)果如下:
劃分無(wú)誤??墒悄隳軘嗑溆猩读瞬黄穑?!我要情感分析結(jié)果!
你怎么這么著急???一步步來(lái)嘛。好,我們輸出第一句的情感分析結(jié)果:
blob.sentences[0].sentiment
執(zhí)行后,你會(huì)看到有意思的結(jié)果出現(xiàn)了:
情感極性0.8,主觀性1.0。說(shuō)明一下,情感極性的變化范圍是[-1, 1],-1代表完全負(fù)面,1代表完全正面。
既然我說(shuō)自己“高興”,那情感分析結(jié)果是正面的就對(duì)了啊。
趁熱打鐵,我們看第二句。
blob.sentences[1].sentiment
執(zhí)行后結(jié)果如下:
“沮喪”對(duì)應(yīng)的情感極性是負(fù)的0.5,沒(méi)毛??!
更有趣的是,我們還可以讓TextBlob綜合分析出整段文本的情感。
blob.sentiment
執(zhí)行結(jié)果是什么?
給你10秒鐘,猜猜看。
不賣關(guān)子了,是這樣的:
你可能會(huì)覺(jué)得沒(méi)有道理。怎么一句“高興”,一句“沮喪”,合并起來(lái)最后會(huì)得到正向結(jié)果呢?
首先不同極性的詞,在數(shù)值上是有區(qū)別的。我們應(yīng)該可以找到比“沮喪”更為負(fù)面的詞匯。而且這也符合邏輯,誰(shuí)會(huì)這么“天上一腳,地下一腳”矛盾地描述自己此時(shí)的心情呢?
試驗(yàn)了英文文本情感分析,我們?cè)摶貧w母語(yǔ)了。畢竟,互聯(lián)網(wǎng)上我們平時(shí)接觸最多的文本,還是中文的。
中文文本分析,我們使用的是 SnowNLP 包 。這個(gè)包跟TextBlob一樣,也是多才多藝的。
SnowNLP 的相關(guān)鏈接如下:
我們還是先準(zhǔn)備一下文本。這次我們換2個(gè)形容詞試試看。
text = u"我今天很快樂(lè)。我今天很憤怒。"
注意在引號(hào)前面我們加了一個(gè)字母u,它很重要。因?yàn)樗崾綪ython,“這一段我們輸入的文本編碼格式是Unicode,別搞錯(cuò)了哦”。至于文本編碼格式的細(xì)節(jié),有機(jī)會(huì)我們?cè)僭敿?xì)聊。
好了,文本有了,下面我們讓SnowNLP來(lái)工作吧。
from snownlp import SnowNLP
s = SnowNLP(text)
我們想看看SnowNLP能不能像TextBlob一樣正確劃分我們輸入的句子,所以我們執(zhí)行以下輸出:
for sentence in s.sentences:
print(sentence)
執(zhí)行的結(jié)果是這樣的:
好的,看來(lái)SnowNLP對(duì)句子的劃分是正確的。
我們來(lái)看第一句的情感分析結(jié)果吧。
s1 = SnowNLP(s.sentences[0])
s1.sentiments
執(zhí)行后的結(jié)果是:
看來(lái)“快樂(lè)”這個(gè)關(guān)鍵詞真是很能說(shuō)明問(wèn)題?;旧系玫綕M分了。
我們來(lái)看第二句:
s2 = SnowNLP(s.sentences[1])
s2.sentiments
執(zhí)行結(jié)果如下:
這里你肯定發(fā)現(xiàn)了問(wèn)題——“憤怒”這個(gè)詞表達(dá)了如此強(qiáng)烈的負(fù)面情感,為何得分依然是正的?
這是因?yàn)镾nowNLP和textblob的計(jì)分方法不同。SnowNLP的情感分析取值,表達(dá)的是“這句話代表正面情感的概率”。也就是說(shuō),對(duì)“我今天很憤怒”一句,SnowNLP認(rèn)為,它表達(dá)正面情感的概率很低很低。
這么解釋就合理多了。
學(xué)會(huì)了基本招式,很開(kāi)心吧?下面你可以自己找一些中英文文本來(lái)實(shí)踐情感分析了。
但是你可能很快就會(huì)遇到問(wèn)題。例如你輸入一些明確的負(fù)面情緒語(yǔ)句,得到的結(jié)果卻很正面。
不要以為自己又被忽悠了。我來(lái)解釋一下問(wèn)題出在哪兒。
首先,許多語(yǔ)句的情感判定需要上下文和背景知識(shí),因此如果這類信息缺乏,判別正確率就會(huì)受到影響。這就是人比機(jī)器(至少在目前)更強(qiáng)大的地方。
其次,任何一個(gè)情感分析工具,實(shí)際上都是被訓(xùn)練出來(lái)的。訓(xùn)練時(shí)用的是什么文本材料,直接影響到模型的適應(yīng)性。
例如SnowNLP,它的訓(xùn)練文本就是評(píng)論數(shù)據(jù)。因此,你如果用它來(lái)分析中文評(píng)論信息,效果應(yīng)該不錯(cuò)。但是,如果你用它分析其他類型的文本——例如小說(shuō)、詩(shī)歌等,效果就會(huì)大打折扣。因?yàn)檫@樣的文本數(shù)據(jù)組合方式,它之前沒(méi)有見(jiàn)過(guò)。
解決辦法當(dāng)然有,就是用其他類型的文本去訓(xùn)練它。見(jiàn)多識(shí)廣,自然就“見(jiàn)慣不怪”了。至于該如何訓(xùn)練,請(qǐng)和相關(guān)軟件包的作者聯(lián)系咨詢。
除了本文提到的文本分析應(yīng)用領(lǐng)域,你還知道哪些其他的工作可以用情感分析來(lái)自動(dòng)化輔助完成?除TextBlob和SnowNLP外,你還知道哪些開(kāi)放免費(fèi)軟件包可以幫助我們完成情感分析工作?歡迎留言分享給大家,我們一起交流討論。
雷鋒網(wǎng)相關(guān)閱讀:
當(dāng)情感也可以聯(lián)網(wǎng),你需要一個(gè)“算法天使”
睡前兩小時(shí)打字最活躍,搜狗大數(shù)據(jù)通過(guò)機(jī)器學(xué)習(xí)分析你的網(wǎng)絡(luò)行為
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)轉(zhuǎn)載須知。