如何用Python做情感分析?

商品評論挖掘、電影推薦、股市預測……情感分析大有用武之地。本文幫助你一步步用Python做出自己的情感分析結果,難道你不想試試看?

需求

如果你關注數據科學研究或是商業實踐,“情感分析”(sentiment analysis)這個詞你應該不陌生吧?

維基百科上,情感分析的定義是:

文本情感分析(也稱為意見挖掘)是指用自然語言處理、文本挖掘以及計算機語言學等方法來識別和提取原素材中的主觀信息。

聽著很高大上,是吧?如果說得具體一點呢?

給你一段文本,你就可以用情感分析的自動化方法獲得這一段內容里包含的情感色彩是什么。

神奇吧?

情感分析不是炫技工具。它是悶聲發大財的方法。早在2010年,就有學者指出,可以依靠Twitter公開信息的情感分析來預測股市的漲落,準確率高達87.6%!

在這些學者看來,一旦你能夠獲得大量實時社交媒體文本數據,且利用情感分析的黑魔法,你就獲得了一顆預測近期投資市場趨勢的水晶球。

這種用數據科學碾壓競爭者的感受,是不是妙不可言啊?

大數據時代,我們可以獲得的文本數據實在太多了。僅僅是大眾點評、豆瓣和亞馬遜上海量的評論信息就足夠我們揮鍬掄鎬,深挖一通了。

你是不是疑惑,這么高深的技術,自己這個非計算機專業的文科生,如何才能應用呢?

不必擔心。從前情感分析還只是實驗室或者大公司的獨門秘籍?,F在早已飛入尋常百姓家。門檻的降低使得我們普通人也可以用Python的幾行代碼,完成大量文本的情感分析處理。

是不是摩拳擦掌,打算動手嘗試了?

那我們就開始吧。

安裝

為了更好地使用Python和相關軟件包,你需要先安裝Anaconda套裝。詳細的流程步驟請參考《 如何用Python做詞云 》一文。

到你的系統“終端”(macOS, Linux)或者“命令提示符”(Windows)下,進入我們的工作目錄demo,執行以下命令。

pip install snownlp
pip install -U textblob
python -m textblob.download_corpora

好了,至此你的情感分析運行環境已經配置完畢。

在終端或者命令提示符下鍵入:

jupyter notebook

你會看到目錄里之前的那些文件,忽略他們就好。

好了,下面我們就可以愉快地利用Python來編寫程序,做文本情感分析了。

英文

我們先來看英文文本的情感分析。

這里我們需要用到的是 TextBlob包

其實,從上圖可以看出,這個包可以做許許多多跟文本處理相關的事情。本文我們只專注于情感分析這一項。其他功能以后有時間我們再介紹。

我們新建一個Python 2筆記本,并且將其命名為“sentiment-analysis”。

先準備一下英文文本數據。

text = "I am happy today. I feel sad today."

這里我們輸入了兩句話,把它存入了text這個變量里面。學了十幾年英語的你,應該立即分辨出這兩句話的情感屬性。第一句是“我今天很高興”,正面;第二句是“我今天很沮喪”,負面。

下面我們看看情感分析工具TextBlob能否正確識別這兩句話的情感屬性。

首先我們呼喚TextBlob出來。

from textblob import TextBlob
blob = TextBlob(text)
blob

按Shift+Enter執行,結果好像只是把這兩句話原封不動打印了出來而已嘛。

別著急,TextBlob已經幫我們把一段文本分成了不同的句子。我們不妨看看它的劃分對不對。

blob.sentences

執行后輸出結果如下:

劃分無誤??墒悄隳軘嗑溆猩读瞬黄??!我要情感分析結果!

你怎么這么著急???一步步來嘛。好,我們輸出第一句的情感分析結果:

blob.sentences[0].sentiment

執行后,你會看到有意思的結果出現了:

情感極性0.8,主觀性1.0。說明一下,情感極性的變化范圍是[-1, 1],-1代表完全負面,1代表完全正面。

既然我說自己“高興”,那情感分析結果是正面的就對了啊。

趁熱打鐵,我們看第二句。

