Karl Broman's post: https://kbroman.wordpress.com/2015/06/22/randomized-hobbit-2/ habe mich mit regex und ngrams nur zum Spaß spielen. Ich habe versucht, Regex zu verwenden, um 2 Gramm zu extrahieren. Ich weiß, dass es Parser gibt, um das zu tun, aber ich interessiere mich für die Regex-Logik (d. H. Es war eine Selbst-Herausforderung, die ich nicht erfüllen konnte).r ngram extraktion mit regex
Im Folgenden gebe ich ein minimales Beispiel und die gewünschte Ausgabe. Das Problem in meinem Versuch ist 2-fach:
Die Gramm (Worte) gefressen und ist für den nächsten Durchgang nicht zur Verfügung. Wie kann ich sie für den zweiten Durchgang zur Verfügung stellen? (zB mag ich
like
fürlike toast
verfügbar sein, nachdem es bereits zuvor inI like
verbraucht worden ist)Ich konnte nicht den Raum zwischen den Worten nicht gefangen machen (dem Leerraum in meiner Ausgabe feststellen, obwohl ich verwendet
(?:\\s*)
). Wie kann ich nachfolgende Leerzeichen am n-ten (in diesem Fall zweiten) Wort nicht erfassen? Ich weiß, dass dies einfach gemacht werden könnte mit:"(\\b[A-Za-z']+\\s)(\\b[A-Za-z']+)"
für ein 2-Gramm, aber ich möchte die Lösung auf N-Gramm erweitern. PS Ich weiß über\\w
, aber ich halte Unterstriche und Zahlen nicht als Wortteile, sondern betrachten'
als Wortteil.
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 "
gewünschte Ausgabe:
## [[1]]
## [1] "I like" "like toast" "toast and" "and jam"
Vielleicht ist der beste Ansatz zu Problem # 2: '" (\\ b [A-Za-z '] + \\ s +) {1} (\\ b [A-Za-z'] +) " 'wo Sie die Regex durch die Anpassung der 1 zu' n-1 ' –