Запись Karl Broman: https://kbroman.wordpress.com/2015/06/22/randomized-hobbit-2/ заставила меня играть с регулярным выражением и ngrams только для удовольствия. Я попытался использовать регулярное выражение для извлечения 2 грамм. Я знаю, что для этого есть синтаксические анализаторы, но я интересуюсь логикой регулярных выражений (т. Е. Это был вызов, который я не смог выполнить).r ngram extract с regex
Ниже приводится минимальный пример и желаемый результат. Проблема в моей попытке в 2 раза:
Графы (слова) съедаются и недоступны для следующего прохода. Как я могу сделать их доступными для второго прохода? (например, я хочу
like
быть доступны дляlike toast
после того, как уже было потреблено ранее вI like
)Я не мог сделать пространство между словами, не захвачена (обратите внимание на заднюю белое пространство в моем выходе, даже если я использовано
(?:\\s*)
). Как я могу не записывать конечные пробелы в n-м (в данном случае втором) слове? Я знаю, что это можно сделать просто с помощью:"(\\b[A-Za-z']+\\s)(\\b[A-Za-z']+)"
для 2-грамм, но я хочу расширить решение до n-граммов. PS Я знаю о\\w
, но я не рассматриваю символы подчеркивания и числа как части слова, но рассмотрим'
как часть слова.
MWE:
library(stringi)
x <- "I like toast and jam."
stringi::stri_extract_all_regex(
x,
pattern = "((\\b[A-Za-z']+\\b)(?:\\s*)){2}"
)
## [[1]]
## [1] "I like " "toast and "
Желаемая Выход:
## [[1]]
## [1] "I like" "like toast" "toast and" "and jam"
Возможно, лучший подход к проблеме № 2: '' (\\ b [A-Za-z '] + \\ s +) {1} (\\ b [A-Za-z'] +) " 'где вы расширяете регулярное выражение, отрегулировав значение 1 на' n-1' –