Python re.split () vs nltk word_tokenize und sent_tokenize

8

Ich ging diese Frage durch.

Ich frage mich nur, ob NLTK schneller wäre als Regex bei der Wort / Satz-Tokenisierung.

    
wakamdr 11.02.2016, 17:11
quelle

1 Antwort

15

Der Standardcode nltk.word_tokenize() verwendet den Treebank-Tokenizer , der den Tokenizer aus dem Penn Treebank Tokenizer .

Beachten Sie, dass str.split() Tokens im linguistischen Sinne nicht erreicht, z. B .:

%Vor%

Es wird normalerweise verwendet, um Strings mit spezifizierten Begrenzern zu trennen, z. In einer durch Tabulatoren getrennten Datei können Sie str.split('\t') verwenden oder wenn Sie versuchen, eine Zeichenkette durch die neue Zeile \n zu teilen, wenn Ihre Textdatei einen Satz pro Zeile enthält.

Und machen wir ein Benchmarking in python3 :

%Vor%

[out]:

%Vor%

Wenn wir versuchen, einen anderen Tokenizer in NLTK mit Spitzenqualität von Ссылка :

%Vor%

[out]:

%Vor%

(Hinweis: Die Quelle der Textdatei stammt von Ссылка )

Wenn wir uns die native perl -Implementierung ansehen, ist die python vs perl -Zeit für ToktokTokenizer vergleichbar. Aber tun das in der Python-Implementierung die Regexes sind vorkompiliert, während in Perl ist es nicht aber :

%Vor%

(Hinweis: Bei der Zeitsteuerung von tok-tok.pl mussten wir die Ausgabe in eine Datei pipen, also enthält das Timing hier die Zeit, die der Rechner benötigt, um in die Datei auszugeben, während dies im nltk.tokenize.ToktokTokenizer Timing nicht der Fall ist Zeit für die Ausgabe in eine Datei einschließen)

In Bezug auf sent_tokenize() , es ist ein wenig anders und vergleichen Geschwindigkeit Benchmark ohne Berücksichtigung der Genauigkeit ist ein wenig schrullig.

Bedenken Sie Folgendes:

  • Wenn eine Regex eine Textdatei / einen Absatz in einem Satz aufteilt, dann ist die Geschwindigkeit fast sofort, d. h. 0 Arbeit erledigt. Aber das wäre ein schrecklicher Satz Tokenizer ...

  • Wenn Sätze in einer Datei bereits durch \n getrennt sind, dann ist es einfach ein Vergleich, wie str.split('\n') vs re.split('\n') und nltk nichts mit der Satz-Tokenisierung zu tun haben;

Informationen zur Funktionsweise von sent_tokenize() in NLTK finden Sie unter:

Um also sent_tokenize() gegenüber anderen regexbasierten Methoden (nicht str.split('\n') ) effektiv zu vergleichen, müsste man auch die Genauigkeit auswerten und einen Datensatz mit menschlich ausgewertetem Satz in einem Token-Format haben.

Betrachten Sie diese Aufgabe: Ссылка

Gegeben der Text:

  

In der dritten Kategorie hat er jene Brüder (die Mehrheit) einbezogen, die   sah nichts in der Freimaurerei als die äußeren Formen und Zeremonien, und   schätzte die strikte Ausführung dieser Formen ohne sich darum zu kümmern   ihre Bedeutung oder Bedeutung. So waren Willarski und sogar der Grand   Meister der Hauptlodge. Schließlich zur vierten Kategorie auch a   sehr viele Brüder gehörten, besonders diejenigen, die in letzter Zeit hatten   beigetreten. Diese laut Pierre Beobachtungen waren Männer, die keine hatten   Glaube an irgendetwas, noch Verlangen nach irgendetwas, aber schloss sich den Freimaurern an   nur mit den wohlhabenden jungen Brüdern zu verbinden, die waren   einflussreich durch ihre Verbindungen oder Rang, und von denen es gab   sehr viele in der Hütte. Pierre begann sich unzufrieden mit dem zu fühlen, was er   Hat gemacht. Freimaurerei, jedenfalls, wie er es hier manchmal sah   schien ihm nur auf Äußerlichkeiten gegründet zu sein. Er dachte nicht daran zu zweifeln   Freimaurerei selbst, aber vermutet, dass die russische Freimaurerei ein genommen hatte   falschen Weg und von seinen ursprünglichen Prinzipien abgewichen. Und so zu   Ende des Jahres ging er ins Ausland, um in den höheren initiiert zu werden   Geheimnisse der Ordnung. Was ist unter diesen Umständen zu tun? Zu   Revolutionen begünstigen, alles stürzen, Gewalt abstoßen? Nein! Wir   sind sehr weit davon entfernt. Jede gewaltsame Reform verdient es, dafür zu tadeln   rechtfertigt es nicht, Böses zu heilen, während Männer bleiben, was sie sind, und auch   weil Weisheit keine Gewalt braucht. "Aber was ist da rüber rennen   Ist es so? "sagte Ilagins Bräutigam." Einmal hatte sie es verpasst und sich umgedreht   es weg, jeder Mischling könnte es nehmen ", sagte Ilagin gleichzeitig   Zeit, atemlos von seinem Galopp und seiner Aufregung.

Wir wollen das bekommen:

%Vor%

Also macht str.split('\n') einfach nichts. Selbst ohne Berücksichtigung der Reihenfolge der Sätze, erhalten Sie 0 positives Ergebnis:

%Vor%     
alvas 11.02.2016, 19:28
quelle

Tags und Links