[PYTHON] [Für Anfänger] Sprachanalyse mit dem Verarbeitungswerkzeug "GiNZA" (von der morphologischen Analyse bis zur Vektorisierung)

Einführung

Vor kurzem habe ich angefangen, Pythons Sprachverarbeitungstool "GiNZA" zu verwenden. Früher habe ich MeCab verwendet, aber kürzlich habe ich (peinlich) erfahren, dass Python über eine Bibliothek verfügt, die modernste Technologie für maschinelles Lernen enthält. Daher migriere ich derzeit zu GiNZA. Da dies das erste GiNZA ist, habe ich versucht, den Verarbeitungsablauf als Memorandum zusammenzufassen, während ich mich auf verschiedene Standorte bezog. Der Autor ist ein Anfänger in der Analyse natürlicher Sprachen und es gibt viele Teile, die nicht erreicht werden. Wenn Sie also tiefer lernen möchten, lesen Sie bitte die offiziellen Dokumente. Dieser Artikel wurde mit der Hoffnung geschrieben, dass die gleichen Anfänger wie der Autor denken werden: "GiNZA kann das! Lass es uns selbst benutzen!"

Über GiNZA

Wie viele Leute bereits veröffentlicht haben, ist GiNZA eine Bibliothek zur Verarbeitung natürlicher Sprache, die ein Lernmodell der Ergebnisse gemeinsamer Forschung zwischen dem AI-Forschungsinstitut Megagon Labs von Recruit und dem National Institute of Japanese Language verwendet.

Übersicht über "GiNZA" "GiNZA" ist eine japanische Open-Source-Bibliothek zur Verarbeitung natürlicher Sprache mit Funktionen wie einstufiger Einführung, schneller und präziser Analyseverarbeitung und Internationalisierungsunterstützung für wortabhängige Strukturanalyseebenen. "GiNZA" verwendet die Bibliothek zur Verarbeitung natürlicher Sprache "spaCy" (* 5), die die neueste Technologie des maschinellen Lernens als Framework enthält, und enthält außerdem einen Open-Source-Morphologieanalysator "SudachiPy" (* 6). Es ist in die Tokenisierungsverarbeitung integriert und wird für diese verwendet. Das "GiNZA Japanese UD Model" enthält die Ergebnisse gemeinsamer Forschungen zwischen Megagon Labs und dem National Institute of Japanese Language.

Zitiert aus https://www.recruit.co.jp/newsroom/2019/0402_18331.html

Es scheint, dass die Sprachverarbeitungsbibliothek "spaCy" in GiNZA verwendet wird. Wie in hier beschrieben, unterstützt GiNZA jetzt spaCy auf Japanisch. Ich interpretiere es grob als Bibliothek. Zusätzlich wird "Sudachi Py" für die morphologische Analyse verwendet. Viele Leute, die diesen Artikel lesen, werden Japanisch analysieren wollen, daher ist es eine attraktive Bibliothek für Python-Benutzer!

Entwicklungsumgebung

(Ab dem 01.04.2020 ist die neueste Version von GiNZA 2.2.1.)

GiNZA kann mit einem einzigen Pip-Befehl installiert werden.

$ pip install "https://github.com/megagonlabs/ginza/releases/download/latest/ginza-latest.tar.gz"
$ pip install ginza

Sie können es mit installieren! (Ab dem 21. Januar 2020 ist die neueste Version von GiNZA 3.1.1.) Weitere Informationen finden Sie auf der offiziellen Website.

Morphologische Analyse

Führen Sie zunächst eine grundlegende morphologische Analyse durch.

Abhängigkeitsanalyse


import spacy

nlp = spacy.load('ja_ginza')
doc = nlp('Der diesjährige Tierkreis ist Yoko. Ich freue mich auf die Olympischen Spiele in Tokio.')

for sent in doc.sents:
    for token in sent:
        print(token.i, token.orth_, token.lemma_, token.pos_, 
              token.tag_, token.dep_, token.head.i)

Ausgabeergebnis

