【发布时间】:2017-08-10 16:05:02
【问题描述】:
这可能是一个非常基本的问题,但老实说,我在这些类似问题上尝试了一些解决方案,但无法在我的数据上取得成功。可能是因为我的数据,或者我今天很辛苦,什么也想不通。 :(
我有一个句子向量
vec = c("having many items", "have an apple", "item")
另外,我有一个数据框来对数据进行词形还原
lem = data.frame(pattern = c("(items)|(item)", "(has)|(have)|(having)|(had)"), replacement = c("item", "have"))
lem$pattern = as.character(lem$pattern)
lem$replacement = as.character(lem$replacement)
我想遍历lem数据框中的每一行,形成一个替换命令。
选项 1:
library(stringr) #this is said to be quicker than gsub and my data has 3 mil sentences
vec <- sapply(lem, function(x) str_replace_all(vec, pattern=x$pattern, replacement = x$replacement))
Error in x$pattern : $ operator is invalid for atomic vectors
选项 2:
library(doPar)
vec <- foreach(i = 1:nrow(lem)) %dopar% {
str_replace_all(vec, pattern = lem[i, "pattern"], replacement = lem[i, "replacement"])
}
选项 2 返回 2 个向量的列表:第一个是我想要的,第二个是原始的,我不知道为什么。另外,我在我的机器上进行了测试,doPar(虽然使用并行编程)不如sapply 快。
由于我的数据很大(300 万句),有人可以推荐一种有效的方法来对文本数据进行词形还原吗?
【问题讨论】:
-
如果您遍历
lem并将vec中的每个元素替换为lem$pattern中的每个元素,那么您最终会得到与lem中的行一样多的结果,每个一个对应一个替换,这是您在 Option2 中观察到的。 -
明白!我能做些什么来避免这种情况?
-
我不熟悉
doPar,但你可以简单地重写你的vec,如:for(i in 1:nrow(lem)){vec = str_replace_all(vec,lem$pattern[i],lem$replacement[i])} -
我不能使用顺序循环,Lamia。我的数据太大了。
标签: r nlp sapply parallel.foreach lemmatization