2013-12-13 4 views
2

Я новичок в R и нуждаюсь в предложениях. У меня есть dataframe с 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) 
+1

'merge'? Может быть, соединение с 'data.table', если слияние слишком медленное? – joran

+0

@joran не уверен, если я понимаю. Текст может содержать несколько слов, требующих замены. Вы предполагаете, что он будет работать быстрее, если оба файла данных будут объединены в один? – user3100939

+0

Я предлагаю левое соединение, за которым следует заполнение отсутствующих значений из исходного фрейма данных, как это можно сделать в SQL. Это выполняется с помощью 'merge' или также с помощью' data.table', но с другим синтаксисом. data.table может даже быть в состоянии сделать это один раз, используя скользящее соединение. – joran

ответ

1

здесь пример, чтобы показать @joran комментарий, используя data.table соединения слева. Это очень быстро (мгновенно здесь).

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 
+0

Текстовое поле будет содержать несколько слов (до 2000 символов). У меня возникают проблемы с пониманием того, как применять ваши предложения для этого случая. – user3100939

1

Я бы попробовал agrep. Я не уверен, насколько это хорошо.

Например.

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

Также проверьте pmatch и charmatch, хотя я чувствую, что они не будут столь полезными для вас.

+0

Спасибо, это полезные функции! Мне нужно немного подумать о том, как применять их в этом случае – user3100939

Смежные вопросы