2017-01-03 4 views
2

У меня есть набор инструкцийПоиск в строке из списка ключевых слов и тегов ключевых слов, которые происходят

statement <- as.matrix(c("the cat sat on the mat", 
          "the dog ran up the hill", 
          "the dog ran up the hill to the mat")) 

и список ключевых слов

keywords <- as.matrix(c("cat", "mat", "dog", "hill"))

Я хочу искать внутри заявления из моего списка ключевых слов и теги, которые имеют ключевые слова, т.е. имеют результат

statement        keywords 
the cat sat on the mat    cat, mat 
the dog ran up the hill    dog, hill 
the dog ran up the hill to the mat dog, hill, mat 

Я думаю, один способ, которым я могу это сделать, это использовать Grep таким образом, как

statement[grep("cat", statement$V1, ignore.case = TRUE), "keywords"] <- "cat" 
statement[grep("mat", statement$V1, ignore.case = TRUE), "keywords"] <- "mat" 

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

Как бы вы предложили об этом? Есть ли способ использования grep или есть ли какие-либо пакеты, которые могут обрабатывать текст и возвращать ключевые слова из предопределенного списка?

Спасибо!

+0

Нужно ли им быть объектами матрицы? Или достаточно векторов? – Benjamin

+0

@benjamin векторов было бы достаточно в этом случае –

+0

@ DarshanBaral спасибо! Это действительно полезно –

ответ

0
keywords <- c("cat", "mat", "dog", "hill") 
m = sapply(keywords, grepl, statement) 
     cat mat dog hill 
[1,] TRUE TRUE FALSE FALSE 
[2,] FALSE FALSE TRUE TRUE 
[3,] FALSE TRUE TRUE TRUE 

apply(m,1, function(y) paste0(colnames(m)[y], collapse=",")) 
[1] "cat,mat"  "dog,hill"  "mat,dog,hill" 

или в одной строке: разбить каждую строку statement на «», а затем проверить с помощью %in%, какие слова присутствовали и paste их все

apply(statement, 1, function(i) paste0(x[x %in% unlist(strsplit(i, " "))], collapse=",")) 
[1] "cat,mat"  "dog,hill"  "mat,dog,hill" 
+0

зайдите на этот http://stackoverflow.com/help/someone-answers и примите его как точный ответ, который вам понравился –

1

Вы можете использовать stringi пакет,

library(stringi) 
sapply(stri_extract_all_regex(statement[,1], 
         paste(keywords[,1], collapse = '|')), toString) 

#[1] "cat, mat"  "dog, hill"  "dog, hill, mat"