2016-06-30 66 views
1

在文本挖掘练习中,考虑使用R {tm}来考虑以下MWE: 丰田在美国有几款SUV车型。 models<-c("highlander","land cruiser","rav4","sequoia","4runner")。一般媒体称这些不是“丰田rav4”(语料库已经转变为小写),而是“rav4”。为了在DocumentTermMatrix中获得一列丰田suvs,我需要将所有这些品牌转换为一个通用的“toyota_suv”。我现在正在做的是重复mycorpus<-tm_map(mycorpus, gsub, pattern="rav4", replacement="toyota_suv")的长度(模型)。黑客将设置model_names<-rep("toyota_suv",length(models))并继续生活。如何创建一个包含多对一映射的字典,以便在一个表达式中将所有models替换为'toyota_suv'?非常感谢。R词典:创建多对一映射

回答

4

您可以使用矢量化替代函数。 stringi包与stri_replace_all功能家族提供了这样的功能。在这里,我使用stri_replace_all_fixed,但需要时调整大小写和其他选项。

library(tm) 
library(stringi) 

toyota_suvs <- c("highlander","land cruiser","rav4","sequoia","4runner") 

tm_map(toyCorp, stri_replace_all_fixed, 
    pattern = toyota_suvs, replacement = "toyota_suv", 
    vectorize_all = FALSE) 

数据:

toyExample <- c("you don't know about the rav4, John Snow", 
    "the highlander is a great car", 
    "I want a land cruiser") 

toyCorp <- Corpus(VectorSource(toyExample)) 
+0

感谢。没有打开另一个问题,这与字典映射在时间上的比较如何? – Pradeep

+0

@Pradeep我不知道。我认为你需要做更多的工作来提供一套示例文档,以及你想要获得什么类型的输出。如果你想自己改变输入文档(在语料库创建之前),直接使用'stringi'将很难被击败:'stri_replace_all_fixed(toyExample,pattern = toyota_suvs,replacement =“toyota_suv”,vectorize_all = FALSE)'。将其馈送到'tm_map'会显着减慢速度。 – Jota

+0

如果时间是一个重要的考虑因素,我会放弃'tm'包。你也许可以尝试'quanteda',它有一个字典方法,但是,我还没有能够直接使用像“陆地巡洋舰”这样的多词。所以,需要一些额外的处理。 – Jota