如何批量處理評論信息情感分析,而且在時間軸上可視化呈現?輿情分析並不難,讓咱們用Python來實現它吧。python
你是一家連鎖火鍋店的區域經理,很注重顧客對餐廳的評價。從前,你苦惱的是顧客不愛寫評價。最近由於餐廳火了,分店愈來愈多,寫評論的顧客也多了起來,因而你新的痛苦來了——評論太多了,讀不過來。git
從我這兒,你瞭解到了情感分析這個好用的自動化工具,一會兒以爲見到了曙光。github
你從某知名點評網站上,找到了本身一家分店的頁面,讓助手把上面的評論和發佈時間數據弄下來。由於助手不會用爬蟲,因此只能把評論從網頁上一條條複製粘貼到Excel裏。下班的時候,才弄下來27條。(注意這裏咱們使用的是真實評論數據。爲了不對被評論商家形成困擾,統一將該餐廳的名稱替換爲「A餐廳」。特此說明。)bash
好在你只是想作個試驗而已,將就了吧。你用我以前介紹的中文信息情感分析工具,依次得出了每一條評論的情感數值。剛開始作出結果的時候,你很興奮,以爲本身找到了輿情分析的終極利器。微信
但是美好的時光老是短暫的。很快你就發現,若是每一條評論都分別運行一次程序,用機器來作分析,還真是不如本身挨條去讀省事兒。app
怎麼辦呢?機器學習
辦法天然是有的。咱們能夠利用《貸仍是不貸:如何用Python和機器學習幫你決策?》一文介紹過的數據框,一次性處理多個數據,提高效率。函數
可是這還不夠,咱們還能夠把情感分析的結果在時間序列上可視化出來。這樣你一眼就能夠看見趨勢——近一段時間裏,你們是對餐廳到底是更滿意了,仍是愈來愈不滿意呢?工具
咱們人類最擅長處理的,就是圖像。由於漫長的進化史逼迫咱們不斷提高對圖像快速準確的處理能力,不然就會被環境淘汰掉。所以纔會有「一幅圖賽過千言萬語」的說法。post
首先,你須要安裝Anaconda套裝。詳細的流程步驟請參考《 如何用Python作詞雲 》一文。
助手好不容易作好的Excel文件restaurant-comments.xlsx
,請從這裏下載。
用Excel打開,若是一切正常,請將該文件移動到我們的工做目錄demo下。
由於本例中咱們須要對中文評論做分析,所以使用的軟件包爲SnowNLP。情感分析的基本應用方法,請參考《如何用Python作情感分析?》。
到你的系統「終端」(macOS, Linux)或者「命令提示符」(Windows)下,進入咱們的工做目錄demo,執行如下命令。
pip install snownlp
pip install ggplot
複製代碼
運行環境配置完畢。
在終端或者命令提示符下鍵入:
jupyter notebook
複製代碼
若是Jupyter Notebook正確運行,下面咱們就能夠開始編寫代碼了。
咱們在Jupyter Notebook中新建一個Python 2筆記本,起名爲time-series。
首先咱們引入數據框分析工具Pandas,簡寫成pd以方便調用。
import pandas as pd
複製代碼
接着,讀入Excel數據文件:
df = pd.read_excel("restaurant-comments.xlsx")
複製代碼
咱們看看讀入內容是否完整:
df.head()
複製代碼
結果以下:
注意這裏的時間列。若是你的Excel文件裏的時間格式跟此處同樣,包含了日期和時間,那麼Pandas會很是智能地幫你把它識別爲時間格式,接着往下作就能夠了。
反之,若是你獲取到的時間只精確到日期,例如"2017-04-20"這樣,那麼Pandas只會把它當作字符串,後面的時間序列分析沒法使用字符串數據。解決辦法是在這裏加入如下兩行代碼:
from dateutil import parser
df["date"] = df.date.apply(parser.parse)
複製代碼
這樣,你就得到了正確的時間數據了。
確認數據完整無誤後,咱們要進行情感分析了。先用第一行的評論內容作個小實驗。
text = df.comments.iloc[0]
複製代碼
而後咱們調用SnowNLP情感分析工具。
from snownlp import SnowNLP
s = SnowNLP(text)
複製代碼
顯示一下SnowNLP的分析結果:
s.sentiments
複製代碼
結果爲:
0.6331975099099649
複製代碼
情感分析數值能夠正確計算。在此基礎上,咱們須要定義函數,以便批量處理全部的評論信息。
def get_sentiment_cn(text):
s = SnowNLP(text)
return s.sentiments
複製代碼
而後,咱們利用Python裏面強大的apply語句,來一次性處理全部評論,而且將生成的情感數值在數據框裏面單獨存爲一列,稱爲sentiment。
df["sentiment"] = df.comments.apply(get_sentiment_cn)
複製代碼
咱們看看情感分析結果:
df.head()
複製代碼
新的列sentiment已經生成。咱們以前介紹過,SnowNLP的結果取值範圍在0到1之間,表明了情感分析結果爲正面的可能性。經過觀察前幾條數據,咱們發現點評網站上,顧客對這家分店評價整體上仍是正面的,並且有的評論是很是積極的。
可是少許數據的觀察,可能形成咱們結論的偏頗。咱們來把全部的情感分析結果數值作一下平均。使用mean()
函數便可。
df.sentiment.mean()
複製代碼
結果爲:
0.7114015318571119
複製代碼
結果數值超過0.7,總體上顧客對這家店的態度是正面的。
咱們再來看看中位數值,使用的函數爲median()
。
df.sentiment.median()
複製代碼
結果爲:
0.9563139038622388
複製代碼
咱們發現了有趣的現象——中位數值不只比平均值高,並且幾乎接近1(徹底正面)。
這就意味着,大部分的評價一邊倒表示很是滿意。可是存在着少部分異常點,顯著拉低了平均值。
下面咱們用情感的時間序列可視化功能,直觀查看這些異常點出如今什麼時間,以及它們的數值究竟有多低。
咱們須要使用ggplot繪圖工具包。這個工具包本來只在R語言中提供,讓其餘數據分析工具的用戶羨慕得流口水。幸虧,後來它很快被移植到了Python平臺。
咱們從ggplot中引入繪圖函數,而且讓Jupyter Notebook能夠直接顯示圖像。
%pylab inline
from ggplot import *
複製代碼
這裏可能會報一些警告信息。沒有關係,不理會就是了。
下面咱們繪製圖形。這裏你能夠輸入下面這一行語句。
ggplot(aes(x="date", y="sentiment"), data=df) + geom_point() + geom_line(color = 'blue') + scale_x_date(labels = date_format("%Y-%m-%d"))
複製代碼
你能夠看到ggplot的繪圖語法是多麼簡潔和人性化。只須要告訴Python本身打算用哪一個數據框,從中選擇哪列做爲橫軸,哪列做爲縱軸,先畫點,後連線,而且能夠指定連線的顏色。而後,你須要讓X軸上的日期以何種格式顯示出來。全部的參數設定跟天然語言很類似,直觀並且易於理解。
執行後,就能夠看到結果圖形了。
在圖中,咱們發現許多正面評價情感分析數值極端的高。同時,咱們也清晰地發現了那幾個數值極低的點。對應評論的情感分析數值接近於0。這幾條評論,被Python斷定爲基本上沒有正面情感了。
從時間上看,最近一段時間,幾乎每隔幾天就會出現一次比較嚴重的負面評價。
做爲經理,你可能如坐鍼氈。但願儘快瞭解發生了什麼事兒。你不用在數據框或者Excel文件裏面一條條翻找情感數值最低的評論。Python數據框Pandas爲你提供了很是好的排序功能。假設你但願找到全部評論裏情感分析數值最低的那條,能夠這樣執行:
df.sort(['sentiment'])[:1]
複製代碼
結果爲:
情感分析結果數值幾乎就是0啊!不過這裏數據框顯示評論信息不徹底。咱們須要將評論總體打印出來。
print(df.sort(['sentiment']).iloc[0].comments)
複製代碼
評論完整信息以下:
此次是在情人節當天過去的,之前歷來沒在情人節正日子出來過,不是由於沒有男友,而是感受哪哪人都多,因此特地錯開,此次實在是饞A餐廳了,因此趕在正日子也出來了,從下午四點多的時候我看排號就排到一百多了,我從家開車過去得堵的話一個小時,我一看提早兩個小時就在網上先排着號了,差很少咱們是六點半到的,到那的時候我看號碼前面還有才三十多號,我想着確定沒問題了,等一會就能吃上的,沒想到悲劇了,就從咱們到那坐到等位區開始,大約是十分二十分一叫號,中途屢次我都想走了,哈哈,哎,等到最後早上九點才吃上的,服務員感受也沒之前悠閒時周到了,不過這確定的,一人負責好幾桌,今天節日這麼多人,確定是很累的,因此大多也都是我本身跑腿,沒讓服務員給弄太多,就蝦滑讓服務員下的,而後環境來講感受衛生方面是不錯,就是有些太吵了,味道仍是一如既往的那個味道,不過A餐廳最人性化的就是看咱們等了兩個多小時,上來送了咱們一張打折卡,並且當次就可使用,這點感受仍是挺好的,不愧是A餐廳,就是比通常的要人性化,不過此次就是選錯日子了,之後仍是得提早預定,要不就別趕節日去,太火爆了!
經過閱讀,你能夠發現這位顧客確實有了一次比較糟糕的體驗——等候的時間太長了,以致於使用了「悲劇」一詞;另外還說起服務不夠周到,以及環境吵鬧等因素。正是這些詞彙的出現,使得分析結果數值很是低。
好在顧客很通情達理,並且對該分店的人性化作法給予了正面的評價。
從這個例子,你能夠看出,雖然情感分析能夠幫你自動化處理不少內容,然而你不能徹底依賴它。
天然語言的分析,不只要看錶達強烈情感的關鍵詞,也須要考慮到表述方式和上下文等諸多因素。這些內容,是如今天然語言處理領域的研究前沿。咱們期待着早日應用到科學家們的研究成果,提高情感分析的準確度。
不過,即使目前的情感分析自動化處理不能達到很是準確,卻依然能夠幫助你快速定位到那些可能有問題的異常點(anomalies)。從效率上,比人工處理要高出許多。
你讀完這條評論,長出了一口氣。總結了經驗教訓後,你決定將人性化的服務貫徹到底。你又想到,能夠收集用戶等候時長數據,用數據分析爲等待就餐的顧客提供更爲合理的等待時長預期。這樣就能夠避免顧客一直等到很晚了。
祝賀你,經理!在數據智能時代,你已經走在了正確的方向上。
下面,你該認真閱讀下一條負面評論了……
除了情感分析和時間序列可視化,你以爲還能夠如何挖掘中文評論信息?除了點評網站以外,你還知道哪些輿情分析的數據來源?歡迎留言分享給你們,咱們一塊兒交流討論。
喜歡請點贊。還能夠微信關注和置頂個人公衆號「玉樹芝蘭」(nkwangshuyi)。
若是你對數據科學感興趣,不妨閱讀個人系列教程索引貼《如何高效入門數據科學?》,裏面還有更多的有趣問題及解法。