blob.sentences[1].sentiment

執行后結果如下:

“沮喪”對應的情感極性是負的0.5,沒毛??!

更有趣的是,我們還可以讓TextBlob綜合分析出整段文本的情感。

blob.sentiment

執行結果是什么?

給你10秒鐘,猜猜看。

不賣關子了,是這樣的:

你可能會覺得沒有道理。怎么一句“高興”,一句“沮喪”,合并起來最后會得到正向結果呢?

首先不同極性的詞,在數值上是有區別的。我們應該可以找到比“沮喪”更為負面的詞匯。而且這也符合邏輯,誰會這么“天上一腳,地下一腳”矛盾地描述自己此時的心情呢?

中文

試驗了英文文本情感分析,我們該回歸母語了。畢竟,互聯網上我們平時接觸最多的文本,還是中文的。

中文文本分析,我們使用的是 SnowNLP包 。這個包跟TextBlob一樣,也是多才多藝的。

我們還是先準備一下文本。這次我們換2個形容詞試試看。

text = u"我今天很快樂。我今天很憤怒。"

注意在引號前面我們加了一個字母u,它很重要。因為它提示Python,“這一段我們輸入的文本編碼格式是Unicode,別搞錯了哦”。至于文本編碼格式的細節,有機會我們再詳細聊。

好了,文本有了,下面我們讓SnowNLP來工作吧。

from snownlp import SnowNLP
s = SnowNLP(text)

我們想看看SnowNLP能不能像TextBlob一樣正確劃分我們輸入的句子,所以我們執行以下輸出:

for sentence in s.sentences:
 print(sentence)

執行的結果是這樣的:

好的,看來SnowNLP對句子的劃分是正確的。

我們來看第一句的情感分析結果吧。

s1 = SnowNLP(s.sentences[0])
s1.sentiments

執行后的結果是:

看來“快樂”這個關鍵詞真是很能說明問題。基本上得到滿分了。

我們來看第二句:

s2 = SnowNLP(s.sentences[1])
s2.sentiments

執行結果如下:

這里你肯定發現了問題——“憤怒”這個詞表達了如此強烈的負面情感,為何得分依然是正的?

這是因為SnowNLP和textblob的計分方法不同。SnowNLP的情感分析取值,表達的是“這句話代表正面情感的概率”。也就是說,對“我今天很憤怒”一句,SnowNLP認為,它表達正面情感的概率很低很低。

這么解釋就合理多了。

小結

學會了基本招式,很開心吧?下面你可以自己找一些中英文文本來實踐情感分析了。

但是你可能很快就會遇到問題。例如你輸入一些明確的負面情緒語句,得到的結果卻很正面。

不要以為自己又被忽悠了。我來解釋一下問題出在哪兒。

首先,許多語句的情感判定需要上下文和背景知識,因此如果這類信息缺乏,判別正確率就會受到影響。這就是人比機器(至少在目前)更強大的地方。

其次,任何一個情感分析工具,實際上都是被訓練出來的。訓練時用的是什么文本材料,直接影響到模型的適應性。

例如SnowNLP,它的訓練文本就是評論數據。因此,你如果用它來分析中文評論信息,效果應該不錯。但是,如果你用它分析其他類型的文本——例如小說、詩歌等,效果就會大打折扣。因為這樣的文本數據組合方式,它之前沒有見過。

解決辦法當然有,就是用其他類型的文本去訓練它。見多識廣,自然就“見慣不怪”了。至于該如何訓練,請和相關軟件包的作者聯系咨詢。

討論

除了本文提到的文本分析應用領域,你還知道哪些其他的工作可以用情感分析來自動化輔助完成?除TextBlob和SnowNLP外,你還知道哪些開放免費軟件包可以幫助我們完成情感分析工作?歡迎留言分享給大家,我們一起交流討論。

喜歡請點贊。還可以微信關注和置頂我的公眾號“玉樹芝蘭”(nkwangshuyi)。

如果你對數據科學感興趣,不妨閱讀我的系列教程索引貼《如何高效入門數據科學?》,里面還有更多的有趣問題及解法。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容