[PYTHON] Ich habe eine Bibliothek konoha gemacht, die den Tokenizer auf ein schönes Gefühl umstellt

TL; DR

Einführung in konoha, eine Bibliothek zum Tokenisieren von Anweisungen. (Alter tiny_tokenizer) Sie können es wie ↓ verwenden. Was ist das ~

from konoha import WordTokenizer

sentence = 'Studium der Verarbeitung natürlicher Sprache'

tokenizer = WordTokenizer('MeCab')
print(tokenizer.tokenize(sentence))  # -> [Natur,Sprache,wird bearbeitet,Zu,Studie,Shi,Hand,ich,Masu]

tokenizer = WordTokenizer('Kytea')
print(tokenizer.tokenize(sentence))  # -> [Natur,Sprache,wird bearbeitet,Zu,Studie,Shi,Hand,ich,Gut,Su]

tokenizer = WordTokenizer('Sentencepiece', model_path="data/model.spm")
print(tokenizer.tokenize(sentence))  # -> [▁,Natur,Sprache,wird bearbeitet,Zu,Studie,Shi,Ist]

Einführung: Was ist ein Tokenizer?

Im Gegensatz zu Sprachen wie Englisch hat Japanisch keine klaren Trennzeichen an den Wortgrenzen. Aus diesem Grund ist es bei der Analyse von Japanisch zunächst erforderlich, den Satz in einige Einheiten (z. B. Wörter) zu unterteilen. Dieser Teilungsprozess wird in Worteinheiten unterteilt, Wörter werden weiter in Unterworteinheiten unterteilt und so weiter. Und es gibt Dinge, die die Zeichenkette im Satz in jedes Zeichen unterteilen. In diesem Artikel werden die durch die obigen Einheiten geteilten Teilzeichenfolgen als Token bezeichnet. Es gibt verschiedene Methoden zur Tokenisierung. Morphologische Analysegeräte, die häufig bei der Analyse japanischer Texte verwendet werden, führen auch eine Wortsegmentierung durch. (Zusätzlich zur Wortteilung führt die morphologische Analyse eine Wortüberschriften- und Teilwort-Tag-Schätzung durch.)

Verwenden Sie für die wortweise Teilung ein Wörterbuch, um ein Gitter zu erstellen, und verwenden Sie dann MeCab, um die optimale Wortfolge zu bestimmen. Es gibt Algorithmen wie Kytea, die Wortgrenzen auf Zeichenebene bestimmen. Diese Algorithmen können das gleiche Teilungsergebnis oder unterschiedliche Teilungsergebnisse zurückgeben. Selbst wenn der Teilungsalgorithmus derselbe ist, ändert sich die Worteinheit, wenn das Teilesystem unterschiedlich ist.

Unterwörter sind mehr unterteilte Wörter. Seine Wirksamkeit wurde durch neuronale maschinelle Übersetzung bestätigt. Als typischer Tokenword für Unterworteinheiten, der in der japanischen Textanalyse verwendet wird Satzstück ist berühmt.

Was tun mit dem Tokenizer?

Für diejenigen, die japanisches Text Mining betreiben Verwenden Sie normalerweise MeCab + NEologd? Es kann Fälle geben, in denen in der Forschung häufig Kytea verwendet wird. Auch in der kürzlich besprochenen Abhängigkeitsanalyse-Bibliothek Ginza Verwendung eines morphologischen Analysators namens SudachiPy (Python-Implementierung von Sudachi) usw. Für die Analyse auf Wortebene werden verschiedene Analysegeräte verwendet. Es ist schwierig zu bestimmen, welcher Analysator für Sie am besten geeignet ist.

Darüber hinaus wurde in den letzten Jahren hauptsächlich im Zusammenhang mit maschineller Übersetzung "Die Aufgabenleistung ist besser, wenn die Token in Unterwörter unterteilt sind, anstatt die Ergebnisse des morphologischen Analysators zu verwenden." Es wurde auch berichtet, dass eine auf Unterwörtern basierende Unterteilung häufig angewendet wird.

