2014-10-12 90 views
1

我想在單詞列表與其他列表匹配時加上一個權重,但我不明白該怎麼做。 下面是一個例子:字匹配計算

require("stringr") 

sample = c("You're awesome and I love you", 
"I hate and hate and hate. So angry. Die!") 
word.neg = c("hate","angry.") 
word.neg.coef =c(-20,-4) 


word.list = str_split(sample, '\\s+') 

sapply(word.list,function(x) match(x,word.neg)) 



test <- lapply(word.list, function(x) sum(!is.na(match(x,neg.words)))) 
test2 <-unlist(test) 

data.frame(sample,test2) 

正如你所看到的比賽返回字的位置後,我做的真正的總和。

但我想要做的就是施加一個重量,這意味着每次看到討厭它應用-20和每次看到生氣。它適用-4 所以在最後我想是這樣的

data.frame(sample,score=c(0,-24)) 

換句話說什麼是查找文字列表的句子和應用係數的最佳途徑。 我的其他問題,也知道有一些不得不的話,而不是位置:

sapply(word.list,function(x) match(x,word.neg)) 

[[2]] [1] NA恨NA恨NA NA NA生氣。 NA

取而代之的是:

[[2]] 
[1] NA 1 NA 1 NA NA NA 2 NA 

謝謝

回答

2
sapply(word.list,function(x) word.neg[match(x,word.neg)]) 
#[[1]] 
#[1] NA NA NA NA NA NA 

#[[2]] 
#[1] NA  "hate" NA  "hate" NA  NA  NA  "angry." 
#[9] NA  

sapply(word.list,function(x) (as.numeric((word.neg.coef[match(x,word.neg)])))) 
#[[1]] 
#[1] NA NA NA NA NA NA 

#[[2]] 
#[1] NA -20 NA -20 NA NA NA -4 NA 

sapply(word.list,function(x) sum(word.neg.coef[match(x,word.neg)], na.rm = T)) 
#[1] 0 -44 
+1

我喜歡您建立解決方案的方式。 – user3969377 2014-10-12 15:17:06

+1

感謝它的完美 – bimetcarentre 2014-10-12 15:20:54

1

這是不太答案,但也許是更想要事半功倍的。 qdap包提供了polarity功能來進行情感分析。您還可以通過sentiment_frame提供帶有重量的自定義字典:

library(qdap) 
polarity(sample, id(sample)) 

## sample total.sentences total.words ave.polarity sd.polarity stan.mean.polarity 
## 1  1    1   6  0.816   NA     NA 
## 2  2    1   9  -1.667   NA     NA 
+0

謝謝泰勒我會看看你的包裹。事實上,我想知道如何一步一步來更好地理解R操作。但是,當我正在學習情感分析時,知道可以用更少的努力就能做到的軟件包總是很好的:) – bimetcarentre 2014-10-14 21:06:50

+0

@bimetcarentre是的,這絕對重要。根據對準確性的要求,功能語言學的理念和算法的效率,您可能會得出不同的算法。 – 2014-10-15 01:03:47