Ваш dplyr
код фильтра выглядит нормально, так что вот только бит регулярного выражения:
dictionary <- data.frame(word=c("Congress","Capitol"), stringsAsFactors = FALSE)
pattern_after <- paste0("\\b(", paste0(dictionary$word, collapse="|"), ")\\W+(?:\\w+\\W+){0,5}?(Republican(s)*|Democrat(s)*)")
pattern_before <- paste0("\\b(Republican(s)*|Democrat(s)*)\\W+(?:\\w+\\W+){0,5}?", paste0(dictionary$word, collapse="|"), collapse="|")
pattern <- paste0(c(pattern_after, pattern_before), collapse="|")
pattern
#> [1] "\\b(Congress|Capitol)\\W+(?:\\w+\\W+){0,5}?(Republican(s)*|Democrat(s)*)|\\b(Republican(s)*|Democrat(s)*)\\W+(?:\\w+\\W+){0,5}?Congress|Capitol"
grepl(pattern, "Republicans in congress today voted on a bill", perl = TRUE, ignore.case = TRUE)
#> [1] TRUE
grepl(pattern, "Democrats today passed a bill to allocate funds for Congress", perl = TRUE, ignore.case = TRUE)
#> [1] FALSE
grepl(pattern, "A Democrat in Congress", perl = TRUE, ignore.case = TRUE)
#> [1] TRUE
Создано в 2019-10-01 пакетом Представить (v0.3.0)
Чтобы разобраться в этом, регулярное выражение для поиска двух слов, разделенных от 0 до 5 других слов в R
, равно
"\\bword1\\W+(?:\\w+\\W+){0,5}word2"
\\b
- это граница слова, означающая пробел, пунктуацию или конец строки. \\W+
- это один или несколько несловесных символов (т. Е. Границы слова или что-то еще) \\w+
означает слово один или несколько символов, то есть последовательность букв или цифр (?:\\w+\\W+)
- это группа, состоящая из символов слова, за которыми следуют не слова (т. Е. Слова с пробелами) {0,5}
указывает, что группа соответствует от 0 до 5 раз
Вам необходимо установить perl = TRUE
, чтобы это работало. "Republican(s)*"
означает, что «республиканец» либо следует за «с», либо нет. Два отдельных шаблона должны убедиться, что он работает независимо от того, упоминается ли слово или республиканец / демократ первым.