首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有效地替换text2vec中的单词

有效地替换text2vec中的单词
EN

Stack Overflow用户
提问于 2017-01-11 09:33:00
回答 3查看 782关注 0票数 2

我有一个很大的文本体,我想用它们各自的同义词替换单词(例如,用同义词“car”替换所有出现的"car")。但我很难找到合适的(有效的)方法来做到这一点。

对于后面的分析,我使用text2vec库,并希望将该库也用于此任务(避免使用tm来减少依赖)。

一种(低效的)方式如下所示:

代码语言:javascript
复制
# 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"))
)

我的蛮力解决方案是拥有这样的东西,并使用一个循环来查找单词并替换它们。

代码语言:javascript
复制
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_transformertm::tm_map)来处理这个问题,但是我希望用更快的text2vec替换tm来减少项目的依赖性。

我想最好的解决方案是以某种方式使用text2vecitoken,但我不确定如何使用。有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-01-26 06:09:53

很晚了,但我还是想加2美分。我看到了两个解决方案

  1. 与您的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)
  2. 当然,此任务用于哈希表查找。据我所知,最快的实现是在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}}

我敢打赌,第二个解决方案会运行得更快,但需要制定一些基准。

票数 3
EN

Stack Overflow用户

发布于 2017-01-11 09:52:18

对于R基,这应该是可行的:

代码语言:javascript
复制
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)
票数 2
EN

Stack Overflow用户

发布于 2017-10-26 03:40:59

德米特里·塞利万诺夫()的解决方案的第一部分需要一点小小的改变。

代码语言:javascript
复制
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"  
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41587158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档