关键字搜索字符串

问题描述

假设我有样本字符串

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

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

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

函数应该对 function(sample1) 返回 TRUE,对 function(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,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

并查看 rowSumsTRUE 的)等于 2 的位置。

rowSums(sapply(kw,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"