R文本挖掘之五情感分析

本文是轉載!原文地址:CSDN-R語言做文本挖掘 Part5情感分析


Part5情感分析

這是這個系列裏面最後一篇文章了,其實這裏文本挖掘每一個部分單拎出來都是值得深究和仔細研究的,我還處於初級研究階段,用R裏面現成的算法,來實現自己的需求,當然還參考了衆多網友的智慧結晶,所以也想把我的收穫總結出來分享給大家,希望也能像我一樣在看大家的分享時得到自己的啓發。

網上翻了下中文文本情感分析的一些文章,再回想了一下我自己做情感分析的方法,覺得我的想法真的是簡單粗暴直接。這是一篇介紹中文文本情感分析傾向的論文。http://wenku.baidu.com/link?url=TVf5LgNS6esnunpgubvM14z24m0f4lTyD483gw_hEnp2RyeL6XzanSlz8oCcZCFlwKLqD0PdBhVUcV4-0loTdGp3hL-kqeTTwJ3l91HfTa3,中間講到做情感分析目前主要有三種方法。第一種由已有的電子詞典或詞語知識庫擴展生成情感傾向詞典;第二種,無監督機器學習的方法。第三種基於人工標註語料庫的學習方法。

上面三種方法不仔細一一說明了,它們都有一個共同的特點,需要一個情感傾向的語料庫。我在R中的實現方案與第一種方法類似,整理一個褒義詞詞庫一個貶義詞詞庫(這個萬能的互聯網上有自己稍加整理就OK)。給文本做分詞,並提取出中間的情感詞。給每條文本定情感傾向評分初始值爲1,跟褒義貶義詞詞庫做匹配,褒義詞+1,貶義詞-1,計算出每條文本的最終情感傾向評分,爲正值則是正面評價,爲負值則是負面評價。方法可以基本實現情感傾向判斷,但還可以改進。像前面參考論文中講到的,還可以根據詞語的詞性強弱來評定感情的強,不只是+1和-1之分;還有考慮一些詞語在不同語境下情感傾向可能會不同,比如論文中講到的“驕傲”,這個我在想可能需要整理出有這樣特殊情況的詞語;還有負負得正的情況,比如“不喜歡是不可能的事情!”,照我的評分標準它的結果就是負面評價了;反問的情況,“哪裏便宜了?”,評出來結果變成了正。“便宜”這個詞我把它放在褒義詞表下,其實仔細考慮如果是說“便宜實惠”肯定是褒義,如果說“便宜沒好貨”,也會是褒義,這就不對了,還是第二個問題不同語境下情感傾向會不同。

R中的實現過程:

1.      數據輸入處理

數據還是某品牌官微,取它微博中的1376條評論,情感褒義詞庫和貶義詞庫,將數據讀入到R中。附詞庫下載地址:http://www.datatang.com/data/44317/,可能不是很全,需要自己整理豐富,我在看服裝相關的文本時,發現有些詞像“褪色”,“開線”,“顯瘦”,“顯胖”都沒有在裏面,這些就需要自己另外加進去。

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. hlzj.comment <- readLines("hlzj_commentTest.txt")  
  2. negative <-readLines("D:\\R\\RWorkspace\\hlzjWorkfiles\\negative.txt")  
  3. positive <-readLines("D:\\R\\RWorkspace\\hlzjWorkfiles\\positive.txt")  
  4. length(hlzj.comment)  
[1] 1376

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. length(negative)  
[1] 4477

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. length(positive)  
[1] 5588

 

2.      對評論做分詞處理並評級

過程類似Part2中講到的分詞處理。然後我自己寫了個方法getEmotionalType(),將分詞結果與negative表和positive表作對照計算得分。

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. commentTemp <- gsub("[0-90123456789 < > ~]","",hlzj.comment)  
  2. commentTemp <-segmentCN(commentTemp)  
  3. commentTemp[1:2]  
[[1]]

[1] "恭喜""大家"""   "沒有" "找到" "

[[2]]

 [1] "沒有" "私信" ""   ""   "小編" ""   ""   ""   ""   "

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. EmotionRank <-getEmotionalType(commentTemp,positive,negative)  
[1] 0.073

[1] 0.145

[1] 0.218

[1] 0.291

[1] 0.363

[1] 0.436

[1] 0.509

[1] 0.581

[1] 0.654

[1] 0.727

[1] 0.799

[1] 0.872

[1] 0.945

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. EmotionRank[1:10]  
 [1] 1 0 2 1 1 2 3 1 0 0

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. commentEmotionalRank <-list(rank=EmotionRank,comment=hlzj.comment)  
  2. commentEmotionalRank <-as.data.frame(commentEmotionalRank)  
  3. fix(commentEmotionalRank)  

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. getEmotionalType <- function(x,pwords,nwords){  
  2.     emotionType <-numeric(0)  
  3.     xLen <-length(x)  
  4.     emotionType[1:xLen]<- 0  
  5.     index <- 1  
  6.     while(index <=xLen){  
  7.         yLen <-length(x[[index]])  
  8.         index2 <- 1  
  9.         while(index2<= yLen){  
  10.            if(length(pwords[pwords==x[[index]][index2]]) >= 1){  
  11.                emotionType[index] <- emotionType[index] + 1  
  12.             }else if(length(nwords[nwords==x[[index]][index2]]) >= 1){  
  13.                emotionType[index] <- emotionType[index] - 1  
  14.             }  
  15.             index2<- index2 + 1  
  16.         }  
  17.         #獲取進度  
  18.        if(index%%100==0){  
  19.         print(round(index/xLen,3))  
  20.         }        
  21.         index <-index +1  
  22.     }  
  23.     emotionType  
  24. }  

查看到結果如下,第一個圖裏看着還挺正常的,第二個圖好像是hlzj贊助的RM裏出現了衣服被撕壞的時候的評論。沒有黑他們家的意思,只是想找個例子來說明下差評的效果,好像不是很理想。那些反問的話無法識別判斷,還有一些比較口語化的“醉了”,“太次”這樣的詞沒有放到情感詞庫裏,對這些評論的情感傾向識別效果不是很好。


像前面說的,方法有待改進,我的方法只是一個最基礎的情感分析的實現方式,有任何問題歡迎指正。

轉載請註明來源,謝謝!


發佈了17 篇原創文章 · 獲贊 14 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章