在字符串中搜索发生的关键字和标记关键字列表

时间:2017-01-03 13:45:30

标签: r grep string-matching

我有一套陈述

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,或者是否有任何软件包可以挖掘文本并从预定列表中返回关键字?

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用stringi包,

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

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

答案 1 :(得分: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的每一行拆分为&#34; &#34;然后使用%in%检查哪些字词和paste全部

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