如何在单词向量中搜索包含两个特定字母的单词
How to search a vector of words for words containing two specific letters
所以我有一个包含 5 个字母的单词的向量,我希望能够创建一个函数来提取包含模式中所有字母的单词。
例如,如果我的向量是(“aback”、“abase”、“abate”、“agate”、“allay”)并且我正在寻找同时包含“a”和“b”的词,我希望函数为 return(“aback”、“abase”、“abate”)。我不在乎这些字母在单词中的什么位置或出现了多少次,只在乎单词中包含它们。
我试图通过创建一个旨在将 grepl 与 & 组合的函数来做到这一点。但这里的问题是 grepl 函数不接受向量作为模式。我的计划是让这个函数实现grepl("a", word_vec) & grepl("b", word_vec)。我还需要它具有可扩展性,例如,如果我想搜索包含“a”和“b”和“c”的所有单词。
grepl_cat <- function(str, words_vec) {
pat <- str_split(str, "")
first_let = TRUE
for (i in 1:length(pat)) {
if (first_let){
result <- sapply(pat[i], grepl, x = word_vec)
first_let <- FALSE
}
print(pat[i])
result <- result & sapply(pat[i], grepl, x = word_vec)
}
return(result)
}
word_vec[grepl_cat("abc", word_vec)]
我上面写的函数肯定没有按预期执行。
我想知道是否有更简单的方法可以使用正则表达式模式执行此操作,或者是否有一种方法可以将 str 中的每个字母作为非向量输入到 grepl 函数中。
基于 R 的可能解决方案:
s <- c("aback", "abase", "abate", "agate", "allay")
subset(s, grepl("(a)(b)", s))
#> [1] "aback" "abase" "abate"
另一种可能的解决方案,基于tidyverse
:
library(tidyverse)
s <- c("aback", "abase", "abate", "agate", "allay")
s %>%
data.frame(s = .) %>%
filter(str_detect(s, "(a)(b)")) %>%
pull(s)
#> [1] "aback" "abase" "abate"
对于 a,b and c
正则表达式解决方案将是:
^.*a.*b.*c.*$
您可以根据需要添加更多字母
替代正则表达式方法:
^(?=.*a)(?=.*b)(?=.*c).*$
所以我有一个包含 5 个字母的单词的向量,我希望能够创建一个函数来提取包含模式中所有字母的单词。
例如,如果我的向量是(“aback”、“abase”、“abate”、“agate”、“allay”)并且我正在寻找同时包含“a”和“b”的词,我希望函数为 return(“aback”、“abase”、“abate”)。我不在乎这些字母在单词中的什么位置或出现了多少次,只在乎单词中包含它们。
我试图通过创建一个旨在将 grepl 与 & 组合的函数来做到这一点。但这里的问题是 grepl 函数不接受向量作为模式。我的计划是让这个函数实现grepl("a", word_vec) & grepl("b", word_vec)。我还需要它具有可扩展性,例如,如果我想搜索包含“a”和“b”和“c”的所有单词。
grepl_cat <- function(str, words_vec) {
pat <- str_split(str, "")
first_let = TRUE
for (i in 1:length(pat)) {
if (first_let){
result <- sapply(pat[i], grepl, x = word_vec)
first_let <- FALSE
}
print(pat[i])
result <- result & sapply(pat[i], grepl, x = word_vec)
}
return(result)
}
word_vec[grepl_cat("abc", word_vec)]
我上面写的函数肯定没有按预期执行。
我想知道是否有更简单的方法可以使用正则表达式模式执行此操作,或者是否有一种方法可以将 str 中的每个字母作为非向量输入到 grepl 函数中。
基于 R 的可能解决方案:
s <- c("aback", "abase", "abate", "agate", "allay")
subset(s, grepl("(a)(b)", s))
#> [1] "aback" "abase" "abate"
另一种可能的解决方案,基于tidyverse
:
library(tidyverse)
s <- c("aback", "abase", "abate", "agate", "allay")
s %>%
data.frame(s = .) %>%
filter(str_detect(s, "(a)(b)")) %>%
pull(s)
#> [1] "aback" "abase" "abate"
对于 a,b and c
正则表达式解决方案将是:
^.*a.*b.*c.*$
您可以根据需要添加更多字母
替代正则表达式方法:
^(?=.*a)(?=.*b)(?=.*c).*$