[PYTHON] Holen Sie sich mit fastText auf Facebook eine verteilte Darstellung von Wörtern in Fast

"Frankreich" - "Paris" + "Tokio" = "Japan"

Es wurde Word2Vec von Google angekündigt, dass es ein heißes Thema wurde, dass solche Wörter berechnet werden können. Einfach ausgedrückt ist dies eine Technologie, die Wörter numerisch ausdrückt, wodurch es möglich ist, die "Nähe" von Wörtern zu messen und die obigen Operationen auszuführen. Diese numerische Darstellung von Wörtern wird als verteilte Darstellung bezeichnet. Der diesmal von Facebook angekündigte fastText ist eine Erweiterung dieses Word2Vec, und Sie können mit hoher Geschwindigkeit genauere Ausdrücke lernen. In diesem Artikel erklären wir den Mechanismus und wie man ihn auf japanische Dokumente anwendet.

Wie fastText funktioniert

In fastText handelt es sich um ein Modell, das "Nutzungsformulare" zusammenfassen kann, die in Word2Vec und seinem Typmodell bis dahin nicht berücksichtigt wurden. Insbesondere gehen, gehen und gehen sind alle "gehen", aber sie sind alle buchstäblich unterschiedlich, so dass sie in den herkömmlichen Methoden als separate Wörter behandelt werden. Daher schlagen wir eine Methode vor, mit der Wörter, die nahe beieinander liegen, eine zusammenhängende Bedeutung haben, indem wir die Wörter berücksichtigen, die in Komponenten zerlegt wurden (im Bild "go" und "es" for goes). Subword-Modell).

image

In Bezug auf die Wortkomponenten werden im Papier diejenigen mit 3 oder mehr Zeichen und weniger als 6 Zeichen verwendet, und diejenigen mit weniger als 3 Zeichen werden als Präfixe und Suffixe behandelt. Je mehr Wortkomponenten Sie verwenden, desto mehr Variationen können Sie in Kombination vornehmen, was Ihre Ausdruckskraft verbessert. Die Berechnung dauert jedoch länger. Dies ist ein Kompromiss, aber ich beschränke ihn in meiner Arbeit auf 2 Millionen. Wenn Sie weitere Einzelheiten erfahren möchten, lesen Sie bitte das Papier.

Darüber hinaus implementiert fastText auch eine Dokumentklassifizierungsfunktion, die eine verteilte Darstellung basierend auf dieser Methode verwendet (das Papier ist unten).

Das Obige ist der Mechanismus von fastText. Von hier aus werde ich das Verfahren zur tatsächlichen Verwendung von fastText vorstellen.

So verwenden Sie fastText

Die Verwendung von fastText selbst ist sehr einfach.

./fasttext skipgram -input data.txt -output model

Wie Sie auf der offiziellen Seite sehen können, ist es so einfach wie möglich, ein "Modell" zu erstellen, indem Sie die Dokumentdaten "data.txt" übergeben. Im Gegensatz zu Englisch werden Wörter im Japanischen jedoch nicht durch Leerzeichen getrennt, sodass das Wort "getrenntes Schreiben" herausgeschnitten werden muss. Das Verfahren hierfür wird unten erläutert.

Das folgende Repository ist für diese Arbeit vorbereitet. Wenn Sie dies klonen und gemäß dem Verfahren fortfahren, ist es in Ordnung, also hoffe ich, dass Sie davon Gebrauch machen.

icoxfog417/fastTextJapaneseTutorial

(Es wird ermutigend sein, Stern m (_ _) m zu erhalten)

Vorbereitungen

Dieses Mal werden wir Python für die Verarbeitung verwenden, daher benötigen wir eine Python-Umgebung. Da MeCab zum separaten Schreiben von Japanisch verwendet wird, muss MeCab installiert werden. Unter Windows gibt es viele Schwierigkeiten mit MeCab. Unter Windows 10 ist es daher einfacher, in der Ubuntu-Umgebung mit bash unter Windows zu arbeiten.

1. Bereiten Sie ein Dokument vor, das zum Lernen verwendet werden soll

Bereiten Sie zunächst ein Dokument vor, das Sie zum Lernen verwenden möchten (in der Gemeinschaft der natürlichen Sprachen wird dies als Korpus bezeichnet). Das bekannteste ist Wikipedia. Dieses Mal habe ich die Dump-Daten der japanischen Wikipedia verwendet.

