[PYTHON] 100 Sprachverarbeitung Knock-92 (mit Gensim): Anwendung auf Analogiedaten

Dies ist die Aufzeichnung der 92. "Anwendung auf Analogiedaten" von Language Processing 100 Knock 2015. Die Wortvektorberechnung und das Extrahieren ähnlicher Wörter werden auf zwei Arten durchgeführt: unter Verwendung der in Kapitel 9 handgefertigten Wortvektordaten im Numpy-Format und unter Verwendung von "Gensim". Sie können die Wunderbarkeit von "Gensim" wie die Geschwindigkeit der Berechnung spüren.

Referenzlink

Verknüpfung Bemerkungen
092.Anwendung auf Analogiedaten_1.ipynb AntwortprogrammGitHubLink(selbstgemacht)
092.Anwendung auf Analogiedaten_2.ipynb AntwortprogrammGitHubLink(Gensim-Version)
100 Klicks Amateur-Sprachverarbeitung:92 Ich bin Ihnen immer mit 100 Sprachverarbeitungsklopfen zu Dank verpflichtet

Umgebung

Art Ausführung Inhalt
OS Ubuntu18.04.01 LTS Es läuft virtuell
pyenv 1.2.15 Ich benutze pyenv, weil ich manchmal mehrere Python-Umgebungen benutze
Python 3.6.9 python3 auf pyenv.6.Ich benutze 9
3.7 oder 3.Es gibt keinen tiefen Grund, keine 8er-Serie zu verwenden
Pakete werden mit venv verwaltet

In der obigen Umgebung verwende ich die folgenden zusätzlichen Python-Pakete. Einfach mit normalem Pip installieren.

Art Ausführung
gensim 3.8.1
numpy 1.17.4
pandas 0.25.3

Aufgabe

Kapitel 10: Vektorraummethode (II)

In Kapitel 10 werden wir weiter daran arbeiten, Wortvektoren aus dem vorherigen Kapitel zu lernen.

92. Anwendung auf Analogiedaten

Für jeden Fall der in> 91 erstellten Bewertungsdaten wird vec (Wort in der zweiten Spalte) --vec (Wort in der ersten Spalte) + vec (Wort in der dritten Spalte) berechnet, und der Vektor und die Ähnlichkeit sind Finden Sie das höchste Wort und seine Ähnlichkeit. Fügen Sie das erhaltene Wort und die Ähnlichkeit am Ende jedes Falles hinzu. Wenden Sie dieses Programm auf den in 85 erstellten Wortvektor und den in 90 erstellten Wortvektor an.

Antworten

Selbst erstelltes Antwortprogramm [092. Anwendung auf Analogie data_1.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/10.%E3%83%99%E3%82%AF%E3% 83% 88% E3% 83% AB% E7% A9% BA% E9% 96% 93% E6% B3% 95% 20 (II) /092.%E3%82%A2%E3%83%8A%E3% 83% AD% E3% 82% B8% E3% 83% BC% E3% 83% 87% E3% 83% BC% E3% 82% BF% E3% 81% B8% E3% 81% AE% E9% 81% A9% E7% 94% A8_1.ipynb)

import csv

import numpy as np
import pandas as pd

#Ich habe beim Speichern keine Argumente angegeben'arr_0'Gespeichert in
matrix_x300 = np.load('./../09.Vektorraummethode(I)/085.matrix_x300.npz')['arr_0']

print('matrix_x300 Shape:', matrix_x300.shape)

group_t = pd.read_pickle('./../09.Vektorraummethode(I)/083_group_t.zip')

#Berechnung der Kosinusähnlichkeit
def get_cos_similarity(v1, v1_norm, v2):
    
    #Wenn der Vektor alle Null ist-Rückgabe 1
    if np.count_nonzero(v2) == 0:
        return -1
    else:
        return np.dot(v1, v2) / (v1_norm * np.linalg.norm(v2))

#Holen Sie sich Wörter mit hoher Ähnlichkeit
def get_similar_word(cols):
    
    try:        
        vec = matrix_x300[group_t.index.get_loc(cols[1])] \
              - matrix_x300[group_t.index.get_loc(cols[0])] \
              + matrix_x300[group_t.index.get_loc(cols[2])]
        vec_norm = np.linalg.norm(vec)
        
        #Schließen Sie Ihre eigenen 3 Wörter aus, die bei der Berechnung verwendet wurden
        cos_sim = [-1 if group_t.index[i] in cols[:3] else get_cos_similarity(vec, vec_norm, matrix_x300[i]) for i in range(len(group_t))]
        index = np.argmax(cos_sim)
        
        cols.extend([group_t.index[index], cos_sim[index]])
        
    except KeyError:
        cols.extend(['', -1])
    return cols

#Bewertungsdaten lesen
with open('./091.analogy_family.txt') as file_in:
    result = [get_similar_word(line.split()) for line in file_in]

with open('092.analogy_word2vec_1.txt', 'w') as file_out:
    writer = csv.writer(file_out, delimiter='\t', lineterminator='\n')
    writer.writerows(result)

Kommentar beantworten

