通常我有兴趣让流程更快地运行。
我正在使用R对大约8000个文档的德语语料库进行情感分析。我不是只计算正面和负面的单词,而是将-1和-1之间的值分配给大约3000个不同的术语。由于我没有使用词干功能,并且仍然想要获得所有变形的德语语法,我的单词列表会变得更长。
为了匹配我现在正在使用此代码:
score.sum <- rep(0, length(texts))
for (i in 1:length(texts)){
for (j in 1:length(sent.words)){
if(sent.words[j] %in% strsplit(texts[i], split=" ")[[1]] {
score.sum[i] <- score.sum[i] + sent.words_score[j]
}}}
作为一个小例子,可以使用:
texts <- c("I like ice cream. It is great","I hate flying because it makes me sick","If I get bored I do something fun")
sent.words <- c("like","great","hate","sick","bored","fun","joy")
sent.words_score <- c(0.3,0.7,-0.5,-0.4,-0.4,0.3,0.5)
也许计算花费的时间比你想要的还长。在我的8000文件的上下文中,我需要大约6个小时。那么你知道一种避免dubble if-loop并更快地计算的方法吗?
先谢谢了 Mairuu
答案 0 :(得分:2)
strplit
已向量化,因此您可以执行一次。
此处无需使用for
,请使用sapply
以避免初始化和副作用。
sapply(strsplit(texts, split=" "),
function(x)sum(sent.words_score[sent.words %in% x]))
答案 1 :(得分:0)
我正在用c ++编写情感分析器。我使用TRIES数据结构来存储所有单词。反应非常快。每个单词的成功是O(n),其中n是字符串的长度,而失败明显小于该字符串。只是要考虑提高性能。