[Wikipedia: Datenbank-Download](https://ja.wikipedia.org/wiki/Wikipedia:%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83% BC% E3% 82% B9% E3% 83% 80% E3% 82% A6% E3% 83% B3% E3% 83% AD% E3% 83% BC% E3% 83% 89)

Gehen Sie zum Speicherort des Speicherauszugs von "Wikipedia Japanese version dump" auf der obigen Seite und rufen Sie die neuesten Datumsdaten ab. Es gibt viele Typen, aber nur die Übersicht (jawiki-xxxxxxxx-abstract.xml) und der vollständige Artikel (jawiki-xxxxxxxx-pages-articles.xml.bz2) sind nützlich.

Natürlich sind auch andere Dokumente wie Zeitungsartikel und Blog-Artikel akzeptabel. Es ist besser, einen Korpus herzustellen, der für den Zweck der verteilten Expression geeignet ist. Da Wikipedia beispielsweise nur ein Wörterbuch ist, werden die Geschichte usw., selbst wenn Sie sich den Artikel "Disneyland" ansehen, detailliert geschrieben, und Schlüsselwörter wie "Spaß" und die Namen der Attraktionen werden nie angezeigt. Da die Art der verteilten Ausdrücke durch die Wörter bestimmt wird, die um sie herum erscheinen, ist es besser, Elemente wie Spaß und Berühmtheit einzubeziehen, wenn man "Disneyland" sagt, oder ist es besser, Elemente wie Los Angeles und die 1950er Jahre einzuschließen? Der Korpus, den Sie zum Lernen verwenden sollten, hängt vom Typ ab.

2. Text extrahieren

Bei Verwendung von Wikipedia handelt es sich bei den Speicherauszugsdaten um XML. Daher müssen reine Textdaten daraus extrahiert werden. Es gibt verschiedene Tools, die dies tun können, aber dieses Mal habe ich den Python Wikipedia Extractor verwendet.

Wikipedia Extractor

Es kann wie folgt ausgeführt werden. Die Option -b trennt die Dateien alle 500 MB.

python wikiextractor/WikiExtractor.py -b 500M -o (Ausgabeordner) jawiki-xxxxxxxx-pages-articles-multistream.xml.bz2

Darüber hinaus geht Wikipedia Extractor von einer Datei aus, deren Dateiformat "bz2" lautet, und unterstützt keine abstrakten Dateien. Wenn Sie es mit einer abstrakten Datei versuchen möchten, verwenden Sie bitte parser.py im Repository, da es verarbeitet werden kann.

Schließlich werden die extrahierten Textdaten zu einer Textdatei zusammengefasst. Damit ist die Textextraktion abgeschlossen.

3. Teilen Sie den Text in Wörter (getrennt)

Nun, das Hauptthema ist von hier. Im Gegensatz zu Englisch werden Wörter auf Japanisch nicht durch Leerzeichen getrennt. Daher muss jedes Wort ausgeschnitten werden, indem es als Unterteilung verarbeitet wird. MeCab wird für diese Arbeit verwendet. Dieses Mal benötigen wir die morphologischen Informationen nicht, da wir sie nur separat schreiben und sie daher mit dem folgenden Befehl verarbeiten.

mecab (Zieltextdatei) -O wakati -o (Zieldatei ausgeben)

Sie haben jetzt eine Datei mit durch Leerzeichen getrennten Wörtern.

Darüber hinaus verfügt MeCab über ein Wörterbuch mit Wörtern zum Teilen. Je mehr Vokabeln Sie in diesem Wörterbuch haben, desto genauer werden Ihre Unterteilungen sein, und Sie können mecab-neologd verwenden, um modernere Wörter zu erkennen. Sie können es separat schreiben, verwenden Sie es also nach Bedarf.

4. Lernen Sie mit fastText

Jetzt, da Sie eine wortgetrennte Datei haben, genau wie in Englisch, müssen Sie nur noch fastText ausführen. Klonen Sie das Repository fastText und erstellen Sie es mit make wie in der Dokumentation beschrieben.

Es gibt verschiedene Einstellungsparameter, aber in Bezug auf das Papier ist die Größe des numerischen Ausdrucks (Vektordimension) des Wortes abhängig vom zu verarbeitenden Datensatz wie folgt (* Es wurde nicht erwähnt, was ein Einheitstoken ist. Aber es ist wahrscheinlich eine Wortzahl).

Der Punkt ist, dass ein kleiner Datensatz eine kleine Dimension hat. In allen Wikipedia-Fällen entspricht dies vollen 300 Dimensionen. Gehen Sie also wie folgt vor.

./fasttext skipgram -input (Getrennte Dateien) -output model -dim 300

Wenn Sie dieselben Parameter wie beim Lernen von Word2Vec verwenden möchten, gehen Sie wie folgt vor (Parametereinstellungen usw. finden Sie unter hier. ).

./fasttext skipgram -input (Getrennte Dateien) -output model -dim 200 -neg 25 -ws 8

(Obwohl es auch zu diesem Thema veröffentlicht wird, scheint es sich in Abhängigkeit von den Parametern erheblich zu ändern.](Https://github.com/facebookresearch/fastText/issues/5). Epoche, Mincount usw.)

Nach Abschluss des Trainings werden zwei Dateitypen, ".bin" und ".vec", für den durch "-output" angegebenen Dateinamen erstellt. Dies sind die Dateien, die die gelernten verteilten Darstellungen enthalten. Insbesondere ist .vec eine einfache Textdatei, in der Wörter und verteilte Ausdrücke gepaart sind, sodass ich denke, dass sie in anderen Sprachen als Python gelesen und verwendet werden kann.

In allen Wikipeida-Fällen ist die Datengröße jedoch zu groß, und beim Versuch, die "Modell" -Datei zu lesen, wird sie manchmal mit MemoryError übersprungen, und es gibt Fälle, in denen Codierungsprobleme auftreten (oder vielmehr aufgetreten sind). Aber). Erstellen Sie in einem solchen Fall einmal ein Wörterbuch mit Wörtern (erstellen Sie ein Wörterbuch, das Wörter in IDs konvertiert, z. B. "Morgen" -> 11), und konvertieren Sie die Textdatei in eine Spalte mit Wort-IDs.

5. Verwenden Sie fastText

Lassen Sie uns nun fastText verwenden. Es gibt eine Python-Schnittstelle, aber wie oben erwähnt, ist die Dateistruktur einfach, sodass sie nicht verwendet werden muss. Wir haben eval.py im Repository, sodass Sie damit nach ähnlichen Wörtern suchen können.

python eval.py EXILE

Ergebnis ist ···

EXILE, 0.9999999999999999
Exil, 0.8503456049215405
ATSUSHI, 0.8344220054003253

Nun, die Ähnlichkeiten sind ordentlich (die Zahlen geben die Kosinusähnlichkeit an; je näher sie an 1 liegt, desto ähnlicher ist sie und je näher sie an 0 liegt, desto weniger ähnlich ist sie). Schauen wir uns umgekehrt Wörter an, die nicht ähnlich sind.

python eval.py EXILE --negative

Ergebnis ist ····

Souveränität, 0.011989817895453175
Toll, 0.03867233333573319
Hospital, 0.10808885165592982
Druck, 0.11396957694584102
Elektronisches Schwarzes Brett, 0.12102514551120924
Schiitische Fraktion, 0.13388425615685776
Philippinisch, 0.134102069272474
Verbinden, 0.13871080016061785
Cannes, 0.1560228702600865
Iseki, 0.16740051927385632
SaaS, 0.1938341440200136
Kaisei Junior und Senior High School, 0.19798593808666984
Museumsmalerei, 0.23079469060502433
Schmetterling, 0.23615273153248512
P5, 0.2795962625371914
AH, 0.2919494095090802

EXILE und Shia sind sich nicht ganz ähnlich. Es ist sehr vernünftig, das so zu denken (???).

Mit dieser Art von Gefühl können Sie es leicht benutzen. Bitte probieren Sie es aus.

Recommended Posts

Holen Sie sich mit fastText auf Facebook eine verteilte Darstellung von Wörtern in Fast
Verwenden wir den verteilten Ausdruck von Wörtern schnell mit fastText!
Ruft eine Liste der Dateien in einem Ordner mit Python ohne Pfad ab
Holen Sie sich die Anzahl der Leser von Artikeln über Mendeley in Python
Rufen Sie mit Python eine Liste der in der aktuellen Umgebung installierten Pakete ab
Holen Sie sich den Aufrufer einer Funktion in Python
Holen Sie sich eine Liste der IAM-Benutzer mit Boto3
Lassen Sie uns einen Teil des maschinellen Lernens mit Python berühren
So erhalten Sie mit Python eine Liste der Dateien im selben Verzeichnis
Hinweis zum Standardverhalten von collate_fn in PyTorch
Holen Sie sich die ID einer GPU mit geringer Speichernutzung
Holen Sie sich UNIXTIME zu Beginn des heutigen Tages mit einem Befehl
Holen Sie sich die Anzahl der spezifischen Elemente in der Python-Liste
Holen Sie sich eine Liste der mit Python + Selen gekauften DMM-E-Books
So erhalten Sie eine Liste der integrierten Ausnahmen für Python
Rufen Sie den Hostnamen des Host-PCs mit Docker unter Linux ab
Ausbeute in einer Klasse, die unittest geerbt hat. TestCase funktionierte nicht mit der Nase (abhängig von der Version der Nase?)
Wie ist der Fortschritt? Lassen Sie uns mit dem Boom in Python weitermachen
Verarbeiten Sie den Inhalt der Datei der Reihe nach mit einem Shell-Skript
Versuchen Sie, die Thread-Liste der Nachrichten (Abneigung) mit Python zu erhalten.
Ich habe ein Skript geschrieben, mit dem Sie mit hoher Geschwindigkeit mit AtCoder beginnen können!
Wenn ich eine Fehlermeldung mit Pylint unter Windows Atom erhalte
Erstellen Sie eine Wortwolke mit nur positiven / negativen Wörtern auf Twitter
Holen Sie sich Daten von VPS MySQL mit Python 3 und SQL Alchemy
Ich habe versucht, das Entwicklungsstartverfahren von Django kurz zusammenzufassen
Rufen Sie die URL des von der Jira-Python-Bibliothek erstellten JIRA-Tickets ab
So ermitteln Sie die Scheitelpunktkoordinaten eines Features in ArcPy
Finden Sie den Rang der Matrix in der XOR-Welt (Rang der Matrix auf F2)
Warum ist der verteilte Ausdruck von Wörtern für die Verarbeitung natürlicher Sprache wichtig?
Erstellen Sie eine Funktion, um den Inhalt der Datenbank in Go abzurufen