2017-01-03 2 views
2

J'ai un ensemble de déclarationsRechercher dans une chaîne à partir d'une liste de mots clés et mots-clés tag qui se produisent

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")) 

et une liste de mots-clés

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

Je veux effectuer une recherche dans la déclarations de ma liste de mots-clés et tag ce que les mots-clés se produisent à savoir avoir le résultat

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 

Je pense d'une façon que je peux le faire est d'utiliser grep d'une manière comme

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

... et ainsi de suite, mais d'une part, qui ne me donne pas tag pour tous les mots-clés qui se produisent. Deuxièmement, si j'essaie de trouver un moyen de le faire quand j'ai une grande liste de 1000 mots-clés et 500 déclarations, il sera juste difficile à manier.

Comment pourriez-vous suggérer une à ce sujet? Existe-t-il un moyen d'utiliser grep ou existe-t-il des paquets qui peuvent extraire du texte et renvoyer des mots-clés à partir d'une liste prédéterminée?

Merci!

+0

Est-il nécessaire que ceux-ci soient des objets matriciels? Ou les vecteurs seraient-ils suffisants? – Benjamin

+0

vecteurs @benjamin serait suffisant dans ce cas –

+0

@DarshanBaral merci! Ceci est vraiment utile –

Répondre

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" 

ou en une seule ligne: diviser chaque rangée de statement par « » puis vérifier en utilisant %in% mots qui étaient présents et paste tous

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

visitez ce http://stackoverflow.com/help/someone-answers et en accepter un comme la réponse précise que vous avez aimé –

1

Vous pouvez utiliser package stringi,

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

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