By:@小和子 (計算傳播學(xué)小站編輯)
情感傾向可認為是主體對某一客體主觀存在的內(nèi)心喜惡,內(nèi)在評價的一種傾向。它由兩個方面來衡量:一個情感傾向方向,一個是情感傾向度。 情感傾向方向也稱為情感極性。在微博中,可以理解為用戶對某客體表達自身觀點所持的態(tài)度是支持、反對、中立,即通常所指的正面情感、負面情感、中性情感。例如“贊美”與“表揚”同為褒義詞,表達正面情感,而“齷齪”與“丑陋”就是貶義詞,表達負面情感。 情感傾向度是指主體對客體表達正面情感或負面情感時的強弱程度,不同的情感程度往往是通過不同的情感詞或情感語氣等來體現(xiàn)。例如:“敬愛”與“親愛”都是表達正面情感,同為褒義詞。但是“敬愛”遠比“親愛”在表達情感程度上要強烈。通常在情感傾向分析研究中,為了區(qū)分兩者的程度差別,采取給每個情感詞賦予不同的權(quán)值來體現(xiàn)。 目前,情感傾向分析的方法主要分為兩類:一種是基于情感詞典的方法;一種是基于機器學(xué)習(xí)的方法,如基于大規(guī)模語料庫的機器學(xué)習(xí)。前者需要用到標注好的情感詞典,英文的詞典有很多,中文主要有知網(wǎng)整理的情感詞典Hownet和臺灣大學(xué)整理發(fā)布的NTUSD兩個情感詞典,還有哈工大信息檢索研究室開源的《同義詞詞林》可以用于情感詞典的擴充。基于機器學(xué)習(xí)的方法則需要大量的人工標注的語料作為訓(xùn)練集,通過提取文本特征,構(gòu)建分類器來實現(xiàn)情感的分類。 文本情感分析的分析粒度可以是詞語、句子也可以是段落或篇章。段落篇章級情感分析主要是針對某個主題或事件進行傾向性判斷,一般需要構(gòu)建對應(yīng)事件的情感詞典,如電影評論的分析,需要構(gòu)建電影行業(yè)自己的情感詞典效果會比通用情感詞典效果更好;也可以通過人工標注大量電影評論來構(gòu)建分類器。句子級的情感分析大多事通過計算句子里包含的所有情感詞的平均值來得到。 篇章級的情感分析,也可以通過聚合篇章中所有的句子的情感傾向來計算得出。因此,針對句子級的情感傾向分析,既能解決較短文本的情感分析,同時也可以是篇章級文本情感分析的基礎(chǔ)。本文正是根據(jù)這一思路,設(shè)計的情感分析算法。 算法主要由三部分組成: 1、文本切割轉(zhuǎn)換 算法設(shè)計的最大分析對象為篇章,最小對象為句子,我們可以把句子視作特例——單句的篇章,故算法分析的對象為文檔D。 Paragraph = Document.split(“/n”) ## 將文檔以換行符”/n”分割成段落P Sentence = Paragraph.split( punc ) punc = [“?!?”;”,”?”,”!”] ## 將段落用中文里常用的句號、分號、問號、感嘆號等劃分句意的符號,切割成不同的句子L Group = Sentence.split(“,”) ## 用逗號劃分出句子里的意群(表示情感的最小單元) Seg( each Group ) ##調(diào)用在線分詞工具或者本地分詞函數(shù),對意群進行分詞 開源中文分詞工具有很多,如在線的SCWS(PHP),張華平博士團隊開發(fā)的NLPIR(C、Python、Java),哈工大的LTP(C++、Python),還有R語言的分詞包RWordseg(NLPIR的R接口)。幾款分詞工具各有各自的特點,在這里不詳細介紹了,讀者可以自行檢索查閱。 文本切割的目的是將文本變成我們后續(xù)分析需要的格式,如句子“我今天很不高興?!?,進行文本切割后,轉(zhuǎn)換成: [(1,“我”,“r”),(2,“今天”,”t”),(3,“很”,”d”),(4,“不”,”d”),(5,“高興”,“a”)] 選擇不同的分詞工具,可以獲得不同的詞語屬性,用SCWS分詞,還可以獲得每個詞的IDF值;用LTP分詞,可以獲得句子的依存關(guān)系、語義角色等。這些屬性對于我們后面計算句子的情感傾向都是有幫助的。本文只用都了詞語的詞性,感興趣的讀者可以思考如何用其他的屬性來實現(xiàn)更好的情感分析。 2、情感定位 本文基于已有的中文情感詞庫,構(gòu)建了一張情感詞表,然后對文本進行中文分詞處理,將處理后得到的單詞依次與預(yù)先構(gòu)建好的情感詞表逐個查找,若能找到,則是情感詞,并讀取情感極性及相應(yīng)權(quán)值,否則,不是情感詞,則進入下一個候選單詞,直至整句話判斷結(jié)束。 過程可以表示如下: For each Paragraph in Document: For each Line in Paragraph: For each Group in Line: For each Word in Group: If word in senDict: senWord = (句中位置,情感傾向,情感強度) 文本的情感分析是從發(fā)現(xiàn)句中的情感詞開始,通過情感詞的傾向和傾向度,來決定句子的情感,從而決定整個文本的情感。但是我們在實際生活中會發(fā)現(xiàn),否定詞的修飾會使情感詞語的情感極性發(fā)生改變。比如:“我今天很不高興”,該句中“高興”是褒義詞,由于否定詞“不”的修飾,使其情感極性發(fā)生了改變,轉(zhuǎn)變成了負面情感。由于漢語中存在多重否定現(xiàn)象,即當否定詞出現(xiàn)奇數(shù)次時,表示否定意思;當否定詞出現(xiàn)偶數(shù)次時,表示肯定意思。本文單獨構(gòu)建了一個否定詞典notDict,并設(shè)置其權(quán)值為-1,常見的否定詞如:不、沒、無、非、莫、弗、毋、勿、未、否、別、無、休。 對否定詞的處理過程可以簡化為: For each Paragraph in Document: For each Line in Paragraph: For each Group in Line: For each Word in Group: If word in senDict: senWord = (句中位置,情感傾向,情感強度) LastSenWordPosition = 0 ##上一個情感詞在句中的位置 for i in range(senWord[0],LastSenWordPosition,-1): if Group[i] in notDict: notWord.append( (句中位置,-1) ) LastSenWordPosition = senWord[0] 另外,當程度副詞修飾情感詞,該情感詞的情感傾向程度發(fā)生了變化。比如: “今天坐了12個小時的車,身體極度疲憊?!保捌v”是一個貶義詞,前面一個程度副詞“極度”的修飾使得“疲憊”原來的情感傾向程度發(fā)生了變化,這比沒有修飾之前更加強烈。因此,為了準確表達文本的情感傾向,需做相應(yīng)的權(quán)值調(diào)整。本文中的程度副詞來源于知網(wǎng)(HowNet),選用“情感分析用詞語集(beta版)”中的“中文程度級別詞語”共219 個,藺璜等人提出了把程度副詞劃分六個等級,筆者為每個程度副詞定義了一個權(quán)重,被程度副詞修飾后的情感詞其權(quán)值應(yīng)做相應(yīng)調(diào)整。程度副詞如下表所示: 程度副詞示例 type 權(quán)值 超|over 1.5 很|very 1.25 極其|extreme / 最|most 2 較|more 1.2 欠|insufficiently 0.5 稍|-ish 0.8 程度副詞的處理過程跟否定詞類似,過程簡化如下: For each Paragraph in Document: For each Line in Paragraph: For each Group in Line: For each Word in Group: If word in senDict: senWord = (句中位置,情感傾向,情感強度) LastSenWordPosition = 0 ##上一個情感詞在句中的位置 for i in range(senWord[0],LastSenWordPosition,-1): if Group[i] in degreeDict: degreeWord = ( (句中位置,修飾強度) ) LastSenWordPosition = senWord[0] 經(jīng)過這樣的處理,文本被進一步轉(zhuǎn)換格式: “我今天很不高興。” ①經(jīng)過文本切割轉(zhuǎn)換 [(1,“我”,“r”),(2,“今天”,”t”),(3,“很”,”d”),(4,“不”,”d”),(5,“高興”,“a”)] ②情感定位 [(5,“Happy”,4),[(4,-1)],(3,1.25)] ##[情感詞,否定詞,程度副詞] 3、情感聚合 本文在前面說過,篇章級情感傾向通過聚合篇章中所有的句子的情感傾向來計算得出。句子級由句子中所含情感詞來計算。通過前兩步的操作,我們完成了句子意群的劃分,同時也提出了每個意群里的情感詞、否定詞和程度副詞。有了這些,下面我們先求出意群的情感值: 情感群—情感值 = 否定詞-1 * 程度詞權(quán)重 * 情感詞權(quán)重 我們在實際應(yīng)用中又發(fā)現(xiàn),當一個句子中同時出現(xiàn)否定詞和程度詞時,由于否定詞和程度詞相對位置的不同,會引起情感的不同,比如: “我很不高興”——分詞之后: 我 很 不 高興 “我不很高興”——分詞之后: 我 不 很 高興 可以看出,第一句話表達的是一種很強烈的負面情感,而第二句話則表達的是一種較弱的正面情感。因此,如果否定詞在程度詞之前,起到的是減弱的作用;如果否定詞在程度詞之后,則起到的是逆向情感的作用。所以我們對上述算法做了一下調(diào)整: W = 1 If 位置(否定詞)> 位置(程度詞): W = -1 意群情感值 = W * 程度詞權(quán)重 * 情感詞權(quán)重 If 位置(否定詞)< 位置(程度詞): W = 0.5 意群情感值 = W * 程度詞權(quán)重 * 情感詞權(quán)重 如果意群里出現(xiàn)多個否定詞,則處理辦法為: For n in notWord: W = -1 * W 句子是由意群組成,故句子的情感我們可以簡單記做: 句子情感值 = sum(意群情感值1,意群情感值2……) 段落是由不同的句子組成,但是考慮到段落的長短變化很大,故放棄用求和的方式來計算情感值,改為求平均值: 段落情感值 = average(句子1情感值,句子2情感值……) 文檔是由不同的段落組成,同理,不同文檔有不同的段落,故我們同樣求平均值: 文檔情感值 = average(段落1情感值,段落2情感值……) 以上是情感值的計算,至于情感傾向,首先可以通過情感值的符號來判斷情感傾向是正向還是負向,若情感傾向不止正、負、中立這三種情況,還有更細的劃分,則可以根據(jù)情感正負的情況,把對應(yīng)的情感傾向進行匯總來表述。 上述的做法是最簡單的做法,沒有考慮太多句子之間的差異以及不同段落對文檔的重要性。 本算法還有很多值得改進的地方,比如句子是由詞語根據(jù)一定的語言規(guī)則構(gòu)成的,應(yīng)該把句子中詞語的依存關(guān)系納入到句子情感的計算過程中去,可根據(jù)句子依存關(guān)系,從句子的根節(jié)點開始對每個詞進行情感傾向計算,根據(jù)句子依存關(guān)系求出句子的情感傾向和情感值。文檔的情感,也應(yīng)該根據(jù)句子的不同重要程度來計算,根據(jù)句子對文檔的重要程度賦予不同權(quán)重,調(diào)整其對文檔情感的貢獻程度。確定句子的重要程度,可以根據(jù)句子在文檔中的位置,根據(jù)句子中所含信息量的大小,句子中所含關(guān)鍵詞的多少等等。 筆者按照這個思路,用python寫了一百多行的代碼實現(xiàn)了上述的算法,測試了一番,效果還可以,但詞典的精度還需改進。 圖片鏈接
openbible.info使用Viralheat Sentiment Analysis API對圣經(jīng)所做的情感分析以及可視化。 參考文獻: 陳曉東. (2012). 基于情感詞典的中文微博情感傾向分析研究 (Master’s thesis, 華中科技大學(xué)). 王飛躍,李曉晨,毛文吉,王濤. (2013). 社會計算的基本方法與應(yīng)用 (pp. 36-49). 浙江大學(xué)出版社. rzcoding. Python 文本挖掘:使用情感詞典進行情感分析(算法及程序設(shè)計).http://rzcoding.blog.163.com/blog/static/2222810172013101844033170/ |
|