商品評論挖掘、電影推薦、股市預測……情感分析大有用武之地。本文幫助你一步步用Python作出本身的情感分析結果,難道你不想試試看?python
若是你關注數據科學研究或是商業實踐,「情感分析」(sentiment analysis)這個詞你應該不陌生吧?git
維基百科上,情感分析的定義是:github
文本情感分析(也稱爲意見挖掘)是指用天然語言處理、文本挖掘以及計算機語言學等方法來識別和提取原素材中的主觀信息。微信
聽着很高大上,是吧?若是說得具體一點呢?app
給你一段文本,你就能夠用情感分析的自動化方法得到這一段內容裏包含的情感色彩是什麼。工具
神奇吧?post
情感分析不是炫技工具。它是悶聲發大財的方法。早在2010年,就有學者指出,能夠依靠Twitter公開信息的情感分析來預測股市的漲落,準確率高達87.6%!大數據
在這些學者看來,一旦你可以得到大量實時社交媒體文本數據,且利用情感分析的黑魔法,你就得到了一顆預測近期投資市場趨勢的水晶球。編碼
這種用數據科學碾壓競爭者的感覺,是否是妙趣橫生啊?spa
大數據時代,咱們能夠得到的文本數據實在太多了。僅僅是大衆點評、豆瓣和亞馬遜上海量的評論信息就足夠咱們揮鍬掄鎬,深挖一通了。
你是否是疑惑,這麼高深的技術,本身這個非計算機專業的文科生,如何才能應用呢?
沒必要擔憂。從前情感分析還只是實驗室或者大公司的獨門祕籍。如今早已飛入尋常百姓家。門檻的下降使得咱們普通人也能夠用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)。
若是你對數據科學感興趣,不妨閱讀個人系列教程索引貼《如何高效入門數據科學?》,裏面還有更多的有趣問題及解法。