r ngram Extraktion mit Regex

8

Karl Bromans Post: Ссылка brachte mich dazu, mit Regex und Ngrams zu spielen Spaß. 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).

Nachfolgend gebe ich ein minimales Beispiel und die gewünschte Ausgabe. Das Problem in meinem Versuch ist 2-fach:

  1. Die Gramm (Wörter) werden aufgefressen und sind für den nächsten Durchlauf nicht verfügbar. Wie kann ich sie für den zweiten Durchlauf zur Verfügung stellen? (zB möchte ich, dass like für like toast verfügbar ist, nachdem es bereits zuvor in I like verbraucht wurde)

  2. Ich konnte den Abstand zwischen den Wörtern nicht erfassen (beachte den nachgestellten Leerraum in meiner Ausgabe, obwohl ich (?:\s*) benutzt habe). Wie kann ich nachfolgende Leerzeichen auf dem n-ten Wort (in diesem Fall das zweite Wort) nicht erfassen? Ich weiß, dass dies einfach mit: "(\b[A-Za-z']+\s)(\b[A-Za-z']+)" für ein 2-Gramm-Element möglich ist, aber ich möchte die Lösung auf erweitern N-Gramm. PS Ich weiß über \w , aber ich halte Unterstriche und Zahlen nicht als Wortteile, sondern betrachten ' als Wortteil.

MWE:

%Vor%

Gewünschte Ausgabe:

%Vor%     
Tyler Rinker 23.06.2015, 12:40
quelle

2 Antworten

6

Hier ist eine Möglichkeit, Base R Regex zu verwenden. Dies kann leicht erweitert werden, um beliebige N-Gramme zu handhaben. Der Trick besteht darin, die Erfassungsgruppe in eine positive Vorausschauzusicherung zu stellen, z. B. (?=(my_overlapping_pattern))

%Vor%     
Matthew Plourde 23.06.2015, 13:14
quelle
2

Tatsächlich gibt es dafür eine App: das Paket quanteda (für die quantitative Analyse von Textdaten). Mein Co-Autor Paul Nulty und ich arbeiten hart daran, dies zu verbessern, aber es behandelt leicht den von Ihnen beschriebenen Anwendungsfall.

%Vor%

Keine schmerzhaften Regex erforderlich!

    
Ken Benoit 23.06.2015 15:04
quelle

Tags und Links