Die Tokenisierung auf Zeichenebene ist durch eine geringe Anzahl von Zeichentypen im Vergleich zur Anzahl der Worttypen gekennzeichnet. Die Anzahl der Worttypen ist im Allgemeinen viel größer als die Anzahl der Zeichentypen, und die Tokenisierung auf Zeichenebene hat den Effekt, dass die Vokabulargröße verringert wird. In der Studie zur Eigenausdrucksextraktion gibt es beispielsweise einen Ansatz zum Hinzufügen von Features auf Zeichenebene zu LSTM-Features. Viele neuere Studien haben diesen Ansatz übernommen. (Das im Link aufgeführte Papier ist alt, aber es ist mein Lieblingspapier)

In welcher Einheit sollten wir in dieser Situation die Aussage tokenisieren? Im Allgemeinen verstehe ich, dass die Antwort auf diese Frage "** aufgabenabhängig **" ist und es keine einzige Antwort gibt. Aus diesem Grund "benutze ich MeCab + NEologd, weil viele Leute es benutzen." "Da das Papier Subwörter verwendet, werde ich vorerst mit Subwörtern arbeiten." Solche Optionen werden in der Regel getroffen.

Für aktuelle Aufgaben zur Verarbeitung natürlicher Sprache (insbesondere bei Verwendung neuronaler Netze) Es gibt viele Dinge, die genauso bezahlt werden müssen wie die Tokenisierung. (Beispiel: Architektur, verborgene Schichtdimensionen, Optimierer, Lernrate ... usw.), Vor diesem Hintergrund steht die Methode der Tokenisierung am Anfang der Lösung des Problems. Ich denke, die aktuelle Situation ist, dass oft entschieden wird, "Nein" zu sein. Aber sind andere Tokenisierungsmethoden wirklich einen Versuch wert? Ich finde es lohnenswert, verschiedene Tokenisierungsmethoden auszuprobieren Wir haben eine Bibliothek entwickelt, um die Tokenisierungsmethode einfach zu wechseln. Dies ist der Grund für die Entwicklung von Konoha.

Verschiedene Tokenizer und verschiedene APIs

Das Wechseln von Tokenizern kostet oft etwas. Alle oben gezeigten morphologischen Analysatoren und Tokenizer verfügen über Python-Wrapper. Benutzer können diese Tools von Python aus verwenden, indem sie die Wrapper-Bibliothek installieren.

Die Wrapper-Bibliotheken bieten jedoch APIs mit unterschiedlichen Redewendungen. (Ich denke, es ist natürlich, weil jeder Analysator und seine Wrapper-Bibliothek von verschiedenen Autoren geschrieben wurden.) Wenn Sie daher den Ausgang mehrerer Analysegeräte je nach Situation umschalten möchten, Sie müssen die Ebene implementieren, die die Unterschiede in den Redewendungen dieser APIs absorbiert.

Vorhergehender Fall

Es gibt eine Bibliothek namens JapaneseTokenizer. (GitHub-Repository: Kensuke-Mitsuzawa / JapaneseTokenizers) Wie konoha bietet JapaneseTokenizer auch Wrapper für mehrere Tokenizer. JapaneseTokenizer bietet eine Schnittstelle für mehrere morphologische Analysegeräte. JapaneseTokenizer kann verwendet werden, um Satzanalyseergebnisse nach bestimmten Teilwort-Tags usw. zu filtern. Es hat viele praktische Funktionen, die für die Textanalyse nützlich sind. Es ist ein sehr praktisches Werkzeug für die Verarbeitung natürlicher Sprache unter Verwendung der Ergebnisse mehrerer morphologischer Analysegeräte.

konoha

Auf der anderen Seite bietet der winzige Tokenizer derzeit keine Funktionen wie die Teilwortfilterung. Der winzige Tokenizer ist eine Bibliothek, die den Tokenisierungsprozess jedes Analysators abstrahiert. Es bietet Funktionen zur Unterteilung von Unterworteinheiten und zur Unterteilung auf Zeichenebene, auf die JapaneseTokenizer nicht abzielt.

Die Position dieser Bibliothek ist ein Wrapper für den Python-Wrapper. Vielen Dank an alle, die den Python-Wrapper für den Analysator bereitgestellt haben. Der Zweck dieser Bibliothek besteht darin, die Unterschiede in den Schnittstellen dieser Bibliotheken auszugleichen. Durch die Verwendung von konoha können Benutzer mehrere Analysegeräte mit einer einheitlichen API verwenden.

Tokenisierung