Ich bekomme hier ähnliche Worte. Ich habe es nicht in die Frage geschrieben, aber ich versuche, die in der Berechnung verwendeten Wörter auszuschließen. Ich weiß nicht, ob dies in Ordnung ist, aber wenn ich es ausschließe, erhöht sich der Prozentsatz der richtigen Antworten.

cos_sim = [-1 if group_t.index[i] in cols[:3] else get_cos_similarity(vec, vec_norm, matrix_x300[i]) for i in range(len(group_t))]

Wörter, die nicht auf dem Korpus stehen, haben eine Ähnlichkeit von -1.

except KeyError:
    cols.extend(['', -1])

Danach gibt es viele Inhalte, die bisher durch Klopfen geschrieben wurden, und es gibt nicht viel Besonderes im Code, und es gibt keine besondere Erklärung. Es dauert ungefähr 17 Minuten, um es gelinde auszudrücken, also habe ich versucht, so viel wie möglich in die Listeneinschlussnotation zu schreiben. Wenn Sie die ersten 10 Zeilen des Inhalts der Ausgabedatei löschen, sieht es so aus. Es kann übereinstimmen oder nicht.

csv:091.analogy_family.txt


boy	girl	brother	sister	son	0.8804225566858075
boy	girl	brothers	sisters	sisters	0.8426790631091488
boy	girl	dad	mom	mum	0.8922065515297802
boy	girl	father	mother	mother	0.847494164274725
boy	girl	grandfather	grandmother	grandmother	0.820584129035444
boy	girl	grandpa	grandma		-1
boy	girl	grandson	granddaughter	grandfather	0.6794604718339272
boy	girl	groom	bride	seduce	0.5951703092628703
boy	girl	he	she	she	0.8144501058726975
boy	girl	his	her	Mihailov	0.5752869854520882
Unterlassung

Antwortprogramm für die Verwendung von Gensim [092. Anwendung auf Analogie data_2.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/10.%E3%83%99%E3%82%AF%E3 % 83% 88% E3% 83% AB% E7% A9% BA% E9% 96% 93% E6% B3% 95% 20 (II) /092.%E3%82%A2%E3%83%8A%E3 % 83% AD% E3% 82% B8% E3% 83% BC% E3% 83% 87% E3% 83% BC% E3% 82% BF% E3% 81% B8% E3% 81% AE% E9% 81 % A9% E7% 94% A8_2.ipynb)

import csv

from gensim.models import Word2Vec

model = Word2Vec.load('./090.word2vec.model')

print(model)

#Holen Sie sich Wörter mit hoher Ähnlichkeit
def get_similar_word(cols):
    try:
        cos_sim = model.wv.most_similar(positive=[cols[1], cols[2]], negative=[cols[0]], topn=4)       
        for word, similarity in cos_sim:
            
            #Schließen Sie die 3 in der Berechnung verwendeten Wörter aus
            if word not in cols[:2]:
                cols.extend([word, similarity])
                break
                
    #Für Wörter, die nicht im ursprünglichen Korpus enthalten sind
    except KeyError:
        cols.extend(['', -1])
    
    return cols

#Bewertungsdaten lesen
with open('./091.analogy_family.txt') as file_in:
    result = [get_similar_word(line.split()) for line in file_in]

with open('./092.analogy_word2vec_2.txt', 'w') as file_out:
    writer = csv.writer(file_out, delimiter='\t', lineterminator='\n')
    writer.writerows(result)

Kommentar beantworten

Es ist etwas schlanker als die selbst erstellte Version, da es mit einem Paket erstellt wird. Und wie Sie sehen können, wenn Sie es ausführen, ist der Prozess schnell! Es dauert ungefähr 4 Sekunden und ist ** mehr als 200 Mal schneller als die selbst erstellte Version **. Gensim ist unglaublich. Dies ist das Ausgabeergebnis. ** Der Prozentsatz der richtigen Antworten steigt ebenfalls. ** ** **

csv:092.analogy_word2vec_2.txt


boy	girl	brother	sister	sister	0.745887041091919
boy	girl	brothers	sisters	sisters	0.8522343039512634
boy	girl	dad	mom	mum	0.7720432281494141
boy	girl	father	mother	mother	0.8608728647232056
boy	girl	grandfather	grandmother	granddaughter	0.8341050148010254
boy	girl	grandpa	grandma		-1
boy	girl	grandson	granddaughter	granddaughter	0.8497666120529175
boy	girl	groom	bride	bride	0.7476662397384644
boy	girl	he	she	she	0.7702984809875488
boy	girl	his	her	her	0.6540039777755737

Recommended Posts

