如何用Python做輿情時間序列可視化?

如何批量處理評論信息情感分析,并且在時間軸上可視化呈現?輿情分析并不難,讓我們用Python來實現它吧。

痛點

你是一家連鎖火鍋店的區域經理,很注重顧客對餐廳的評價。從前,你苦惱的是顧客不愛寫評價。最近因為餐廳火了,分店越來越多,寫評論的顧客也多了起來,于是你新的痛苦來了——評論太多了,讀不過來。

從我這兒,你了解到了情感分析這個好用的自動化工具,一下子覺得見到了曙光。

你從某知名點評網站上,找到了自己一家分店的頁面,讓助手把上面的評論和發布時間數據弄下來。因為助手不會用爬蟲,所以只能把評論從網頁上一條條復制粘貼到Excel里。下班的時候,才弄下來27條。(注意這里我們使用的是真實評論數據。為了避免對被評論商家造成困擾,統一將該餐廳的名稱替換為“A餐廳”。特此說明。)

好在你只是想做個試驗而已,將就了吧。你用我之前介紹的中文信息情感分析工具,依次得出了每一條評論的情感數值。剛開始做出結果的時候,你很興奮,覺得自己找到了輿情分析的終極利器。

可是美好的時光總是短暫的。很快你就發現,如果每一條評論都分別運行一次程序,用機器來做分析,還真是不如自己挨條去讀省事兒。

怎么辦呢?

序列

辦法自然是有的。我們可以利用《貸還是不貸:如何用Python和機器學習幫你決策?》一文介紹過的數據框,一次性處理多個數據,提升效率。

但是這還不夠,我們還可以把情感分析的結果在時間序列上可視化出來。這樣你一眼就可以看見趨勢——近一段時間里,大家是對餐廳究竟是更滿意了,還是越來越不滿意呢?

我們人類最擅長處理的,就是圖像。因為漫長的進化史逼迫我們不斷提升對圖像快速準確的處理能力,否則就會被環境淘汰掉。因此才會有“一幅圖勝過千言萬語”的說法。

準備

首先,你需要安裝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)

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

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

推薦閱讀更多精彩內容