大數據輿情情感分析,如何提取情感並使用什麼樣的工具?(貼情感標籤)
1、我將數據篩選預處理好,然後分好詞。
2、是不是接下來應該與與情感辭彙本庫對照,生成結合詞頻和情感詞庫的情感關鍵詞庫。3、將信息與情感關鍵詞庫進行比對,對信息加以情感標記。4、我想問實現前三步,需要什麼工具的什麼功能呢?據說用spss和武漢大學的ROST WordParser。該如何使用呢?本題已收錄至知乎圓桌:人工智慧 · 語言智能,更多「人工智慧」相關話題歡迎關注討論
情感分析是學術領域研究多年的課題,用google學術搜索可以找到很多paper,基本的方法上有基於詞典規則的方法、語言文法的方法,此外還有分類器以及近幾年比較火的深度學習的方法(稍後有詳細介紹)。
各類paper是有一定的借鑒意義的,不過這主要是學術界在單個問題上的細化,要真正從研究領域落地到大數據的處理還有很多工作要做。
一、工程上的處理流程
工程上的處理流程具體包括以下幾個方面:
1、情感分析任務的界定
在進行情感分析任務的界定時,要弄清楚工程的需求到底是什麼;要分析文本的哪個層面上的情感,比如篇章、段落、句子、短語、詞等粒度;是不是要分析所有的文本還是分析其中的部分文本;准許的錯誤誤差是在個什麼範圍內等。
2、情感分析標準的制定
在實際的企業應用中往往要根據行業的特點來制定一些情感分析的標準,甚至要從客戶的立場中去建立標準。根據國雙實際接觸客戶的經驗,在行業上建立標準後,還需要再具體跟客戶做一些適度調整。
3、 語料數據加工、詞典加工
有了上一步的工作, 接下來進行加工語料或者字典的總結。這一步中不同的方法要做的工作不同,基本上是鋪人力的工作,難點是讓各個語料加工人員能協調一致,執行統一的標準 (通常會在這個過程中還會反作用到第二步情感分析標準的制定,因為看到實際數據後會發現標準總會有一些模糊地帶) 。
4、根據數據特徵、規模等選擇合適的方法,並評測方法的優劣
工程中的方法並不是單一的方法,想用一個方法或者模型來解決各類數據源上的問題是不可能的。想要做出好的效果一定是採用分而治之的思想,比如,能用規則精準過的就不需要用分類器。
當應用在實際產品時,最好能結合產品的垂直特點,充分利用垂直行業的特性,比如在金融行業、汽車行業,它們一定有自己的行話,這些行話具有非常明顯的規則或者特徵。
二、情感分析方法及工具
情感分析對象的粒度最小是辭彙,但是表達一個情感的最基本的單位則是句子,辭彙雖然能描述情感的基本信息,但是單一的辭彙缺少對象,缺少關聯程度,並且不同的辭彙組合在一起所得到的情感程度不同甚至情感傾向都相反。所以以句子為最基本的情感分析粒度是較為合理的。篇章或者段落的情感也可以通過句子的情感來計算。
現階段關於情感分析方法主要有兩類:
(一)、基於詞典的方法:
基於詞典的方法主要通過制定一系列的情感詞典和規則,對文本進行拆句、分析及匹配詞典(一般有詞性分析,句法依存分析),計算情感值,最後通過情感值來作為文本的情感傾向判斷的依據。
做法:
基於詞典的情感分析大致步驟如下:
- 對大於句子力度的文本進行拆解句子操作,以句子為最小分析單元;
- 分析句子中出現的詞語並按照情感詞典匹配;
- 處理否定邏輯及轉折邏輯;
- 計算整句情感詞得分(根據詞語不同,極性不同,程度不同等因素進行加權求和);
- 根據情感得分輸出句子情感傾向性。
如果是對篇章或者段落級別的情感分析任務,按照具體的情況,可以以對每個句子進行單一情感分析並融合的形式進行,也可以先抽取情感主題句後進行句子情感分析,得到最終情感分析結果。
參考及工具:
1. 常見英文情感詞庫:GI(The General Inquirer)、sentiWordNet等;
2. 常見中文情感詞庫:知網、台灣大學的情感極性詞典;
3. 幾種情感詞典構建方法:基於bootstrapping方法的Predicting the semantic orientation of adjectives及Determining the sentiment of opinions兩種最為經典的詞典構建方法。
(二)、 基於機器學習的方法:
情感詞典準確率高,但存在召回率比較低的情況。對於不同的領域,構建情感詞典的難度是不一樣的,精準構建成本較高。另外一種解決情感分析的思路是使用機器學習的方法,將情感分析作為一個有監督的分類問題。對於情感極性的判斷,將目標情感分為三類:正、中、負。對訓練文本進行人工標註,然後進行有監督的機器學習過程,並對測試數據用模型來預測結果。
處理過程:
基於機器學習的情感分析思路是將情感分析作為一個分類問題來處理,具體的流程如下:
1、 文本預處理
文本的預處理過程是使用機器學習作用於文本分類的基礎操作。由於文本是非結構化數據及其特殊性,計算機並不能直接理解,所以需要一系列的預處理操作後,轉換為計算機可以處理的結構化數據。在實際分析中,文本更為複雜,書寫規範也更為隨意,且很有可能摻雜部分雜訊數據。整體上來說,文本預處理模塊包括去噪、特徵提取、文本結構化表示等。
特徵抽取:中文最小語素是字,但是往往詞語才具有更明確的語義信息,但是隨著分詞,可能出現詞語關係丟失的情況。n-元文法正好解決了這個問題,它也是傳統機器學習分類任務中最常用的方法。
文本向量化:對抽取出來的特徵,向量化是一個很重要的過程,是實現由人可以理解的文本轉換為計算機可以處理數據的重要一步。這一步最常用到的就是詞袋模型(bag-of-words )以及最近新出的連續分布詞向量模型(word Embedding)。詞袋模型長度為整個詞表的長度,詞語對應維度置為詞頻,文檔的表示往往比較稀疏且維度較高。Embedding的表示方式,能夠有效的解決數據稀疏且降維到固定維度,更好的表示語義信息。對於文檔表示,詞袋模型可以直接疊加,而Embedding的方法可以使用深度學習的方法,通過pooling得到最終表示。
特徵選擇:在機器學習分類演算法的使用過程中,特徵好壞直接影響機器的準確率及召回率。選擇有利於分類的特徵,可以有效的減少訓練開支及防止模型過擬合,尤其是數據量較大的情況下,這一部分工作的重要性更加明顯。其選擇方法為,將所有的訓練語料輸入,通過一定的方法,選擇最有效的特徵,主要的方法有卡方,信息熵,dp深層感知器等等。
目前也有一些方法,從比句子粒度更細的層次去識別情感,如基於方面的情感分析(Aspect based Sentiment Analysis),他們從產品的評價屬性等更細粒度的方面對評價主體進行情感傾向性分析。
2、分類演算法選擇
文本轉換為機器可處理的結構後,接下來便要選擇進行機器學習的分類演算法。目前,使用率比較高的是深度學習(CNN,RNN)和支持向量機(SVM)。深度學習的方法,運算量大,準確率有一定的提高,所以都在做這方面的嘗試。而支持向量機則是比較傳統的方法,其準確率及數據處理能力也比較出色,很多人都在用它來做分類任務。
參考及工具:
1. svm分類 libsvm
2. python 機器學習工具scikit-learn
3. 深度學習框架:Tensorflow、Theano
by 崔維福
在自然語言研究中,情感、情緒往往是容易被忽略的因素。其實人類在談話、寫作、社交平台發布信息時,傳遞的不僅是語義,更是情感和意圖。如果忽略對「情感、情緒」的識別,輿情分析是很難準確的。
所以為了彌補傳統NLP、NLU的不足,竹間智能提出了「認知智能+情感智能」,也就是在自然語言語義理解的基礎上,融入意圖判斷和多模態情感識別(對人類文字、表情、語音、語調的情感識別)。這也算竹間智能的一個創新吧。
在此我們請教了竹間智能高級演算法工程師鄧霖,來分享一些我們在情感、情緒識別上的經驗。
---------------------------------正式回答分割線----------------------------------
你的問題,說容易也容易,說難也難。
說容易,是因為已經有現成的框架可供調用,包括分詞、實體識別、情感分析等眾多功能,比如pip install一個庫,就都搞定了。
如果要處理英文,就是著名的NLTK。如果要處理中文,推薦SnowNLP:
https://github.com/isnowfy/snownlp, 不過需要注意的是,SnowNLP的情感詞典是基於商品評價生成的,可能不適用於你的領域。領域遷移,是情感分析中的一個大問題,接下來會詳細敘述。
如果你對SnowNLP的情感詞典不滿意,可以試試台灣大學簡體中文情感極性詞典:https://0x9.me/EYrq7
下面,我就把「情感分析」這個話題展開一下,希望能對你有所幫助。
首先,基於情感詞典的方法,效果並不好
使用這種基於「情感詞典」的方式,沒有什麼學習過程,可以快速實現,畢竟最困難的部分「總結情感詞典」別人已經替你實現完了。但是缺點在於:準確率不高。主要存在如下兩類問題:
- 如何處理否定詞。一般來說,應該制訂規則,即,如果一個情感詞出現在否定詞後面,那麼該情感詞的「情感極性」就應該取反。但是,自然語言千變萬化,沒有那麼簡單。比如英語中的cannot recommend any more,中文中的「不要太便宜了吧」,上述規則就不起作用。
- 網上下載到的「情感詞典」往往是根據某個領域總結出來的,比如社交媒體或是電商的評論。如果使用一個根據社交媒體得到的「情感詞典」來判斷電商評論的情感,可能電商評論中大量表達情感的詞在「情感詞典」中根本就找不到。
然後,機器學習方法
為此,目前進行情感分析,更加精確的方法,是利用機器學習的方法,將「情感分析」轉化為一個文本分類問題(比如:正、負、中性),常見的分類演算法都可以被使用,如果再ensemble一下,效果應該更好。而最重要的問題,就是如何從文本中提取特徵,常見的文本特徵提取方式包括:
- Bag of words, TF-IDF
- 為了處理否定詞,以及處理常見短語,可以提取N-gram作為特徵,N是一個超參數
而「常規」機器學習的困難之處就在於,需要人工從文本提取特徵,且工作量大,比如N-gram時的N如何選取。另外,BOW/TF-IDF,每個詞都是以OHE向量表示,高緯度高稀疏的,缺乏語義,特徵表達能力很弱。
深度學習演算法
這也是Deep Learning能夠在「文本分類」(包括情感分析)領域得以流行,並相比較於常規機器學習演算法獲得更好成績的原因。
- Deep Learning演算法,無論CNN還是RNN,都能夠從文本中自動提取特徵RNN自不待言,本身就是為了「序列學習」而設計的,能夠學習到一句話詞語前後之間的「關係」。這種「關係」可以理解為上下文、或者一個否定詞和其控制的情感詞的聯繫……
- CNN打亂了詞之間的順序,理論上不太適合於學習語言,因為語言中的詞與詞之間的順序非常重要。但是事實上,CNN在文本分類上取得了非常好的效果。一種解釋可以理解為,CNN自動學習了一個最優的N-gram。(多說一句,深度學習中這種事例並不鮮見,比如著名的fastText,簡單得不像話,就是將一句話中的詞向量做一個平均,再接一個softmax,「據說」也取得了state-of-art的效果)。
- 使用word vector來表示詞,不僅解決了用OHE表示詞帶來的稀疏性問題,而且賦予每個word vector更多語義特徵。比如著名的「king - man + woman = queen」。而且,詞向量本身也可以作為變數,在分類問題的學習過程中fine tune,效果更好。
除了RNN,CNN這些基本架構以外,學術界還開發出許多更為複雜的模型,比如引入記憶網路Aspect Level Sentiment Classification with Deep Memory Network:
https://arxiv.org/abs/1605.08900 、Attention機制Aspect Level Sentiment Classification with Deep Memory Network:https://arxiv.org/abs/1605.08900 、將RNN與CNN學到的特徵聯起來……「把能接上的,都給它接上」。而事實上,根據我的經驗,使用這些更複雜的模型,對準確率的提升並不太大,比如提升個1%,卻可能引入更多的超參需要調。畢竟,使用fastText那種簡單得不像話的模型,都能取得state-of-art的性能,所以模型之間的差別並不大。一般來說:
- 使用CNN(因為CNN比RNN快太多)
- 使用pre-train的word embedding,並將embedding層也作為變數,在學習過程中加以update,往往就可以取得不錯的效果,可以作為baseline model,成為未來進一步提升的基礎。
另外,無論你使用演算法,常規的也好,深度學習也好,最重要的還是要認真研究你的數據,提煉出有意義的特徵。比如有論文就將文本的長度、感嘆號的數量都作為判斷情感的特徵,可以借鑒。
解決數據不足的問題:遷移學習
以上,通常就是來做文本分類,包括情感分析的一般方法,但是其實,它還缺少了一個最重要的方面,就是數據。俗話說得好,「錢不是問題,問題是沒錢」。這句話也同樣適用於機器學習,特別是深度模型的學習能力強,就需要更多的數據,否則極容易overfit。對於文本分類問題,如果有了標註數據,從網上下載一份word vectors,直接使用tensorflow、keras自帶的sample codes就能夠訓練出一個還不錯的分類模型。
但是問題來了,我們從哪裡去找那麼多的標註數據?英文的還好,Netflix, Amazon都開源了一些標註好的數據集,而中文的開源數據集少之又少。
為了解決這個問題,我們需要藉助遷移學習的思想。比如:
- 我們缺少的其實只是標註好的數據,因為人工標註費時費力。但網上海量的未標註數據極容易獲得;
- 深度學習中,其實大量的樣本與時間,都花在「特徵學習」上,即給定一個輸入樣本,如何給出它的一個「抽象」、「有意義」的表徵(encoding, representation)
為此,我們可以:
- 利用容易獲取的大量未標註數據,用unsupervised learning的方法,學習出一個還不錯的encoding model來表示文本。而具體到文本領域,可以參考Semi-supervised Sequence Learning:https://arxiv.org/abs/1511.01432 ,學習一個傳統的語言模型,或者學習一個seq2seq autoencoder,從而得到一個encoding model來表徵輸入的文本。
- 再利用少量的標註數據(或購買,或少量人工標註),在第一步獲得的encoding model的基礎上進行supervised learning,在這個過程中對encoding model進行fine tune,獲得最終的分類模型。
另外,比如你需要做一個關於電商產品評論的情感分析,卻沒有或者有很少該領域的評論標註數據。同時,你卻有大量另一個領域的評論標註數據,比如爬到的對電影的評論數據。你可以做一個domain adversarial training:https://arxiv.org/abs/1505.07818 。其核心思想就是,讓學習到的特徵比較通用,而不去過分迎合某個領域。為此,整個模型中包括了一個domain classifier,並且feature representation module要對抗domain classifier,以模糊領域的區別。
以上,就是文本分類,包括情感分析的發展脈絡、基本演算法和所面臨問題的一個簡單綜述,希望對你有幫助。
本回答來自竹間智能高級演算法工程師鄧霖
我們團隊正好在做大數據情感分析的產品,過程中有過一些思考,供知友參考。
1 分詞
工具推介
分詞、詞性以及parsing,都推薦ltp-cloud,速度快準確率高,對於專業領域也有不錯的表現能力
其他如stanford和fudannlp,要麼是速度慢,要麼是使用過程中常遇到各類問題,故而不是很推薦
2 建立情感關鍵詞庫
詞向量--把同類情感詞作為一個主題展示。為了對詞進行聚類,採用了woed embedding。傳統的bag of words中,每個詞只是向量空間的一個點,彼此間不具有相關性。這裡我們採用了word embedding方式將詞轉化為詞向量,利用已有語料訓練詞向量,擴展詞語特徵,進行聚類,最後結合人工標註將情感詞分組
句向量--同時,我們的產品要對遊戲的輿情進行分析。遊戲評論維度的挖掘:用戶在論壇、社交媒體上的語料屬於大規模短文本語料,具有稀疏性高、隨意性強的特點。如果直接利用傳統方法進行語料聚類來挖掘維度,效果很差。我們基於paragraph2vec演算法,將待聚類語料和歷史大量無標註語料統一進行訓練,得到每條語料的句向量,然後選出其中待分類語料的句向量進行聚類。在待分類樣本數較少時,該方法可以顯著擴展語料的語義特徵,使得聚類結果更加理想。
工具推介:需要用到的word embedding推薦word2vec和作者實現的一個doc2vec
更多關於大數據情感分析、語料分析的乾貨,可以看這篇文章:遊戲口碑的風向標--短文本聚類和維度口碑分析技術分享 - 騰訊WeTest
輿情大數據和電商數據推薦使用第谷數據,數據種類多而全面
情感傾向分析有兩條路子,你想做傳統的詞典對照分析,但這是個笨辦法,肥腸辛苦,樣本量大的話更是折磨死人……
建議你嘗試機器學習。現在有很多免費的中文語義分析平台(比如騰訊文智,boson等等)。你直接在自己熟悉的編程語言上調試一下就能用,很方便。
我是個文科生,之前關於編程一根毛都沒接觸過,暑假在家閑的難受,一時興起,硬啃了三天的python基礎常識,然後把幾萬條非結構化數據做了語義網路呈現和情感傾向可視化圖表。
如果有需要我就把自己做的傻瓜教程貼上來。
—————————————懶惰的分割線————————————————
鹹魚終於睡醒過來填坑了。
情感傾向測量和語義網可視化得做法是完全不同。今天寫一下情感測量吧,我用的是BosenNLP。
高能預警!你將看到極為草率、極為野生、粗糙程度令科班程序猿吐血身亡的操作步驟!!
↓↓↓
事前準備:安裝python、BosonNLP包(安裝方式見http://docs.bosonnlp.com/getting_started.html講的很詳細)、notepad++
第一步:清洗文本,變成python可識別的語句。
原始語句:他說「你是個傻子」
改成符合python的語句:"他說"你是個傻子"",
1、在word裡面把亂七八糟的標點符號去掉,包括換行符、無所謂的空格、多餘的雙引號等等。否則python會出錯。
2、在每一句話前後加上英文雙引號,這是python識別一個語句的標準。
第二步:把清理好的數據投餵給python。
1.調試BosonNLP,具體操作見http://docs.bosonnlp.com/sentiment.html
2.以微博為例,使用weibo模型,在Notepad++中編寫如下代碼
3.打開命令提示符
4.將上一步寫好的.py文件直接拖進
5.分析出每條數據的結果,每句話分析出來一串數字,就是情感傾向。
第三步:可視化呈現
把這些密密麻麻的數字弄到excel裡面,然後就可以開開心心進行可視化呈現啦!
我覺得這種粗糙的可視化不夠直觀,於是把一帶一路沿線省份的情感傾向做成了地圖。
沒錯就是這麼簡單,就是這麼無腦。盡情玩耍吧。
順頌冬安
我們團隊在做大數據情感分析的產品,有一個案例,供知友參考。
對推特數據進行文本情感語義分析
美國調查公司蓋洛普公司(Gallup poll found)民調顯示,至少51%美國人不贊同總統特朗普的政策。據外媒報道,特朗普上任8天以來引發51%美國人的不滿,42%美國人贊同新總統的政策。該項調查共有1500名成年美國人,誤差為3%。
為了驗證美國民眾的不滿情緒,我們以R語言抓取的特朗普推特數據為例,對數據進行文本挖掘,進一步進行情感分析,從而得到很多有趣的信息。
找到推特來源是蘋果手機或者安卓手機的樣本,清理掉其他來源的樣本
tweets &<- trump_tweets_df %&>%
select(id, statusSource, text, created) %&>%
extract(statusSource, "source", "Twitter for (.*?)&<") %&>%
filter(source %in% c("iPhone", "Android"))
對數據進行可視化計算不同時間,對應的推特比例.
並且對比安卓手機和蘋果手機上的推特數量的區別
從對比圖中我們可以發現,安卓手機和蘋果手機發布推特的時間有顯著的差別,安卓手機傾向於在5點到10點之間發布推特,而蘋果手機一般在10點到20,點左右發布推特.同時我們也可以看到,安卓手機發布推特數量的比例要高於蘋果手機
然後查看推特中是否含有引用 ,並且對比不同平台上的數量
ggplot(aes(source, n, fill = quoted)) +
geom_bar(stat = "identity", position = "dodge") +
labs(x = "", y = "Number of tweets", fill = "") +
ggtitle("Whether tweets start with a quotation mark (")")
從對比的結果來看,安卓手機,沒有引用的比例要明顯低於蘋果手機。而安卓手機應用的數量要明顯大於蘋果手機。因此可以認為,蘋果手機發的推特內容大多為原創,而安卓手機大多為應用內
然後查看推特中是否有鏈接或者圖片,並且對比不同平台的情況
ggplot(tweet_picture_counts, aes(source, n, fill = picture)) +
geom_bar(stat = "identity", position = "dodge") +
labs(x = "", y = "Number of tweets", fill = "")
從上面的對比圖中,我們可以看到安卓手機沒有圖片或者鏈接的情況要多與蘋果,也就是說,使用蘋果手機的用戶在發推特的時候一般會發布照片或者鏈接
同時可以看到安卓平台的用戶把推特一般不使用圖片或者鏈接,而蘋果手機的用戶恰恰相反
spr &<- tweet_picture_counts %&>%
spread(source, n) %&>%
mutate_each(funs(. / sum(.)), Android, iPhone)
rr &<- spr$iPhone[2] / spr$Android[2]
然後我們對推特中的異常字元進行檢測,並且進行刪除
然後找到推特中關鍵詞,並且按照數量進行排序
library(tidytext)
reg &<- "([^A-Za-z\d#@"]|"(?![A-Za-z\d#@]))"
tweet_words &<- tweets %&>%
filter(!str_detect(text, "^"")) %&>%
mutate(text = str_replace_all(text, "https://t.co/[A-Za-z\d]+|amp;", "")) %&>%
unnest_tokens(word, text, token = "regex", pattern = reg) %&>%
filter(!word %in% stop_words$word,
str_detect(word, "[a-z]"))
tweet_words
tweet_words %&>%
count(word, sort = TRUE) %&>%
head(20) %&>%
mutate(word = reorder(word, n)) %&>%
ggplot(aes(word, n)) +
geom_bar(stat = "identity") +
ylab("Occurrences") +
coord_flip()
從圖中我們可以看到希拉里這個關鍵詞的排名是第一,隨後是特朗普2016這個關鍵詞。同時在後面的關鍵詞中,我們還看到了特朗普,以及柯林頓等。
對數據進行情感分析,並且計算安卓和蘋果手機的相對影響比例
通過特徵詞情感傾向分別計算不同平台的情感比,並且進行可視化
在統計出不同情感傾向的詞的數量之後,繪製他們的置信區間。從上面的圖中可以看到,相比於蘋果手機,安卓手機的負面情緒最多,其次是disgust,然後是悲傷。表示積極的情感傾向很少。
然後我們對每個情感類別中出現的關鍵詞的數量進行統計
android_iphone_ratios %&>%
inner_join(nrc, by = "word") %&>%
filter(!sentiment %in% c("positive", "negative")) %&>%
mutate(sentiment = reorder(sentiment, -logratio),
word = reorder(word, -logratio)) %&>%
從結果中我們可以看到,負面詞大多出現在安卓手機上,而蘋果手機上出現的負面詞的數量要遠遠小於安卓平台上的數量
公眾號 拓端數據
對推特數據進行文本情感語義分析 - 知乎專欄
分詞可以使用結巴,我使用的是CRF進行詞語標記,當然提前已經有詞庫了,可以使用Hadoop和open spark這樣的平台跑數據,
不是一個人能搞定的。光是一個詞庫就能弄個半死,然後情感強烈程度的判定,正負面信息的判定就得上機器學習了吧。再往下做 神經網路也是繞不過去的東西。我感覺我的畢設懸了...
瀉藥啊,沒處理過中文文本,也沒做過情感分析。隨手搜了幾條鏈接,希望對你有用,更希望你做出來之後,自己來貼一個回答。如果是具體關於工具包怎麼用的問題,請看說明文檔。我經常遇到「工具包不會用,網上搜了半天,最後在說明文檔里看到答案」的情況。http://tcci.ccf.org.cn/conference/2012/dldoc/NLPCC2012papers/workshoppapers/sen/018.pdfhttp://nlp.csai.tsinghua.edu.cn/site2/images/file/2011_xlx_master_thesis.pdfhttp://tcci.ccf.org.cn/conference/2012/dldoc/NLPCC2012papers/workshoppapers/sen/013.pdf
題主現在做出來了嗎?用什麼工具做的?
推薦閱讀: