如何解决关键字搜索字符串
假设我有样本字符串
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(),但不确定如何将其扩展到两个向量的组合。
解决方法
您可以将 nouns
和 keywords
组合成一个模式,并检查它们是否都出现在字符串中。
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
并查看 rowSums
(TRUE
的)等于 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"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。