情感分類(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.

【「科研君」公眾號初衷始終是希望聚集各專業一線科研人員和工作者,在進行科學研究的同時也作為知識的傳播者,利用自己的專業知識解釋和普及生活中的 一些現象和原理,展現科學有趣生動的一面。該公眾號由清華大學一群在校博士生髮起,目前參與的作者人數有10人,但我們感覺這遠遠不能覆蓋所以想科普的領域,並且由於空閑時間有限,導致我們只能每周發布一篇文章。我們期待更多的戰友加入,認識更多志同道合的人,每個人都是科研君,每個人都是知識的傳播者。我們期待大家的參與,想加入我們,進QQ群吧~:108141238】

【非常高興看到大家喜歡並贊同我們的回答。應許多知友的建議,最近我們開通了同名公眾號: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初始化?

TAG:機器學習 | 自然語言處理 |