我有一个很大的文本体,我想用它们各自的同义词替换单词(例如,用同义词“car”替换所有出现的"car")。但我很难找到合适的(有效的)方法来做到这一点。
对于后面的分析,我使用text2vec库,并希望将该库也用于此任务(避免使用tm来减少依赖)。
一种(低效的)方式如下所示:
# setup data
text <- c("my automobile is quite nice", "I like my car")
syns <- list(
list(term = "happy_emotion", syns = c("nice", "like")),
list(term = "car", syns = c("automobile"))
)我的蛮力解决方案是拥有这样的东西,并使用一个循环来查找单词并替换它们。
library(stringr)
# works but is probably not the best...
text_res <- text
for (syn in syns) {
regex <- paste(syn$syns, collapse = "|")
text_res <- str_replace_all(text_res, pattern = regex, replacement = syn$term)
}
# which gives me what I want
text_res
# [1] "my car is quite happy_emotion" "I happy_emotion my car" 我以前使用tm (使用tm::content_transformer和tm::tm_map)来处理这个问题,但是我希望用更快的text2vec替换tm来减少项目的依赖性。
我想最好的解决方案是以某种方式使用text2vec的itoken,但我不确定如何使用。有什么想法吗?
发布于 2017-01-26 06:09:53
很晚了,但我还是想加2美分。我看到了两个解决方案
str_replace_all相比略有改进。由于它在内部是矢量化的,所以您可以在没有循环的情况下进行所有替换。我认为它会更快,但我没有制定任何基准。
regex_batch = sapply(syns,function(syn)粘贴(syn$syns,倒转=“颇具”)名称( regex_batch) = sapply(syns,function(x) x$term) str_replace_all(text,regex_batch)fastmatch包中。因此,您可以编写自定义令牌程序,如下所示:
库(快速匹配) syn_1 =c(“不错”,“喜欢”)名称(Syn_1)=rep(‘愉快的情感’,长度(Syn_1)) syn_2 =c(“汽车”)名称( syn_2) = rep('car',length(syn_2)) syn_replace_table = c(syn_1,syn_2) custom_tokenizer =函数(Text){ word_tokenizer(text) %>% lapply(函数(X){i= fmatch(x ),( syn_replace_table) ind = !is.na(i) i= na.omit(i) xind =name(Syn_replace_table)i}}我敢打赌,第二个解决方案会运行得更快,但需要制定一些基准。
发布于 2017-01-11 09:52:18
对于R基,这应该是可行的:
mgsub <- function(pattern,replacement,x) {
if (length(pattern) != length(replacement)){
stop("Pattern not equal to Replacment")
}
for (v in 1:length(pattern)) {
x <- gsub(pattern[v],replacement[v],x)
}
return(x )
}
mgsub(c("nice","like","automobile"),c(rep("happy_emotion",2),"car"),text)发布于 2017-10-26 03:40:59
德米特里·塞利万诺夫()的解决方案的第一部分需要一点小小的改变。
library(stringr)
text <- c("my automobile is quite nice", "I like my car")
syns <- list(
list(term = "happy_emotion", syns = c("nice", "like")),
list(term = "car", syns = c("automobile"))
)
regex_batch <- sapply(syns, function(syn) syn$term)
names(regex_batch) <- sapply(syns, function(x) paste(x$syns, collapse = "|"))
text_res <- str_replace_all(text, regex_batch)
text_res
[1] "my car is quite happy_emotion" "I happy_emotion my car" https://stackoverflow.com/questions/41587158
复制相似问题