根据字典数据框替换语料库中的单词

时间:2013-12-14 05:28:38

标签: r nlp tm

我有兴趣根据由两列数据框组成的字典替换tm语料库对象中的所有单词,其中第一列是要匹配的单词,第二列是替换单词。

我坚持使用translate功能。我看到this answer但我无法将其转换为要传递给tm_map的函数。

请考虑以下MWE

library(tm)

docs <- c("first text", "second text")
corp <- Corpus(VectorSource(docs))

dictionary <- data.frame(word = c('first', 'second', 'text'),
                      translation = c('primo', 'secondo', 'testo'))

translate <- function(text, dictionary) {
  # Would like to replace each word of text with corresponding word in dictionary
}

corp_translated <- tm_map (corp, translate)

inspect(corp_translated)

# Expected result

# A corpus with 2 text documents
#
# The metadata consists of 2 tag-value pairs and a data frame
# Available tags are:
#   create_date creator 
# Available variables in the data frame are:
#   MetaID 

# [[1]]
# primo testo

# [[2]]
# secondo testo

2 个答案:

答案 0 :(得分:3)

我建议使用data.frame作为字典,因为R中的基本对象(矢量)默认是字典。

      dict  <- c('primo', 'secondo', 'testo')
names(dict) <- c('first', 'second', 'text')

然后到"tanslate" x,其中x可能是"second",您只需使用:

   dict[[x]]

你甚至不需要包装函数。


如果您想要向相反方向翻译,请使用

   name(dict)[names(dict) %in% x]

或者你可以翻阅字典

         dict.flip  <- names(dict)
   names(dict.flip) <- dict

答案 1 :(得分:3)

结合tm_map包的tm功能,您可以使用包stri_replace_all_fixed中的stringi。例如:

library(tm)
library(stringi)

docs <- c("first text", "second text")
corp <- Corpus(VectorSource(docs))

word <- c('first', 'second', 'text')
tran <- c('primo', 'secondo', 'testo')

corp <- tm_map(corp, function(x) stri_replace_all_fixed(x, word, tran, vectorize_all = FALSE))