使用 sapply/lapply 或 foreach 访问数据属性 R

Use sapply/lapply or foreach to access data attributes R

这可能是一个非常基本的问题,但老实说,我针对这些类似问题尝试了一些解决方案,但无法在我的数据上取得成功。这可能是因为我的数据,或者我今天过得很辛苦,什么也想不通。 :(

我有一个句子向量

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 returns 2个向量的列表:第一个是我想要的,第二个是原来的,我不知道为什么。另外,我在我的机器上测试过,doPar(尽管使用并行编程)不如 sapply 快。

由于我的数据很大(300万句),有人可以推荐一种有效的方法来对文本数据进行词形还原吗?

您可以使用 stringi 库中的 stri_replace_all_regex,它将按顺序执行您的替换:

library(stringi)
stri_replace_all_regex(vec,lem$pattern,lem$replacement,vectorize_all=F)
[1] "have many item" "have an apple"  "item"

另一种选择是从您的模式和替换向量而不是数据框创建命名向量,然后直接使用 str_replace_all,如下所示:

library(stringr)

vec <- c("having many items", "has an apple", "items")

lem <- c("item", "have")
names(lem) <- c("(items)|(item)", "(has)|(have)|(having)|(had)")

str_replace_all(vec, lem)

## "have many item" "have an apple"  "item"