Python 有良好的程序包可以進行情感分類,那就是Python 自然語言處理包,Natural Language Toolkit ,簡稱NLTK 。NLTK 當然不只是處理情感分析,NLTK 有著整套自然語言處理的工具,從分詞到實體識別,從情感分類到句法分析,完整而豐富,功能強大。
創(chuàng)新互聯(lián)建站歡迎咨詢:13518219792,為您提供成都網(wǎng)站建設網(wǎng)頁設計及定制高端網(wǎng)站建設服務,創(chuàng)新互聯(lián)建站網(wǎng)頁制作領域十余年,包括成都食品包裝袋等多個領域擁有豐富的網(wǎng)站制作經(jīng)驗,選擇創(chuàng)新互聯(lián)建站,為企業(yè)保駕護航。
本文可以學習到以下內(nèi)容:
數(shù)據(jù)及源碼地址:
小凡,用戶對耳機商品的評論信息,你有沒有什么好的辦法分析一下?經(jīng)理來向小凡請教問題。
嗯,小凡想了一會兒......
我想到了兩種分析方法:
經(jīng)理聽完,甚是欣慰,便讓小凡著手分析用戶的評論數(shù)據(jù)。
數(shù)據(jù)解釋:
小凡使用百度飛漿(paddlepaddle)模型庫中的情感分析模型,將評論數(shù)據(jù)(content)轉化為情感類別【積極1,消極0】
一、window10+anaconda3的安裝命令:
二、安裝預訓練模型應用工具 PaddleHub
可以看到,大約 60% 的用戶給出好評
用戶的評論內(nèi)容多集中在配置、音質等主題上
這里使用百度飛漿的LAC分詞模型
分析結束后,小凡總結出以下結論:
小凡將結論匯報給經(jīng)理,和經(jīng)理一起想出一個可行的方案解決目前存在的問題。
如何批量處理評論信息情感分析,并且在時間軸上可視化呈現(xiàn)?輿情分析并不難,讓我們用Python來實現(xiàn)它吧。
痛點
你是一家連鎖火鍋店的區(qū)域經(jīng)理,很注重顧客對餐廳的評價。從前,你苦惱的是顧客不愛寫評價。最近因為餐廳火了,分店越來越多,寫評論的顧客也多了起來,于是你新的痛苦來了——評論太多了,讀不過來。
從我這兒,你了解到了情感分析這個好用的自動化工具,一下子覺得見到了曙光。
你從某知名點評網(wǎng)站上,找到了自己一家分店的頁面,讓助手把上面的評論和發(fā)布時間數(shù)據(jù)弄下來。因為助手不會用爬蟲,所以只能把評論從網(wǎng)頁上一條條復制粘貼到Excel里。下班的時候,才弄下來27條。(注意這里我們使用的是真實評論數(shù)據(jù)。為了避免對被評論商家造成困擾,統(tǒng)一將該餐廳的名稱替換為“A餐廳”。特此說明。)
好在你只是想做個試驗而已,將就了吧。你用我之前介紹的中文信息情感分析工具,依次得出了每一條評論的情感數(shù)值。剛開始做出結果的時候,你很興奮,覺得自己找到了輿情分析的終極利器。
可是美好的時光總是短暫的。很快你就發(fā)現(xiàn),如果每一條評論都分別運行一次程序,用機器來做分析,還真是不如自己挨條去讀省事兒。
怎么辦呢?
序列
辦法自然是有的。我們可以利用《貸還是不貸:如何用Python和機器學習幫你決策?》一文介紹過的數(shù)據(jù)框,一次性處理多個數(shù)據(jù),提升效率。
但是這還不夠,我們還可以把情感分析的結果在時間序列上可視化出來。這樣你一眼就可以看見趨勢——近一段時間里,大家是對餐廳究竟是更滿意了,還是越來越不滿意呢?
我們?nèi)祟愖钌瞄L處理的,就是圖像。因為漫長的進化史逼迫我們不斷提升對圖像快速準確的處理能力,否則就會被環(huán)境淘汰掉。因此才會有“一幅圖勝過千言萬語”的說法。
準備
首先,你需要安裝Anaconda套裝。詳細的流程步驟請參考《 如何用Python做詞云 》一文。
助手好不容易做好的Excel文件restaurant-comments.xlsx,請從這里下載。
用Excel打開,如果一切正常,請將該文件移動到咱們的工作目錄demo下。
因為本例中我們需要對中文評論作分析,因此使用的軟件包為SnowNLP。情感分析的基本應用方法,請參考《如何用Python做情感分析?》。
到你的系統(tǒng)“終端”(macOS, Linux)或者“命令提示符”(Windows)下,進入我們的工作目錄demo,執(zhí)行以下命令。
pip install snownlp
pip install ggplot
運行環(huán)境配置完畢。
在終端或者命令提示符下鍵入:
jupyter notebook
如果Jupyter Notebook正確運行,下面我們就可以開始編寫代碼了。
代碼
我們在Jupyter Notebook中新建一個Python 2筆記本,起名為time-series。
首先我們引入數(shù)據(jù)框分析工具Pandas,簡寫成pd以方便調(diào)用。
import pandas as pd
接著,讀入Excel數(shù)據(jù)文件:
df = pd.read_excel("restaurant-comments.xlsx")
我們看看讀入內(nèi)容是否完整:
df.head()
結果如下:
注意這里的時間列。如果你的Excel文件里的時間格式跟此處一樣,包含了日期和時間,那么Pandas會非常智能地幫你把它識別為時間格式,接著往下做就可以了。
反之,如果你獲取到的時間只精確到日期,例如"2017-04-20"這樣,那么Pandas只會把它當做字符串,后面的時間序列分析無法使用字符串數(shù)據(jù)。解決辦法是在這里加入以下兩行代碼:
from dateutil import parser
df["date"] = df.date.apply(parser.parse)
這樣,你就獲得了正確的時間數(shù)據(jù)了。
確認數(shù)據(jù)完整無誤后,我們要進行情感分析了。先用第一行的評論內(nèi)容做個小實驗。
text = df.comments.iloc[0]
然后我們調(diào)用SnowNLP情感分析工具。
from snownlp import SnowNLP
s = SnowNLP(text)
顯示一下SnowNLP的分析結果:
s.sentiments
結果為:
0.6331975099099649
情感分析數(shù)值可以正確計算。在此基礎上,我們需要定義函數(shù),以便批量處理所有的評論信息。
def get_sentiment_cn(text):
s = SnowNLP(text) return s.sentiments
然后,我們利用Python里面強大的apply語句,來一次性處理所有評論,并且將生成的情感數(shù)值在數(shù)據(jù)框里面單獨存為一列,稱為sentiment。
df["sentiment"] = df.comments.apply(get_sentiment_cn)
我們看看情感分析結果:
df.head()
新的列sentiment已經(jīng)生成。我們之前介紹過,SnowNLP的結果取值范圍在0到1之間,代表了情感分析結果為正面的可能性。通過觀察前幾條數(shù)據(jù),我們發(fā)現(xiàn)點評網(wǎng)站上,顧客對這家分店評價總體上還是正面的,而且有的評論是非常積極的。
但是少量數(shù)據(jù)的觀察,可能造成我們結論的偏頗。我們來把所有的情感分析結果數(shù)值做一下平均。使用mean()函數(shù)即可。
df.sentiment.mean()
結果為:
0.7114015318571119
結果數(shù)值超過0.7,整體上顧客對這家店的態(tài)度是正面的。
我們再來看看中位數(shù)值,使用的函數(shù)為median()。
df.sentiment.median()
結果為:
0.9563139038622388
我們發(fā)現(xiàn)了有趣的現(xiàn)象——中位數(shù)值不僅比平均值高,而且?guī)缀踅咏?(完全正面)。
這就意味著,大部分的評價一邊倒表示非常滿意。但是存在著少部分異常點,顯著拉低了平均值。
下面我們用情感的時間序列可視化功能,直觀查看這些異常點出現(xiàn)在什么時間,以及它們的數(shù)值究竟有多低。
我們需要使用ggplot繪圖工具包。這個工具包原本只在R語言中提供,讓其他數(shù)據(jù)分析工具的用戶羨慕得流口水。幸好,后來它很快被移植到了Python平臺。
我們從ggplot中引入繪圖函數(shù),并且讓Jupyter Notebook可以直接顯示圖像。
%pylab inlinefrom 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自己打算用哪個數(shù)據(jù)框,從中選擇哪列作為橫軸,哪列作為縱軸,先畫點,后連線,并且可以指定連線的顏色。然后,你需要讓X軸上的日期以何種格式顯示出來。所有的參數(shù)設定跟自然語言很相似,直觀而且易于理解。
執(zhí)行后,就可以看到結果圖形了。
在圖中,我們發(fā)現(xiàn)許多正面評價情感分析數(shù)值極端的高。同時,我們也清晰地發(fā)現(xiàn)了那幾個數(shù)值極低的點。對應評論的情感分析數(shù)值接近于0。這幾條評論,被Python判定為基本上沒有正面情感了。
從時間上看,最近一段時間,幾乎每隔幾天就會出現(xiàn)一次比較嚴重的負面評價。
作為經(jīng)理,你可能如坐針氈。希望盡快了解發(fā)生了什么事兒。你不用在數(shù)據(jù)框或者Excel文件里面一條條翻找情感數(shù)值最低的評論。Python數(shù)據(jù)框Pandas為你提供了非常好的排序功能。假設你希望找到所有評論里情感分析數(shù)值最低的那條,可以這樣執(zhí)行:
df.sort(['sentiment'])[:1]
結果為:
情感分析結果數(shù)值幾乎就是0??!不過這里數(shù)據(jù)框顯示評論信息不完全。我們需要將評論整體打印出來。
print(df.sort(['sentiment']).iloc[0].comments)
評論完整信息如下:
這次是在情人節(jié)當天過去的,以前從來沒在情人節(jié)正日子出來過,不是因為沒有男朋友,而是感覺哪哪人都多,所以特意錯開,這次實在是饞A餐廳了,所以趕在正日子也出來了,從下午四點多的時候我看排號就排到一百多了,我從家開車過去得堵的話一個小時,我一看提前兩個小時就在網(wǎng)上先排著號了,差不多我們是六點半到的,到那的時候我看號碼前面還有才三十多號,我想著肯定沒問題了,等一會就能吃上的,沒想到悲劇了,就從我們到那坐到等位區(qū)開始,大約是十分二十分一叫號,中途多次我都想走了,哈哈,哎,等到最后早上九點才吃上的,服務員感覺也沒以前清閑時周到了,不過這肯定的,一人負責好幾桌,今天節(jié)日這么多人,肯定是很累的,所以大多也都是我自己跑腿,沒讓服務員給弄太多,就蝦滑讓服務員下的,然后環(huán)境來說感覺衛(wèi)生方面是不錯,就是有些太吵了,味道還是一如既往的那個味道,不過A餐廳最人性化的就是看我們等了兩個多小時,上來送了我們一張打折卡,而且當次就可以使用,這點感覺還是挺好的,不愧是A餐廳,就是比一般的要人性化,不過這次就是選錯日子了,以后還是得提前預約,要不就別趕節(jié)日去,太火爆了!
通過閱讀,你可以發(fā)現(xiàn)這位顧客確實有了一次比較糟糕的體驗——等候的時間太長了,以至于使用了“悲劇”一詞;另外還提及服務不夠周到,以及環(huán)境吵鬧等因素。正是這些詞匯的出現(xiàn),使得分析結果數(shù)值非常低。
好在顧客很通情達理,而且對該分店的人性化做法給予了正面的評價。
從這個例子,你可以看出,雖然情感分析可以幫你自動化處理很多內(nèi)容,然而你不能完全依賴它。
自然語言的分析,不僅要看表達強烈情感的關鍵詞,也需要考慮到表述方式和上下文等諸多因素。這些內(nèi)容,是現(xiàn)在自然語言處理領域的研究前沿。我們期待著早日應用到科學家們的研究成果,提升情感分析的準確度。
不過,即便目前的情感分析自動化處理不能達到非常準確,卻依然可以幫助你快速定位到那些可能有問題的異常點(anomalies)。從效率上,比人工處理要高出許多。
你讀完這條評論,長出了一口氣。總結了經(jīng)驗教訓后,你決定將人性化的服務貫徹到底。你又想到,可以收集用戶等候時長數(shù)據(jù),用數(shù)據(jù)分析為等待就餐的顧客提供更為合理的等待時長預期。這樣就可以避免顧客一直等到很晚了。
祝賀你,經(jīng)理!在數(shù)據(jù)智能時代,你已經(jīng)走在了正確的方向上。
下面,你該認真閱讀下一條負面評論了……
討論
除了情感分析和時間序列可視化,你覺得還可以如何挖掘中文評論信息?除了點評網(wǎng)站之外,你還知道哪些輿情分析的數(shù)據(jù)來源?歡迎留言分享給大家,我們一起交流討論。
如果你對我的文章感興趣,歡迎點贊,并且微信關注和置頂我的公眾號“玉樹芝蘭”(nkwangshuyi)。
如果你身邊有好友正在做輿情分析的研究工作,也歡迎你把這篇文章轉發(fā)給他們,共同學習和提高。
這句話應該不是說你feature太多了,而是說for循環(huán)中,使用了兩個變量去unpack featuresets太多了。所以應該是你的數(shù)據(jù)結構有問題,featuresets可能不是適合兩個變量來解包的數(shù)據(jù)結構,或者中文編碼有問題。
由于語料缺乏,前期若使用到情感分析,建議暫時使用SnowNLP(此模塊主要使用淘寶評論語料)做情感挖掘,但不僅僅為單純調(diào)用,需要優(yōu)化,下面是一些實踐思考:
可在此基礎上優(yōu)化,比如文本需要特別處理,除了平常的去停用詞外,還可以需要對輸入的文本結合詞性等進行處理。
下面是一些常識:
一)無情感的詞語(如去停用詞,去掉語氣詞,無詞性標簽的詞語)
二)對于文本過長,則可以考慮提取關鍵詞或抽取文本摘要后再提取關鍵詞
對于后者實踐結果差異明顯:
以"發(fā)布了頭條文章: 《5分鐘11億!京東雙11場景化產(chǎn)品消費增長明顯》 5分鐘11億!京東雙11場景化產(chǎn)品消費增長明顯 "為例子, 顯然該文本為“積極****”文本。
1)s = SnowNLP("發(fā)布了頭條文章:《5分鐘11億!京東雙11場景化產(chǎn)品消費增長明顯》 5分鐘11億!京東雙11場景化產(chǎn)品消費增長明顯")
得分為0.5,明顯不符合
2)s = SnowNLP(“ ”.join(jieba.analyse.textrank("發(fā)布了頭條文章:《5分鐘11億!京東雙11場景化產(chǎn)品消費增長明顯》 5分鐘11億!京東雙11場景化產(chǎn)品消費增長明顯")))
而對于文本特別長的,則可以先抽取摘要,再對摘要提取關鍵詞。
這主要由于此SnowNLP主要用貝葉斯機器學習方法進行訓練文本,機器學習在語料覆蓋上不夠,特征上工程處理不當會減分,也沒考慮語義等。
為何要考慮語義層面:
以“ 蘇寧易購,是誰給你們下架OV的勇氣****” 中的“ 下架”其實才是中心詞(為表達憤怒的文本),但“ 勇氣 ”為下架的賓語(其為積極的文本),此句應該結果小于0.5,但實際為0.88,去掉“蘇寧易購”則為0.6
分享文章:python情感分析函數(shù) python文本情感分析代碼
文章轉載:http://chinadenli.net/article28/dodiecp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、關鍵詞優(yōu)化、ChatGPT、動態(tài)網(wǎng)站、外貿(mào)網(wǎng)站建設、移動網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)