Zunächst zeige ich Ihnen ein Beispiel mit MeCab. In diesem Beispiel verwendet das Wörterbuch mecab-ipadic. Wenn Sie macOS verwenden, mecab, mecab-ipadic, Wenn Sie Ubuntu verwenden, installieren Sie bitte zusätzlich zu den oben genannten "libmecab-dev". Der Betrieb wurde für andere Distributionen nicht überprüft. (Wenn mecab , mecab-config ausgeführt werden kann und das Wörterbuch installiert ist, funktioniert es ohne Probleme.) Wenn Sie die Docker-Datei im GitHub-Repository erstellen und die Umgebung erstellen, sind alle Vorbereitungen abgeschlossen.

--Code

from konoha import WordTokenizer

sentence = 'Studium der Verarbeitung natürlicher Sprache'

tokenizer = WordTokenizer('MeCab')
print(tokenizer.tokenize(sentence))

--Ausgabe

[Natur,Sprache,wird bearbeitet,Zu,Studie,Shi,Hand,ich,Masu]

Als nächstes verwenden wir Kytea. Wieder müssen Sie Kytea bauen. (Siehe auch die Docker-Datei im Repository.)

--Code

from konoha import WordTokenizer

sentence = 'Studium der Verarbeitung natürlicher Sprache'

tokenizer = WordTokenizer('Kytea')
print(tokenizer.tokenize(sentence))

--Ausgabe

[Natur,Sprache,wird bearbeitet,Zu,Studie,Shi,Hand,ich,Gut,Su]

Wenn Sie einen Satz in Unterwörter unterteilen möchten, können Sie auch Satzstück verwenden. Bei Verwendung von Satzstück muss die Modelldatei angegeben werden. Übergeben Sie den Pfad zur Modelldatei an "model_path".

--Code

from konoha import WordTokenizer

sentence = 'Studium der Verarbeitung natürlicher Sprache'

tokenizer = WordTokenizer('Sentencepiece', model_path="data/model.spm")
print(tokenizer.tokenize(sentence))

--Ausgabe

[▁,Natur,Sprache,wird bearbeitet,Zu,Studie,Shi,Ist]

Auf diese Weise können mehrere Analysatoren auf einheitliche Weise verwendet werden, indem einfach der Wert des an "WordTokenizer" übergebenen Arguments geändert wird. Dies macht es einfach, während der Versuchsphase mit verschiedenen Tokenisierern zu experimentieren.

Teiletextschätzung

Ein morphologischer Analysator ist ebenfalls im Tokenizer enthalten. Von den derzeit von konoha unterstützten Tokenizern Die morphologischen Analysatoren sind "MeCab", "Kytea" und "Sudachi (SudachiPy)". In Bezug auf diese, ob die vom morphologischen Analysator gegebenen Informationen wie das Teil-der-Sprache-Tag erhalten werden sollen oder nicht, wenn eine Tokenisierung durchgeführt wird. Es kann optional gesteuert werden.

Ein Beispiel für die Verwendung von "SudachiPy" ist unten dargestellt.

--Code

from konoha import WordTokenizer

sentence = 'Studium der Verarbeitung natürlicher Sprache'

tokenizer = WordTokenizer('Sudachi', mode='A', with_postag=True)
print(tokenizer.tokenize(sentence))

--Ausgabe

[Natur(Substantiv),Sprache(Substantiv),wird bearbeitet(Substantiv),Zu(Partikel),Studie(Substantiv),Shi(Verb),Hand(
Partikel),ich(Verb),Masu(助Verb)]

Die Ausgabe von "tokenizer.tokenize" ist eine Instanz der "Token" -Klasse. Die folgenden Instanzvariablen sind in der Token-Klasse definiert. (Auszug aus der Dokumentzeichenfolge der Token-Klasse)

