Ich ging diese Frage durch.
Ich frage mich nur, ob NLTK schneller wäre als Regex bei der Wort / Satz-Tokenisierung.
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 .:
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
:
[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 :
(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: