天天看點

手把手教你如何用 Python 做情感分析

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

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

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

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

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

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

神奇吧?

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

手把手教你如何用 Python 做情感分析

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

手把手教你如何用 Python 做情感分析

這種用資料科學碾壓競争者的感受,是不是妙不可言啊?

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

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

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

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

那我們就開始吧。

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

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

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

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

jupyter notebook

你會看到目錄裡之前的那些檔案,忽略他們就好。

手把手教你如何用 Python 做情感分析

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

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

這裡我們需要用到的是 textblob 包 ,相關連結為:

<a href="http://t.cn/rzfohgr" target="_blank">http://t.cn/rzfohgr</a>

手把手教你如何用 Python 做情感分析

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

我們建立一個python 2筆記本,并且将其命名為“sentiment-analysis”。

手把手教你如何用 Python 做情感分析

先準備一下英文文本資料。

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

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

下面我們看看情感分析工具textblob能否正确識别這兩句話的情感屬性。

首先我們呼喚textblob出來。

from textblob import textblob blob = textblob(text) blob

按shift+enter執行,結果好像隻是把這兩句話原封不動列印了出來而已嘛。

手把手教你如何用 Python 做情感分析

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

blob.sentences

執行後輸出結果如下:

手把手教你如何用 Python 做情感分析

劃分無誤。可是你能斷句有啥了不起?!我要情感分析結果!

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

blob.sentences[0].sentiment

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

手把手教你如何用 Python 做情感分析

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

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

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

blob.sentences[1].sentiment

執行後結果如下:

手把手教你如何用 Python 做情感分析

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

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

blob.sentiment

執行結果是什麼?

給你10秒鐘,猜猜看。

不賣關子了,是這樣的:

手把手教你如何用 Python 做情感分析

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

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

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

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

手把手教你如何用 Python 做情感分析

snownlp 的相關連結如下:

<a href="http://t.cn/8kf1c3p" target="_blank">http://t.cn/8kf1c3p</a>

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

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

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

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

from snownlp import snownlp s = snownlp(text)

我們想看看snownlp能不能像textblob一樣正确劃分我們輸入的句子,是以我們執行以下輸出:

for sentence in s.sentences:  print(sentence)

執行的結果是這樣的:

手把手教你如何用 Python 做情感分析

好的,看來snownlp對句子的劃分是正确的。

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

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

執行後的結果是:

手把手教你如何用 Python 做情感分析

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

我們來看第二句:

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

執行結果如下:

手把手教你如何用 Python 做情感分析

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

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

這麼解釋就合理多了。

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

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

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

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

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

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

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

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

====================================分割線================================

本文作者:ai研習社