100 Sprachverarbeitung Knock-92 (mit Gensim): Anwendung auf Analogiedaten
100 Sprachverarbeitung Knock-91: Vorbereitung von Analogiedaten
100 Sprachverarbeitung Knock-90 (mit Gensim): Lernen mit word2vec
100 Sprachverarbeitung Knock-20 (unter Verwendung von Pandas): Lesen von JSON-Daten
100 Sprachverarbeitung Knock-94 (mit Gensim): Ähnlichkeitsberechnung mit WordSimilarity-353
100 Sprachverarbeitung Knock-76 (mit Scicit-Learn): Beschriftung
Sprachverarbeitung 100 Knocks-31 (mit Pandas): Verben
100 Sprachverarbeitung Knock-73 (mit Scikit-Learn): Lernen
100 Sprachverarbeitung Knock-74 (mit Scicit-Learn): Vorhersage
100 Sprachverarbeitung Knock-38 (mit Pandas): Histogramm
Knock-70 mit 100 Sprachverarbeitung (unter Verwendung von Stanford NLP): Abrufen und Formatieren von Daten
100 Sprachverarbeitung Knock-97 (mit Scicit-Learn): k-bedeutet Clustering
100 Sprachverarbeitung Knock-33 (mit Pandas): Sahen Nomen
100 Sprachverarbeitung Knock-89: Analogie mit additiver Konstitutivität
100 Sprachverarbeitungsklopfen (2020): 28
100 Sprachverarbeitung Knock-71 (mit Stanford NLP): Stoppwort
100 Sprachverarbeitung Knock-96 (unter Verwendung von Gensim): Extraktion des Vektors in Bezug auf den Ländernamen
100 Sprachverarbeitung Knock-35 (mit Pandas): Nomenklatur
100 Sprachverarbeitungsklopfen (2020): 38
100 Sprachverarbeitung klopfen 00 ~ 02
100 Sprachverarbeitung Knock-39 (mit Pandas): Zipf-Gesetz
100 Sprachverarbeitung Knock-34 (mit Pandas): "B von A"
100 Sprachverarbeitung Knock-93 (unter Verwendung von Pandas): Berechnung der Genauigkeitsrate der Analogie-Aufgabe
Python unerfahrene Person versucht, 100 Sprachverarbeitung 14-16 zu klopfen
100-Sprach-Verarbeitung Knock-79 (mit Scikit-Learn): Präzisions-Recall-Grafikzeichnung
100 Sprachverarbeitung Knock-32 (mit Pandas): Prototyp des Verbs
100-Sprach-Verarbeitung Knock-98 (unter Verwendung von Pandas): Clustering nach Ward-Methode
Vorbereitung zum Versuch "Data Science 100 Knock (Strukturierte Datenverarbeitung)"
Python unerfahrene Person versucht, 100 Sprachverarbeitung 07-09 zu klopfen
100 Sprachverarbeitung Knock-75 (mit Scicit-Learn): Gewicht der Identität
Python unerfahrene Person versucht, 100 Sprachverarbeitung 10 ~ 13 zu klopfen
100 Sprachverarbeitung Knock-99 (mit Pandas): Visualisierung durch t-SNE
100 Sprachverarbeitung Knock-95 (mit Pandas): Bewertung mit WordSimilarity-353
Python unerfahrene Person versucht, 100 Sprachverarbeitung 05-06 zu klopfen
100 Sprachverarbeitung Knock-72 (unter Verwendung von Stanford NLP): Identitätsextraktion
Python unerfahrene Person versucht, 100 Sprachverarbeitung 00-04 zu klopfen
100 Sprachverarbeitung klopfen 2020 [00 ~ 39 Antwort]
100 Sprachverarbeitung klopfen 2020 [00-79 Antwort]
100 Sprachverarbeitung klopfen 2020 [00 ~ 69 Antwort]
100 Sprachverarbeitung Knock 2020 Kapitel 1
100 Amateur-Sprachverarbeitungsklopfen: 17
100 Sprachverarbeitung klopfen 2020 [00 ~ 49 Antwort]
100 Sprachverarbeitung Knock-52: Stemming
100 Sprachverarbeitung Knock Kapitel 1
100 Amateur-Sprachverarbeitungsklopfen: 07
100 Sprachverarbeitung Knock 2020 Kapitel 3
100 Sprachverarbeitung Knock 2020 Kapitel 2
100 Amateur-Sprachverarbeitungsklopfen: 09
100 Amateur-Sprachverarbeitungsklopfen: 47
100 Sprachverarbeitung Knock-53: Tokenisierung
100 Amateur-Sprachverarbeitungsklopfen: 97
100 Sprachverarbeitung klopfen 2020 [00 ~ 59 Antwort]
100 Amateur-Sprachverarbeitungsklopfen: 67
100 Sprachverarbeitung Knock-36 (unter Verwendung von Pandas): Häufigkeit des Auftretens von Wörtern
100 Sprachverarbeitung Knock: Kapitel 2 UNIX-Befehlsgrundlagen (mit Pandas)
100 Sprachverarbeitung Knock-83 (mit Pandas): Messung der Wort- / Kontexthäufigkeit
100 Sprachverarbeitung Knock-30 (unter Verwendung von Pandas): Lesen der Ergebnisse der morphologischen Analyse
100 Sprachverarbeitungsklopfen mit Python 2015
100 Sprachverarbeitung Knock-51: Wortausschnitt
100 Sprachverarbeitung Knock-58: Extraktion von Taple
100 Sprachverarbeitung Knock-57: Abhängigkeitsanalyse