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