0 dieses Jahr dieses Jahr NOUN Nomenklatur-Gemeinsame Nomenklatur-Befürworten Sie mögliche nmod 2
1 ADP-Hilfsmittel-Fallassistent Fall 0
2 Zodiac Zodiac NOUN Nomen-Gemeinsame Nomenklatur-Allgemeines nsubj 4
3 ist das ADP-Hilfsmittel-Teilnehmerfall 2
4 庚子 庚子 NOUN Substantiv-Gemeinsame Nomenklatur-Allgemeine Wurzel 4
5 ist das AUX-Hilfsverb aux 4
6. .. PUNCT-Hilfssymbol-Interpunktionszeichen 4
7 Tokio Tokio PROPN Nominal-Proprietäre Nomenklatur-Ortsname-Allgemeine Verbindung 9
8 Olympische Spiele NOUN Nomenklatur-Gemeinsame Nomenklatur-Allgemeine Verbindung 9
9 Spaß Spaß NOUN Nomen-Gemeinsame Nomenklatur-Allgemeine Wurzel 9
10 AUX-Hilfsverb cop 9
11 Nana TEIL Auxiliary-Letzte Hilfe aux 9
12. .. PUNCT-Hilfssymbol-Interpunktionszeichen 9

Es ist gut in morphologische Elemente unterteilt. Von links sehen Sie "Eingabewörter", "Stichwörter (Grundform)", "Teile" und "Details zu Teilen" (Details zu Token finden Sie unter spaCy API). .. GiNZA unterstützt auch die Analyse der Abhängigkeitsstruktur, und die Beziehung zwischen der abhängigen Wortnummer und diesem Wort wird geschätzt (siehe hier für Details zu token.dep_. Siehe / annotation # dependency-parsing)).

Mit GiNZA können Sie auch Abhängigkeiten in einem Diagramm visualisieren. Verwenden Sie "Displacy" zur Visualisierung.

Abhängigkeitsvisualisierung


from spacy import displacy

displacy.serve(doc, style='dep', options={'compact':True})

Nach der Ausführung wird "Serving on http://0.0.0.0:5000 ..." angezeigt. Wenn Sie darauf zugreifen, wird die Abbildung angezeigt.

displacy_tri.png

Ich habe nur MeCab verwendet, daher ist es großartig, die Struktur in einer Zeile zu sehen. Weitere Informationen zu Visualisierungstechniken finden Sie unter spaCy Visualizers.

Textvektorisierung

Es gibt mehrere vorgeschlagene Methoden zum Schätzen von Wortvektoren, aber GiNZA hat bereits Wortvektoren gelernt, auf die mit dem "Token-Vektor-Attribut" verwiesen werden kann.

Wortvektor


doc = nlp('Wenn Sie aufgeben, endet das Spiel dort')
token = doc[4]

print(token)
print(token.vector)
print(token.vector.shape)

Ausführungsergebnis

Spiel
[-1.7299166   1.3438352   0.51212436  0.8338855   0.42193085 -1.4436126
  4.331309   -0.59857213  2.091658    3.1512427  -2.0446565  -0.41324708
 ...
  1.1213776   1.1430703  -1.231743   -2.3723211 ]
(100,)

Die Anzahl der Dimensionen des Wortvektors beträgt 100. Sie können die Kosinusähnlichkeit zwischen Wortvektoren auch mit der Methode "Similarity ()" messen.

similarity


word1 = nlp('Omusubi')
word2 = nlp('Reisbällchen')
word3 = nlp('Curry')

print(word1.similarity(word2))
#0.8016603151410209
print(word1.similarity(word3))
#0.5304326270109458

Die Kosinusähnlichkeit reicht von 0-1 und je näher sie an 1 liegt, desto ähnlicher sind die Wörter. In der Tat sind Reisbällchen näher an Reisbällchen als Curry. Darüber hinaus können Vektorisierung und Kosinusähnlichkeit mit demselben Verfahren für Dokumente anstelle von Wörtern berechnet werden. Der Dokumentvektor scheint den Durchschnitt der Wortvektoren zurückzugeben, aus denen der Satz besteht.

Da wir Wörter und Dokumente als Vektoren ausdrücken konnten, wollen wir sie schließlich im Vektorraum veranschaulichen. Da die Dimension des Vektors 100 Dimensionen beträgt, werden wir ihn diesmal zeichnen, nachdem wir ihn mithilfe der Hauptkomponentenanalyse auf 2 Dimensionen verschoben haben.

plot


import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA

#text2vector
vec1 = nlp('Frohes neues Jahr').vector
vec2 = nlp('Ich habe gestern Kohl gekauft').vector
vec3 = nlp('Lass uns den Film sehen').vector
vec4 = nlp('Ich möchte Curry essen').vector
vec5 = nlp('Ich ging in die Stadt, um einzukaufen').vector
vec6 = nlp('Schokolade habe ich gestern gegessen').vector

#pca
vectors = np.vstack((vec1, vec2, vec3, vec4, vec5, vec6))
pca = PCA(n_components=2).fit(vectors)
trans = pca.fit_transform(vectors)
pc_ratio = pca.explained_variance_ratio_

#plot
plt.figure()
plt.scatter(trans[:,0], trans[:,1])

i = 0
for txt in ['text1','text2','text3','text4','text5','text6']:
    plt.text(trans[i,0]-0.2, trans[i,1]+0.1, txt)
    i += 1

plt.hlines(0, min(trans[:,0]), max(trans[:,0]), linestyle='dashed', linewidth=1)
plt.vlines(0, min(trans[:,1]), max(trans[:,1]), linestyle='dashed', linewidth=1)
plt.xlabel('PC1 ('+str(round(pc_ratio[0]*100,2))+'%)')
plt.ylabel('PC2 ('+str(round(pc_ratio[1]*100,2))+'%)')
plt.tight_layout()
plt.show()

Ausführungsergebnis

PCA.png

Die Informationsmenge ist gesunken, aber ich denke, dies ist leichter zu erkennen, wenn mit einer großen Datenmenge umgegangen wird. Wenn man sich diese Abbildung ansieht, scheint es, dass Text3 und 5 nahe beieinander liegen und Text4 und 6 nahe beieinander liegen. So fühle ich mich mit meiner Haut.

Schließlich

Obwohl ich ein Anfänger in der Verarbeitung natürlicher Sprache war, konnte ich mit GiNZA alles von der morphologischen Analyse bis zur Vektorisierung leicht analysieren. Empfohlen für diejenigen, die ab sofort mit der Sprachverarbeitung beginnen möchten. Ich würde mich freuen, wenn Sie auf Fehler oder seltsame Ausdrücke hinweisen könnten.

Referenzseite

Recommended Posts

[Für Anfänger] Sprachanalyse mit dem Verarbeitungswerkzeug "GiNZA" (von der morphologischen Analyse bis zur Vektorisierung)
Verarbeitung natürlicher Sprache 1 Morphologische Analyse
Die erste künstliche Intelligenz. Ich wollte die Verarbeitung natürlicher Sprache ausprobieren, daher werde ich die morphologische Analyse mit MeCab mit Python3 versuchen.
Verwenden Sie die Swagger-Benutzeroberfläche. Wenn Sie einen Swagger-UI-ähnlichen Stil wünschen, kopieren Sie einfach die gesamte Datei unter / dist unter https://github.com/swagger-api/swagger-ui. Danach schreiben Sie einfach hier in index.html die URL der yml-Datei um. Wenn Sie der Meinung sind, dass Sie @ApiModel oder @ApiModelProperty nicht finden können, wurden übrigens anscheinend alle Anmerkungen zur Schemadefinition in @Schema integriert. Emotionsanalyse mit Java, Swagger, OpenAPI, Micronaut Natural Language Processing! Ich habe versucht, die Bewertung anhand des Überprüfungstextes vorherzusagen
Von der Vorbereitung der morphologischen Analyse mit Python unter Verwendung von Polyglot bis zur Teilwortmarkierung
Lassen Sie die COTOHA-API die schwierigen Dinge tun - Einführung in das "Lernen mit" der Verarbeitung natürlicher Sprache -
Ich habe versucht, mit der Bibliothek GiNZA zur Verarbeitung natürlicher Sprache eindeutige Ausdrücke zu extrahieren
100 natürliche Sprachverarbeitung klopft Kapitel 4 Morphologische Analyse (erste Hälfte)
100 Sprachverarbeitung Knock-30 (unter Verwendung von Pandas): Lesen der Ergebnisse der morphologischen Analyse
■ [Google Colaboratory] Vorverarbeitung der Verarbeitung natürlicher Sprache & Janome
Versuchen Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" - Kapitel 2 Schritt 03 Memo "Morphologische Analyse und schriftliches Schreiben"
Japanische Verarbeitung natürlicher Sprache mit Python3 (4) Emotionsanalyse durch logistische Regression
100 Sprachverarbeitungsklopfen 2020: Kapitel 4 (morphologische Analyse)
100 Sprachverarbeitung Knock Kapitel 4: Morphologische Analyse
Dockerfile mit den notwendigen Bibliotheken für die Verarbeitung natürlicher Sprache mit Python
Lose Artikel für diejenigen, die mit der Verarbeitung natürlicher Sprache beginnen möchten
Von der Einführung von JUMAN ++ bis zur morphologischen Analyse von Japanisch mit Python
Vorbereitung zum Starten der Verarbeitung natürlicher Sprache
[Sprachverarbeitung 100 Schläge 2020] Kapitel 4: Morphologische Analyse
100 Language Processing Knock 2015 Kapitel 4 Morphologische Analyse (30-39)
Von der Einführung der GoogleCloudPlatform Natural Language API bis zur Verwendung
Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden 9 Verwendung aus der C-Sprache
Sprachverarbeitung 100 Schläge Kapitel 4: Morphologische Analyse 31. Verben
Für diejenigen, die eine Verarbeitung in natürlicher Sprache mit dem Wissen von WikiPedia durchführen möchten, das über den einfachen Keyword-Abgleich hinausgeht
3. Verarbeitung natürlicher Sprache durch Python 3-1. Wichtiges Tool zur Wortextraktion TF-IDF-Analyse [Originaldefinition]
Der schnellste Weg für Anfänger, um Python zu beherrschen
Verwendung von Datenanalysetools für Anfänger
100 Sprachverarbeitung klopft Morphologische Analyse in Kapitel 4 gelernt
[Für Anfänger] Einführung in die Vektorisierung beim maschinellen Lernen
Installation des Werkzeugs für die morphologische Analyse (MeCab, Human ++, Janome, GiNZA)
[Für Anfänger] Anzeigen von Karten und Suchfeldern mithilfe der GoogleMap Javascript-API
Ich habe versucht zu überprüfen, ob die Natural Language API (Emotionsanalyse) Net Slang unterstützt.
Richten Sie eine Entwicklungsumgebung für die Verarbeitung natürlicher Sprache ein
[Für Anfänger] So studieren Sie den Python3-Datenanalysetest
Modell unter Verwendung eines Faltungsnetzwerks in der Verarbeitung natürlicher Sprache
Erstellen einer Umgebung für die Verarbeitung natürlicher Sprache mit Python
Deep Learning 2 von Grund auf 1.3 Verarbeitung natürlicher Sprache 1.3 Zusammenfassung
Vergleichen Sie, wie die Verarbeitung für Listen nach Sprache geschrieben wird
100 natürliche Sprachverarbeitung klopft Kapitel 5 Abhängigkeitsanalyse (zweite Hälfte)
Ich habe versucht, die Sprache mit CNN + Melspectogram zu identifizieren
100 natürliche Sprachverarbeitung klopft Kapitel 5 Abhängigkeitsanalyse (erste Hälfte)
[Verarbeitung natürlicher Sprache] Ich habe diese Woche versucht, die aktuellen Themen in der Slack-Community zu visualisieren
Senden Sie mithilfe von Google Cloud Messaging für Chrome eine Nachricht vom Server an die Chrome-Erweiterung
[Verarbeitung natürlicher Sprache] Ich habe versucht, die Bemerkungen jedes Mitglieds in der Slack-Community zu visualisieren
Extrahieren von Artikeln aus ACL2020, einer internationalen Konferenz zur Verarbeitung natürlicher Sprache, mithilfe der arXiv-API von Python
Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden 8 Verarbeitungszeitmessung und Profiler