搜索字符串的关键字

Keyword searching a character string

假设我有示例字符串

sample1 <- "i have a nasty cough today"
sample2 <- "do yall like nasty burgers" 

我想检查它是否有我正在寻找的名词和其他相关关键字。例如:

nouns <- c("i", "you", "we")
keywords <- c("cough", "tomorrow", "nasty")

该函数应该 return 函数 (sample1) 为 TRUE,函数 (sample2) 为 FALSE,因为 sample2 没有来自我指定向量的名词,即使它有关键字。

我熟悉 sjmisc 包中的 str_contains(),但不确定如何将其扩展到两个向量的组合。

您可以将 nounskeywords 组合成一个模式并检查它们是否都出现在字符串中。

nouns <- c("i", "you", "we")
keywords <- c("cough", "tomorrow", "nasty")

check_keyword <- function(x) {
grepl(paste0('\b', nouns, '\b', collapse = '|'), x) & 
  grepl(paste0('\b', keywords, '\b', collapse = '|'), x)
}

sample1 <- "i have a nasty cough today"
sample2 <- "do yall like nasty burgers" 

check_keyword(sample1)
#[1] TRUE
check_keyword(sample2)
#[1] FALSE

您可以将关键字和示例都放入 list 中。对于前者,我们同时应用了一个已经准备好所需模式的函数 mkPat

mkPat <- function(x) do.call(paste, c(list(paste0("\b", x, "\b")), collapse="|"))

kw <- lapply(list(nouns, keywords), mkPat)
smp <- list(sample1, sample2, sample3)

那么我们就可以很方便的使用sapply

sapply(kw, grepl, smp)
#       [,1]  [,2]
# [1,]  TRUE  TRUE
# [2,] FALSE  TRUE
# [3,] FALSE FALSE

并查看 rowSums(共 TRUE 个)等于 2 的位置。

rowSums(sapply(kw, grepl, smp)) == 2
# [1]  TRUE FALSE FALSE

数据:

sample1 <- "i have a nasty cough today"
sample2 <- "do yall like nasty burgers" 
sample3 <- "do yall like tasty burgers"