Informationen, die der Analysator nicht zurückgibt, sind "Keine". Zum Beispiel verwendet token.normalized_form SudachiPy und Und nur wenn "with_postag" "True" ist, ist der Wert nicht "None". (Token ist ein Element des Arrays von Token-Strings, die von tokenizer.tokenize` ausgegeben werden.)

"""
surface (str)
    surface (original form) of a word
postag (str, default: None)
    part-of-speech tag of a word (optional)
postag2 (str, default: None)
    detailed part-of-speech tag of a word (optional)
postag3 (str, default: None)
    detailed part-of-speech tag of a word (optional)
postag4 (str, default: None)
    detailed part-of-speech tag of a word (optional)
inflection (str, default: None)
    conjugate type of word (optional)
conjugation (str, default: None)
    conjugate type of word (optional)
base_form (str, default: None)
    base form of a word
yomi (str, default: None)
    yomi of a word (optional)
pron (str, default: None)
    pronounciation of a word (optional)
normalized_form (str, default: None)
    normalized form of a word (optional)
    Note that normalized_form is only
    available on SudachiPy
"""

Verwenden Sie Ihr eigenes Benutzerwörterbuch (MeCab)

Wenn Sie das Benutzerwörterbuch verwenden möchten, verwenden Sie "user_dictionary_path" von "WordTokenizer" Übergeben Sie den Pfad im benannten Argument an das Benutzerwörterbuch.

from konoha import WordTokenizer

sentence = 'Studium der Verarbeitung natürlicher Sprache'

tokenizer = WordTokenizer('MeCab', user_dictionary_path="path/to/user_dict")
print(tokenizer.tokenize())

Verwenden Sie Ihr eigenes Systemwörterbuch (MeCab)

Ich möchte mecab-ipadic-NEologd verwenden, Oder wenn Sie das Systemwörterbuch verwenden möchten, das Sie mithilfe des Korpus selbst neu gelernt haben Es ist möglich, einen Tokenizer durch Angabe eines Systemwörterbuchs zu generieren. Da das Argument "system_dictionary_path" in "WordTokenizer" generiert wird, Geben Sie den Pfad zum Systemwörterbuch an, das Sie verwenden möchten.

from konoha import WordTokenizer

sentence = 'Studium der Verarbeitung natürlicher Sprache'

tokenizer = WordTokenizer('MeCab', system_dictionary_path="path/to/system_dict")
print(tokenizer.tokenize())

Zusammenfassung

In diesem Dokument handelt es sich um eine Bibliothek zur Verwendung mehrerer Tokenizer mit derselben Schnittstelle. Wir haben Konoha eingeführt. Verwenden Sie diese Bibliothek, wenn Sie sich fragen, welcher Analysator zu Beginn der Textanalyse verwendet werden soll Der Analysator kann einfach umgeschaltet werden. Ich habe auch vor, mit MeCab zu experimentieren, aber meine früheren Forschungen verwenden andere Analysegeräte. Selbst in dem Fall, in dem Sie Code schreiben müssen, um einen anderen Analysator zum Vergleich zu verwenden Durch Einfügen von konoha können Sie problemlos mit demselben Code experimentieren. Ich hoffe, es hilft Menschen, die natürliche Sprache auf dem Gebiet verarbeiten, und solchen, die natürliche Sprache in der Forschung verarbeiten. Bitte benutzen Sie es, wenn Sie möchten, danke.


Um Kytea unter Ubuntu 18.04 zu erstellen, diese Pull-Anfrage Muss importiert werden. Weitere Informationen finden Sie in der Docker-Datei im Konoha-Repository.

Recommended Posts

Ich habe eine Bibliothek konoha gemacht, die den Tokenizer auf ein schönes Gefühl umstellt
Ich habe eine Bibliothek erstellt, um japanische Sätze schön zu brechen
Ich habe einen Befehl zum Markieren des Tabellenclips gegeben
Ich habe eine Python-Bibliothek erstellt, die einen rollierenden Rang hat
Ich habe eine Funktion erstellt, um das Modell von DCGAN zu überprüfen
Ich habe versucht, ein Programm zu erstellen, um die Fehlersuche von Saiseriya zu lösen (Hinweis)
Ich habe eine Bibliothek erstellt, die Konfigurationsdateien mit Python einfach lesen kann
Ich habe ein Programm erstellt, das die Fehlersuche in Sekunden löst
Ich habe eine Python-Bibliothek erstellt, um die API von LINE WORKS aufzurufen
Ich habe einen schlaffen Bot gemacht, der mich über die Temperatur informiert
Ich habe den Befehl gegeben, einen farbenfrohen Kalender im Terminal anzuzeigen
Ich habe ein Programm erstellt, das den Tierkreis mit tkinter automatisch berechnet
Ich habe ein Skript erstellt, um Piktogramme anzuzeigen
Ich habe eine Bibliothek für versicherungsmathematische Versicherungen erstellt
Ich habe einen Kalender erstellt, der den Verteilungsplan von Vtuber automatisch aktualisiert
[Python] Ich habe einen Dekorateur gemacht, der keinen Nutzen zu haben scheint.
[Django] Erstellt ein Feld zur Eingabe von Daten mit 4-stelligen Zahlen
Ich habe einen Küchentimer erstellt, der in der Statusleiste angezeigt wird!
Ich habe ein Programm erstellt, um Sie per LINE zu benachrichtigen, wenn Schalter eintreffen
Ich habe einen einfachen Timer erstellt, der vom Terminal aus gestartet werden kann
Was ist eine C-Sprachbibliothek? Welche Informationen sind für die Öffentlichkeit zugänglich?
Ich habe ein Programm erstellt, um die Größe einer Datei mit Python zu überprüfen
Ich habe eine Funktion erstellt, um die Bewegung eines zweidimensionalen Arrays (Python) zu sehen.
Da ich zu verschiedenen Zeiten anfing zu arbeiten, machte ich einen Bot, der mir die Zeit sagt, die Arbeit zu verlassen
Ich habe ein Tool erstellt, um die Ausführungszeit von cron zu schätzen (+ PyPI-Debüt)
Ich habe einen LINE BOT erstellt, der mithilfe der Flickr-API ein Bild von Reis-Terroristen zurückgibt
Die Geschichte der IPv6-Adresse, die ich auf ein Minimum beschränken möchte
Ich habe einen Zeilenbot erstellt, der Python verwendet, um ungelesene E-Mails aus Google Mail abzurufen!
Ich habe eine Bibliothek zum Betreiben des AWS CloudFormation-Stacks über CUI (Python Fabric) erstellt.
Ich habe versucht, die Python-Bibliothek "pykakasi" zu verwenden, die Kanji in Romaji konvertieren kann.
Ich habe einen Appdo-Befehl erstellt, um Befehle im Kontext der App auszuführen
Ich habe ein Tool erstellt, um Hy nativ zu kompilieren
Ich habe ein Skript geschrieben, um die Schluckuhr wiederzubeleben, die bald sterben wird
Ich habe ein Tool erstellt, um neue Artikel zu erhalten
Ich habe ein Programm erstellt, um Wörter im Fenster nachzuschlagen (vorherige Entwicklung)
Ich habe ein Skript erstellt, das das aktive Fenster mit win32gui von Python aufzeichnet
Eine Geschichte, der ich nach der SFTP-Kommunikation mit Python verfallen war
[LPIC 101] Ich habe versucht, die Befehlsoptionen zusammenzufassen, die leicht zu Fehlern führen können
[Python] Ich habe ein System erstellt, um "das Rezept, das ich wirklich will" von der Rezeptseite einzuführen!
Ich habe ein System erstellt, mit dem Sie nur durch einen Anruf twittern können
Ich habe einen Befehl gegeben, auf den Start von Django zu warten, bis die Datenbank bereit ist
[Python / C] Ich habe versucht, ein Gerät zu erstellen, das den Bildschirm eines PCs drahtlos aus der Ferne scrollt.
Ich habe einen Kalender erstellt, der den Verteilungsplan von Vtuber automatisch aktualisiert (Google Kalender Edition).
Eine grobe Einführung in die neuronale maschinelle Übersetzungsbibliothek
Ich habe eine VM erstellt, auf der OpenCV für Python ausgeführt wird
Ich habe ein Skript erstellt, um ein Snippet in README.md einzufügen
Ich habe ein Python-Modul erstellt, um Kommentare zu übersetzen
Ich habe einen Code erstellt, um illustration2vec in ein Keras-Modell zu konvertieren
Ich wollte die Python-Bibliothek von MATLAB verwenden
Eine Geschichte, von der ich bei np.where süchtig war
[Python] Eine praktische Bibliothek, die Kanji in Hiragana konvertiert
Ein Memo, dass ich den Datenspeicher mit Python berührt habe
Ich hatte das Gefühl, dass ich den Python-Code nach C ++ 98 portiert habe.
〇✕ Ich habe ein Spiel gemacht
Beim Schreiben in eine CSV-Datei mit Python habe ich einen kleinen Fehler gemacht und den Liefertermin nicht eingehalten