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!"
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!
(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.
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.
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.
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
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.
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.
Recommended Posts