根据字典替换文本中的字符串

时间:2013-12-13 22:02:37

标签: r performance merge dataframe

我是R的新手,需要建议。 我有一个包含1个文本字段的数据框。我需要修复该文本字段中拼写错误的单词。为了解决这个问题,我有第二个文件(字典),包含2列 - 拼写错误的单词和正确的单词来替换它们。

你会怎么推荐呢?我写了一个简单的“for循环”,但性能是一个问题。 该文件有~120K行,字典有~5k行,程序已经运行了几个小时。文本最多可包含2000个字符。

以下是代码:

output<-source_file$MEMO_MANUAL_TXT
for (i in 1:nrow(fix_file))  {           #dictionary file
target<-paste0(" ", fix_file$change_to_target[i], " ")
replace<-paste0(" ", fix_file$target[i], " ")
output<-gsub(target, replace, output, fixed = TRUE)

2 个答案:

答案 0 :(得分:1)

这是一个示例,使用data.table左连接显示@joran注释。它非常快(在这里瞬间)。

library(data.table)

n1 <- 120e3
n2 <- 1e3
set.seed(1)
## create vocab
tt <- outer(letters,letters,paste0)
vocab <- as.vector(outer(tt,tt,paste0))
## create the dictionary 
dict <- data.table(miss=sample(vocab,n2,rep=F),
                   good=sample(letters,n2,rep=T),key='miss')
## the text table
orig <- data.table(miss=sample(vocab,n1,rep=TRUE),key='miss')
orig[dict]

orig[dict]
      miss good
   1: aakq    v
   2: adac    t
   3: adxj    r
   4: aeye    t
   5: afji    g
  ---          
1027: zvia    d
1028: zygp    p
1029: zyjm    x
1030: zzak    t
1031: zzvs    q

答案 1 :(得分:1)

我会尝试agrep。我不确定它的扩展程度如何。

EG。

> agrep("laysy", c("1 lazy", "1", "1 LAZY"), max = 2, value = TRUE)
[1] "1 lazy"

同时查看pmatchcharmatch,但我觉得它们对您没用。