您可能希望采用自然语言处理 (NLP) 方法,而不是基于正则表达式的方法。有很多框架可以做到这一点。一个很简单的方法是tidytext。下面是一个关于如何抓取围绕关键字的一堆单词的示例。
你可能想玩弄这个来得到你想要的。听起来你想从中得到几样东西,所以我只选择了一个。
library(tidytext)
library(dplyr)
library(tibble)
df <- tibble(Sentence = c("The yellow lab dog is so cute.",
"The fluffy black cat purrs loudly."))
keywords <- tibble(word = c("dog", "cat"), keyword = TRUE)
df %>%
rowid_to_column() %>%
unnest_tokens("trigram", Sentence, token = "ngrams", n = 3, n_min = 2) %>%
unnest_tokens("word", trigram, drop = FALSE) %>%
left_join(keywords, by = "word") %>%
filter(keyword)
# A tibble: 10 x 4
rowid trigram word keyword
<int> <chr> <chr> <lgl>
1 1 yellow lab dog dog TRUE
2 1 lab dog dog TRUE
3 1 lab dog is dog TRUE
4 1 dog is dog TRUE
5 1 dog is so dog TRUE
6 2 fluffy black cat cat TRUE
7 2 black cat cat TRUE
8 2 black cat purrs cat TRUE
9 2 cat purrs cat TRUE
10 2 cat purrs loudly cat TRUE
如何在此基础上进行构建的示例如下所示。在这里,您可以跟踪从 n-gram 中找到每个单词的句子和位置。因此,您可以过滤关键字是第一个 word_pos 或其他的位置。
df %>%
rowid_to_column("sentence_id") %>%
unnest_tokens("trigram", Sentence, token = "ngrams", n = 3, n_min = 3) %>%
rowid_to_column("trigram_id") %>%
unnest_tokens("word", trigram, drop = FALSE) %>%
group_by(trigram_id) %>%
mutate(word_pos = row_number()) %>%
left_join(keywords, by = "word") %>%
relocate(sentence_id, trigram_id, word_pos, trigram, word) %>%
filter(keyword, word_pos == 1)
# A tibble: 2 x 6
# Groups: trigram_id [2]
sentence_id trigram_id word_pos trigram word keyword
<int> <int> <int> <chr> <chr> <lgl>
1 1 4 1 dog is so dog TRUE
2 2 9 1 cat purrs loudly cat TRUE