2015-01-23 2 views
0

У меня есть уникальный набор слов в символьном векторе (который был «stemmed»), и я хочу знать, сколько из них появилось в строке.Подсчитайте количество слов в одном списке, которые появляются в строке

Вот что я до сих пор:

library(RTextTools) 

string <- "Players Information donation link controller support years fame glory addition champion Steer leader gang ghosts life Power Pellets tables gobble ghost" 
wordstofind <- c("player","fame","field","donat") 

# I created a stemmed list of the string 
string.stem <- colnames(create_matrix(string, stemWords = T, removeStopwords = F)) 

Я знаю, что следующий шаг, вероятно, включает в себя grepl("\\bword\\b,value") или некоторое использование регулярных выражений, но я не уверен, что самый быстрый вариант в данном случае.

Вот мои критерии:

  • Я должен сделать это много раз, так что время так быстро, как это возможно, вызывает беспокойство.
  • Он должен соответствовать всему слову («es» не должен соответствовать «тесту»).

Любой толчок в правильном направлении будет отличным.

ответ

2

Ну, я никогда не работаю с огромными наборами данных, поэтому время никогда не является сущностью, но с учетом данных, которые вы предоставили, это даст вам количество слов точно что-то в строке. Может быть хорошей отправной точкой.

sum(wordstofind %in% unlist(strsplit(string, " "))) 

> sum(wordstofind %in% unlist(strsplit(string, " "))) 
[1] 1 

Редактировать Использование стеблей, чтобы получить правильные 3 матча, благодаря @Anthony Биссел:

sum(wordstofind %in% unlist(string.stem)) 

> sum(wordstofind %in% unlist(string.stem)) 
[1] 3 
+1

Результат должен быть 3, так что это не работает, но может быть просто, что вы использовали 'string', а не vector. – Optimus

+0

Как вы получаете 3? В приведенном примере единственное точное и целочисленное совпадение - слава. –

+1

Извините, я не был ясен в объяснении, где я остановил строку для сравнения. 'sum (wordstofind% in% unlist (string.stem))' Это работает, и похоже, что ваше решение быстрее моего. См. Мой ответ ниже. – Optimus

0

Там, конечно, может быть быстрее вариант, но это работает:

length(wordstofind) - length(setdiff(wordstofind, string.stem)) # 3 

Но, похоже, ответ Эндрю Тейлора быстрее:

`microbenchmark(sum(wordstofind %in% unlist(string.stem)), length(wordstofind) - length(setdiff(wordstofind, string.stem))) 
Unit: microseconds 
                 expr min  lq  mean median  uq max neval 
        sum(wordstofind %in% unlist(string.stem)) 4.016 4.909 6.55562 5.355 5.801 37.485 100 
length(wordstofind) - length(setdiff(wordstofind, string.stem)) 16.511 16.958 21.85303 17.404 18.296 81.218 100` 
2

Посмотрите на stringr от Hadley Wickham. Вероятно, вы ищете функцию str_count.

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