情感分類(sentiment classification)推薦使用什麼演算法和軟體包?
CRFs還是SVM還是MaxEnt。知乎上的大牛給介紹下,哪種精度最高,又各有什麼優缺點。另外還想問一下推薦什麼軟體包,NLTK or lingpipe or CRF++?好像他們的License不同,有些蠻限制商用的,另外好奇業界一般用什麼包?
題主的問題是情感分類的演算法,正如幾位答主提到的,情感分類問題的目標有較大差異,針對不同的問題,如提取情感詞描述的對象等需要用到句法分析的問題,需要用CRFs演算法,如果只是對文檔進行情感分類,則SVM和MaxEnt都可以,且更關鍵的問題不在於選用哪種機器學習演算法,而在於適用於不同問題的特徵提取。
也藉此機會對情感分類做一個總結吧,也幫助更多人了解機器是怎樣識別文本的情感的~
下面將從這幾個方面闡述:
1.NLP情感分類任務有哪些,實際生活中有什麼用途
2.機器依靠什麼完成NLP情感分類(核心問題是什麼)
3.現有的針對不同情感分類任務的演算法
4.為什麼機器在NLP情感分類任務上還比不上人類
===============================分割線==========================
1.NLP情感分類任務有哪些,實際生活中有什麼用途
最容易想到的,就是對於一句或一段話,判斷說話者的情感,是正向(積極)的,還是負向(消極)的。即便是一段客觀的評論,也是可以判斷出該評論是在表揚一個事物,還是批評一個事物。這種情感分類任務可以看作一個二分類問題。
但情感其實並不僅限於好、壞兩種類別。一種更細的劃分是,好壞的程度如何?如果是一個1-5分的打分系統,判斷一個評論是幾分,則是一個五分類問題。另一種劃分方法是情感的類別,現代心理學把基本情感分為快樂、憤怒、恐懼、悲哀四種。也有很多emotion classification的研究把情感分為喜、怒、哀、驚訝、厭惡、恐懼和中立七種,可謂五花八門。當然了,如果只限於sentiment classification的話,還是重點在於正負兩種情感的分類的。
上述任務都只是分類問題,但很重要的一點是,我們的語言中所蘊含的信息,絕對不僅限於好壞情感的表達。拿一段評論來說,被評論的東西是什麼?它的哪些特性使評論者感到滿意或不滿意?這樣的特性使評論者感到滿意的原因是什麼?相比於僅僅將一段話分為正負兩種類別,這樣的語義信息往往更具有現實應用的價值,也更能體現人工智慧中「智能」的一面呢~
至於情感分類在現實中的應用,Coursera上Stanford的一門自然語言處理公開課中有比較好的舉例,在這裡直接引用了
圖1 商品評價統計
如網上的商品評論,每條評論評價的商品的哪個方面?是表揚還是批評?當然,購物網站一般會讓用戶自己打分,所以倒免去了對評論進行情感極性預測的麻煩。
圖2 社交網路情感傾向
再比如研究社交網路上網民對某一事物的評價如何,一條微博是積極的還是消極的,可以了解社會輿論對事物的看法。
圖3 Twitter情感與民意調查的關係
也有用社交網路網民發的twitter來與民意調查來進行對比的。
還有研究網民情緒隨時間的變化,比如周五晚上比較開心,周日晚上比較煩躁等等(這是一定的吧…)。
之所以要對NLP情感分類的任務做區分,是因為針對不同的任務,所用到的演算法是有很大差異的。退一步講,即使要解決的任務是一樣的(只區分一段話的正負向情感),訓練數據和測試數據的差異,也會使應用的演算法有所不同。
那下面就來說說,機器是怎麼檢測文本中的情感的。
2.機器依靠什麼完成NLP情感分類(核心問題是什麼)
情感分類問題可以用機器學習的方法來解決。題主所提到的CRFs、SVM、MaxEnt也都是傳統的機器學習方法。但正如幾位答主提到的,對於NLP情感分類問題而言,選擇哪種傳統機器學習方法並不是最關鍵的,有的論文中就用線性分類器或樸素貝葉斯分類器來進行分類。決定準確率的關鍵在於特徵的選取與語料的質量。
自然語言與圖像、語音的重要差異在於,自然語言有一套長時間積累形成的規則,且自然語言的表達具有很抽象的特徵。這即可以看作自然語言的優勢,也可以看作是劣勢。
優勢在於,因為自然語言是人為創造的,其特徵是高度抽象的,用這種特徵解決自然語言的問題,已經有很好的適用性和準確率,語法是確定而且有限的,有些詞只可能作為動詞出現,動詞後面只可能有幾種固定的成為搭配,等等。
劣勢一方面在於,自然語言有歧義性,一些語句就算讓人來理解,尚且會有差異,何況讓機器來分辨?另一方面則像上一篇回答的同學所提到的,用什麼樣的特徵來表示文本才足夠原始呢?每個詞看似已經是文本的足夠底層的特徵,但其實也是經過高度抽象的。這也會給深度學習在自然語言領域的應用帶來一些困難。當然,深度學習在自然語言領域已經有了一些應用,但其成果尚不如在圖像等領域那樣顯著。
那麼機器如何識別一句話中的情感?
一是依靠詞,二是依靠語法規則。
對於英語等語言來說,每個詞之間有空格分開,所以可以直接把空格分開的詞語作為一段評論/文檔的特徵,進行後續的分類。而對於中文這種沒有空格分詞的語言,則需要由分詞工具先對文本進行分詞,再進行後續的分類。
而對於語法,則在自然語言處理領域已經有很成熟的詞性標註、命名實體識別、句法分析的演算法與工具,這裡就不再進行贅述,僅將其歸為「語法規則」,說說這些演算法是怎樣服務於情感分類任務的。
這其實跟我們學語言是很像的,在我們學一門新語言時,也無外乎背單詞、學語法這兩項主要任務。人類想讓機器實現人的工作、像人一樣思考,第一反應肯定是從自身出發,希望能夠用這種方式「教」會機器人類的語言。
3.現有的針對不同情感分類任務的演算法
這裡我們只簡單概述一下不同情感分類任務演算法的基本思想,不做過於詳細的理論證明,因為不同的優化、約束方式有很多,但最本質的思想是比較相近的。
總的來說,可以將各種情感分類的方法分為基於統計和基於規則兩類。
首先,對於正負傾向情感分類問題,一個適用於本問題的語料庫已經能夠解決大部分問題,關鍵在於如何獲得高質量語料庫與詞語的情感極性。用詞袋模型(將每篇文檔表示為一個向量,每一維度代表一個詞語,其數值代表詞語在該文檔中的出現次數)可以表示每段文本。
在這種方法中,如果一段文本中出現了諸如great、excellent這樣的詞,那這段文本表達正向情感的可能性就很大,同樣的,如果出現了bad、awful這樣的詞,那這段文本就很可能表達負向情感。如果正、負向情感的詞都有呢?這就是讓機器學習詞語情感極性的作用了~給每個詞語賦一個情感得分,正向為正數,負向為負數,極性更強的詞語有更強的絕對值,比如great就會比good的絕對值更大。這樣就可以給每篇文本算得一個情感得分,也就是其為正向、負向情感的概率了。如下面這個例子:
圖4 正、負情感極性詞
藍色的都是正向的情感詞,紅色的是負向的情感詞,這些事用來判斷一段文本情感的重要依據,不論對於人還是機器來說。
但其實這裡有個trick,正向的情感詞很多,負向的只有一個,但我們很容易讀出這段評論的負向情感,機器怎麼做呢?可以依據假設詞」should be」,可以依據轉折詞」however」,這就加入了其他的信息。事實上,這也確實是難點之一。
但如何去確定每個詞的情感極性(構建情感詞典)呢?以及對於一些並不能表達情感的詞語,比如「I」,「the」,「tree」,怎麼把它們篩選掉,留下那些更有利於做情感分類的詞語呢?這其實是情感分類中更值得研究的問題。
不同的構建情感詞典的方法太多,但基本可以按上面所說的,分為基於統計和基於規則兩種。
如果我們有大量已經標註好正負情感的文檔,那麼統計不同的詞在這些文檔中的出現頻率,就可以對情感詞的情感極性(正、負以及強度)有一個初步的預測。具體可參考[3]
這裡舉一個例子,這是根據IMDB的打分評價系統統計的不同的詞在不同分數評價中的出現概率:
圖5 不同情感詞在IMDB打分評價系統中出現概率
詞的情感極性就很明顯了吧?這還是對評論按10個類別進行劃分的結果,如果只有正負兩種,則正負分布差異會更大。
基於規則的方法呢,就是通過已有的一些語法規則,讓機器通過一些標註好的情感詞(good,bad,excellent,awful)去學習更多的情感詞。比如兩個詞被and連接,那麼認為它們有相同的情感極性,被but連接,則有相反的極性,同時考慮否定詞如not、none的影響。
劉兵教授實驗室發過的一篇文章Expanding Domain Sentiment Lexicon through Double Propagation([4])中,提到這樣一種假設:在一段評論中,描述同一對象的詞具有同樣的情感極性。比如一段評論里說一款手機的屏幕非常好(good),那麼這段評論中如果還有形容手機屏幕的詞,則很可能也是表達好的(如解析度高、靈敏)。這就像我們在讀英文文章時,如果有一個詞不認識,那從其前後並列使用的詞語中,可以大致猜到這個詞的意思一樣。當然這種方法首先要對文本進行結構分析,找到每個形容詞描述的對象,這就需要基於規則的演算法了。
基於不同的數據集和情感詞分類方法,現在已經有很多情感詞典(sentiment lexicon),比如LIWC、MPQA、BING LIU OPINION LEXICON、SentiWordNet等,基於這些詞典,根據每段文本中出現的情感詞,可以對文本的情感進行基本的預測。
對於挖掘情感詞描述對象的任務,則需要在已知情感詞極性的基礎上,加入句法分析演算法,提取情感詞所描述的對象(屬性)。句法分析則是自然語言處理的另一個研究方向了,在這裡就不過多贅述了,簡單來說就是基於已有的語法規則,對文本進行處理,找到每句話中的主語、謂語、賓語等成分。也正如我們在讀一句話時,要看的不只是形容詞,更要看被描述的主體是什麼。
用劉兵教授在THU的一次演講中舉的例子:
圖6 情感詞對象提取
藍色的詞可以幫助我們識別評論者對描述對象的情感,紅色的詞是情感詞所描述的對象。
4.為什麼機器在NLP情感識別任務上還比不上人類
上面所說的依據情感詞和語法規則的方法進行情感分類看似合理,但為什麼機器在很多時候還是不能像人一樣準確地識別NLP中的情感呢?是因為人類在用語言進行交流時,還有一些更嚴苛的條件,或者說優勢,是機器暫時難以達到的。
第一是人類的推理能力。我們讀一句話、一段文本,不僅限於其字面意思,但對於機器而言,它們只能了解到字面意思。很多情感是隱晦(implicit)的。比如「如果這個手機銷量好,其他手機都要脫銷了」,這在我們看來一點也不難理解,但這裡面的假設、對比,對於機器而言是很難理解的。本質上說,就是我們難以將其歸結為某種特徵,讓機器去學習。這種對語言理解的推理能力,並不是依靠詞和語法就能夠完成的。
第二是人類理解語言時帶有其已經了解的大量先驗知識。比如「easy」這個詞,用來形容電子產品容易上手,是個正向情感詞,而說某本書思想很淺薄,則是個負向詞,這就涉及到一個詞在不同的領域的情感轉變。哪怕只在手機這個領域,「long」這個詞,用來說電池使用時間,就是正向詞,用來說打開app的時間,就是負向詞,這就涉及到不同的形容詞與描述對象的搭配。機器更多的從統計的角度來計算正、負情感的概率,但不可能將所有的情況全都存下來,更不用說我們在交流的時候還涉及了大量生活中的常識,這也是機器針對不同的情感分類問題,總是要用適用於這種問題的方法、語料來進行預測的原因。
第三是人類具有對語言的自我學習與遷移的能力。我們對語言的學習,是有著很自然的自我學習機制的,看到一個新詞、新搭配,即使不查字典,我們也會很自然地通過已有的知識推測這個詞的意思、並學習這種用法。但對於機器來說,這種利用將已有知識遷移到未知的能力是較差的,這也是為什麼從一個領域(比如書籍)學習到的情感詞,如果用在其他領域(比如電子產品),效果並不好,更不用說社交網路上層出不窮的原創辭彙了。事實上對於機器的這種遷移學習,已經有不少的研究,但不能否認的是,人類的這種自我學習與遷移的能力與意識,是機器還沒有達到的。
當然,這些只是現存的問題,並不能說明它們是不能解決的。劉兵教授在一次在THU的講座里提到Lifelong machine learning對解決情感分類問題的幫助,如對已有的領域(話題)進行學習,當出現一個新領域的情感分類問題時,如何判斷新領域與已有領域中的哪些相關性強、哪些相關性弱,並將強相關領域已學到的特徵傳遞到新領域中。
乍一聽感覺讓機器進行情感分析很厲害,但其實現在機器處理的情感分類任務還只是從數學統計角度,融合一些自然語言的語法規則,而完成的極性分類、語法分析的任務。而情感是一個很「玄幻」的東西,交給機器處理的也只是最能夠用數字量化的基本任務。所以,除了去提升用機器解決情感分類問題的準確性,探尋如何讓機器對人類情感的學習涉及到更廣的範疇、有更廣泛的應用,也是一件令人期待而興奮的事情呢~
參考文獻
[1]斯坦福大學自然語言處理公開課Coursera - Free Online Courses From Top Universities
[2]KDD China專題講座第一講{{S.China}}
[3]Yu H, Deng Z H, Li S. Identifying
Sentiment Words Using an Optimization-based Model without Seed Words[C]//ACL
(2). 2013: 855-859.
[4] Qiu G, Liu B, Bu J, et al. Expanding
Domain Sentiment Lexicon through Double Propagation[C]//IJCAI. 2009, 9:
1199-1204.
【非常高興看到大家喜歡並贊同我們的回答。應許多知友的建議,最近我們開通了同名公眾號:PhDer,也會定期更新我們的文章,如果您不想錯過我們的每篇回答,歡迎掃碼關注~ 】
http://weixin.qq.com/r/5zsuNoHEZdwarcVV9271 (二維碼自動識別)
同意基於詞典的正負詞詞頻。同時需要考慮反義辭彙,比如「不」 「沒有」 「雖然」 等詞。
基於機器學習的演算法,比如SVM,貝葉斯,你想想,首先第一個需求就是要對評論進行標註,第二個需求就是提取特徵。仔細一想,這種方法,完全是在捨近求遠,標註的依據是什麼?不就是詞么。 求取特徵怎麼做?光靠分詞這種自動化的方法也沒法做,必須得有詞典。
優點是什麼?一,標註需求少。二,特徵容易找到,而且準度很高。三,實現簡單。如果你要用更複雜的模型,比如找到主體客體什麼的,那實現起來不是件容易的事。
缺點是什麼?一是含主觀因素,這個影響不大,因為情感詞不像排序,辨識度還是很大的。二是詞的分數相當於是離散的,不是1就是-1或者0.,不能清晰的表述出情感的程度。在一個句子里 「很差」 和 「有點慢」 是沒有區別的,儘管明顯前一個句子明顯貶義的程度更明顯。但是其實這根本不能算是缺點。很少有句子是既包含貶義又包含褒義的,有人會說「有點慢,很好」么,他會這麼說「很好,雖然有點慢「。這時,反義辭彙的規則就派上用場了,結果計算就是 1+(-1)*(-1)=2。
基於這種方法,基本上電商的評論情感分析不必基於機器學習的演算法差。
雖然這個說的是褒貶分類,我想其他分類也類似。
snownlp?
謝謝!沒人邀請。。
典型的自然語言分類任務,個人感覺和分類器關係不大,主要在於你的特徵提取,我們的行話叫feature engineering.
用我老闆的話說,就是garbage in, garbage out.
之所以這麼說,因為現在各種統計模型都已經被優化了很多了,論文里經常可以看到最簡單的naive bayesian分類器也能達到接近SVM的效果, 可能就差那麼幾個百分點。更何況,現在各種分類器都已經被封裝地很好使用了,feature出來了,都用幾個試試也不麻煩,也就幾分鐘的事。
重頭是特徵提取。sentiment的特徵難以提取是臭名昭著的。考慮下面幾種情況:
1 我喜歡這部電影2 我不喜歡這部電影3 音效很差,演員太丑,電影院也很糟糕,但我真的很享受這個劇情以上出現的否定詞就是眾多難點中的一個難點,顯然用規則匹配是不現實的。你可能需要對句子進行語法分析,詞之間依存關係分析等,提取出你認為最可能有用的特徵,然後扔給隨便哪個分類器。
因此我建議:如果對結果要求不高,就直接簡單一點用簡單的特徵,比如bag of words來隨便做一個,或者我印象中清華還是哪個學校,有現成的中文詞語情感詞典。然後嘗試著看看有沒有現成的sentiment analysis的工具,包含已經訓練好的model的,拿來直接用,省去很多事。如果真的可以折騰,去論文里找答案,團隊里最好有NLP背景,語言學背景的人,來幫你們。謝邀!不是做深入的NLP的,只是在實驗室的微博情感分析上用過一些方法。從效果上看,我非常同意基於詞典的正負詞計算方法,在此基礎上再加一些否定詞、程度副詞、感嘆詞和反問句等規則,簡單有效。而基於機器學習的方法其實差別不大,關鍵還是在於語料和詞典的質量,以及特徵的選擇。
MaxEnt足夠好了,SVM太慢,CRF沒必要。
CRF是否做情感分類不太清楚,這個主要做分詞和實體識別吧。KNN,NaiveBayes,SVM經常用於情感分類,一般情況下NB和SVM要好於KNN。但是一味的追求演算法的調優沒有什麼意義,做好情感分類,一定要注意預處理工作和語料庫的標註。
Python、Java的上面有提到,我知道的R語言的:R語言的sentiment包https://github.com/timjurka/sentiment 以及夢幻般的RTextTools包 http://www.rtexttools.com/來源:Sentiment analysis with machine learning in R
還有用情感詞典進行分析,主要採用以下步驟進行(以情感極性分析為例):
①讀取情感詞典。獲得褒義詞列表、貶義詞列表、中性詞列表;獲得情感分類詞列表及其情感強度。
②處理要分析的文本。主要是讀取文本,按句子拆分,每個句子進行分詞。
③計算句子的情感得分。
R語言中有:
library(stringr) #對字元進行操作
library(rJava) #分詞需要調用java
library(Rwordseg) #用於分詞
詳見博客 用R進行文本內容情感分析
情感分析就是分析語言的褒貶傾向,那我們就可以把這個問題看做是給文本打分,其分值在-1——1,表示最貶義和最褒義區間。那麼這個問題就可以有4個思路。1. 訓練一個回歸模型,輸入是文本特徵,比如實詞,情感詞,句法結構,輸出情感分數。2. 使用分類模型,比如SVM,輸入同樣是詞,句法結構等特徵,輸出是褒貶區間,比如連個類別,褒和貶,或者更多的區間。這種方式一般很難獲得比較精確的情感分值。3. 基於模板的方式,通過機器學習或者人工的方式抽取句法關聯的情感模式,包括要簡歷,情感詞典和情感模式分值等,這種方式通常能夠獲得比較準確的情感分析,但是需要人工的投入。僅供參考。
情感分類最重要的就是基礎資源啦,沒有好的極性詞資源,再好的演算法都使不上力。當然,基礎的分類演算法都可以用啦~~~但本質上是要提高情感特徵抽取的精度吧,這點從主題模型入手也是不錯的選擇。。。
簡單便捷的就是樸素貝葉斯,高大上的可以搞deep learning。不用糾結精度,只要語料好,大部分分類器精度都足夠
NLTK裡面提供的樸素貝葉斯判別是可以的~NLTK Natural Language Processing with Python裡面有講到~如何定義特徵集挺關鍵的,書中的例子就是簡單的詞是否出現。
推薦閱讀:
※如何用通俗的語言解釋CTR和推薦系統中常用的Feature Hashing技術以及其對應的優缺點?
※darknet源碼該如何解讀?
※能否用具體的例子解釋一下 (Model-based) Structural Estimation?
※我註冊了一個全新的 Quora 賬戶,它是怎麼知道我喜歡什麼的?
※FTRL演算法在使用中需不需要通過Batch Model初始化?