[PYTHON] [Sprachverarbeitung 100 Schläge 2020] Kapitel 7: Wortvektor

Einführung

Die Version 2020 von 100 Klopfen der Sprachverarbeitung, die als Sammlung von Problemen der Verarbeitung natürlicher Sprache bekannt ist, wurde veröffentlicht. Dieser Artikel fasst die Ergebnisse der Lösung von "Kapitel 7: Wortvektoren" aus den folgenden Kapiteln 1 bis 10 zusammen.

Vorbereitungen

Wir verwenden Google Colaboratory für Antworten. Ausführliche Informationen zum Einrichten und Verwenden von Google Colaboratory finden Sie in diesem Artikel. Das Notizbuch mit den Ausführungsergebnissen der folgenden Antworten ist unter [github] verfügbar (https://github.com/hana-mame/nlp100/blob/master/chapter07.ipynb).

Kapitel 7: Wortvektor

Erstellen Sie ein Programm, das die folgende Verarbeitung für einen Wortvektor (Worteinbettung) ausführt, der die Bedeutung eines Wortes als reellen Vektor ausdrückt.

60. Lesen und Anzeigen von Wortvektoren

Laden Sie den gelernten Wortvektor (3 Millionen Wörter / Phrasen, 300 Dimensionen) in den Google News-Datensatz (ca. 100 Milliarden Wörter) herunter und zeigen Sie den Wortvektor von "USA" an. Beachten Sie jedoch, dass "USA" intern als "United_States" bezeichnet wird.

Laden Sie zunächst den angegebenen gelernten Wortvektor herunter.

FILE_ID = "0B7XkCwpI5KDYNlNUTTlSS21pQmM"
FILE_NAME = "GoogleNews-vectors-negative300.bin.gz"
!wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=$FILE_ID' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=$FILE_ID" -O $FILE_NAME && rm -rf /tmp/cookies.txt

Anschließend wird der Wortvektor mit Gensim gelesen, das für verschiedene Aufgaben der Verarbeitung natürlicher Sprache verwendet wird.

from gensim.models import KeyedVectors

model = KeyedVectors.load_word2vec_format('./GoogleNews-vectors-negative300.bin.gz', binary=True)

Nach dem Lesen können Sie leicht einen Wortvektor erhalten, indem Sie das Wort angeben, das Sie vektorisieren möchten.

model['United_States']

Ausgabe


array([-3.61328125e-02, -4.83398438e-02,  2.35351562e-01,  1.74804688e-01,
       -1.46484375e-01, -7.42187500e-02, -1.01562500e-01, -7.71484375e-02,
        1.09375000e-01, -5.71289062e-02, -1.48437500e-01, -6.00585938e-02,
        1.74804688e-01, -7.71484375e-02,  2.58789062e-02, -7.66601562e-02,
       -3.80859375e-02,  1.35742188e-01,  3.75976562e-02, -4.19921875e-02,
・ ・ ・

61. Wortähnlichkeit

Berechnen Sie die Kosinusähnlichkeit zwischen "USA" und "USA".

Hier wird die "Ähnlichkeit" -Methode verwendet. Wenn Sie zwei Wörter angeben, können Sie die Kosinusähnlichkeit zwischen Wörtern berechnen.

model.similarity('United_States', 'U.S.')

Ausgabe


0.73107743

62. 10 Wörter mit hoher Ähnlichkeit

Geben Sie 10 Wörter mit hoher Kosinusähnlichkeit zu "USA" und deren Ähnlichkeit aus.

Hier wird die Methode `most_similar``` verwendet. Wenn Sie ein Wort angeben, können Sie die Top-Ähnlichkeitswörter bis zu `Topn``` und deren Ähnlichkeit erhalten.

model.most_similar('United_States', topn=10)

Ausgabe


[('Unites_States', 0.7877248525619507),
 ('Untied_States', 0.7541370391845703),
 ('United_Sates', 0.74007248878479),
 ('U.S.', 0.7310774326324463),
 ('theUnited_States', 0.6404393911361694),
 ('America', 0.6178410053253174),
 ('UnitedStates', 0.6167312264442444),
 ('Europe', 0.6132988929748535),
 ('countries', 0.6044804453849792),
 ('Canada', 0.6019070148468018)]

63. Analogie durch additive Zusammensetzung

Subtrahieren Sie den Vektor "Madrid" vom Wortvektor "Spanien", berechnen Sie den Vektor durch Addition des Vektors "Athen" und geben Sie 10 Wörter mit hoher Ähnlichkeit zu diesem Vektor und deren Ähnlichkeit aus.

Mit der in der vorherigen Frage verwendeten Methode `most_similar``` können Sie den Additionsvektor bzw. den Subtraktionsvektor angeben und dann Wörter erhalten, die einen hohen Grad an Ähnlichkeit mit dem berechneten Vektor aufweisen. Hier zeigen wir gemäß den Anweisungen in der Problemstellung Wörter an, die dem Vektor von "Spanien" - "Madrid" + "Athen" sehr ähnlich sind Griechenland``` steht an erster Stelle.

vec = model['Spain'] - model['madrid'] + model['Athens'] 
model.most_similar(positive=['Spain', 'Athens'], negative=['Madrid'], topn=10)

Ausgabe


[('Greece', 0.6898481249809265),
 ('Aristeidis_Grigoriadis', 0.5606848001480103),
 ('Ioannis_Drymonakos', 0.5552908778190613),
 ('Greeks', 0.545068621635437),
 ('Ioannis_Christou', 0.5400862693786621),
 ('Hrysopiyi_Devetzi', 0.5248444676399231),
 ('Heraklio', 0.5207759737968445),
 ('Athens_Greece', 0.516880989074707),
 ('Lithuania', 0.5166866183280945),
 ('Iraklion', 0.5146791934967041)]

64. Experimentieren Sie mit Analogiedaten

Laden Sie die Bewertungsdaten der Wortanalogie herunter, berechnen Sie vec (Wort in der zweiten Spalte) --vec (Wort in der ersten Spalte) + vec (Wort in der dritten Spalte) und suchen Sie das Wort mit der höchsten Ähnlichkeit zum Vektor. , Finden Sie die Ähnlichkeit. Fügen Sie das erhaltene Wort und die Ähnlichkeit am Ende jedes Falles hinzu.

Lädt die angegebenen Daten herunter.

!wget http://download.tensorflow.org/data/questions-words.txt
#Überprüfen Sie die ersten 10 Zeilen
!head -10 questions-words.txt

Ausgabe


: capital-common-countries
Athens Greece Baghdad Iraq
Athens Greece Bangkok Thailand
Athens Greece Beijing China
Athens Greece Berlin Germany
Athens Greece Bern Switzerland
Athens Greece Cairo Egypt
Athens Greece Canberra Australia
Athens Greece Hanoi Vietnam
Athens Greece Havana Cuba

Diese Daten umfassen Paare zur Bewertung semantischer Analogien wie (Athen-Griechenland, Tokio-Japan) und Paare zur Bewertung grammatikalischer Analogien wie (Walk-Walks, Write-Writes). Ich werde. Es besteht aus den folgenden 14 Kategorien insgesamt, wobei die Top 5 den ersteren und die anderen den letzteren entsprechen.

No. Kategorie
1 capital-common-countries
2 capital-world
3 currency
4 city-in-state
5 family
6 gram1-adjective-to-adverb
7 gram2-opposite
8 gram3-comparative
9 gram4-superlative
10 gram5-present-participle
11 gram6-nationality-adjective
12 gram7-past-tense
13 gram8-plural
14 gram9-plural-verbs

Es liest zeilenweise, berechnet die Ähnlichkeit mit dem angegebenen Wort und gibt die formatierten Daten aus.

with open('./questions-words.txt', 'r') as f1, open('./questions-words-add.txt', 'w') as f2:
  for line in f1:  #Lesen Sie Zeile für Zeile von f1, fügen Sie das gewünschte Wort und die gewünschte Ähnlichkeit hinzu und schreiben Sie in f2
    line = line.split()
    if line[0] == ':':
      category = line[1]
    else:
      word, cos = model.most_similar(positive=[line[1], line[2]], negative=[line[0]], topn=1)[0]
      f2.write(' '.join([category] + line + [word, str(cos) + '\n']))
!head -10 questions-words-add.txt

Ausgabe


capital-common-countries Athens Greece Baghdad Iraq Iraqi 0.6351870894432068
capital-common-countries Athens Greece Bangkok Thailand Thailand 0.7137669324874878
capital-common-countries Athens Greece Beijing China China 0.7235777974128723
capital-common-countries Athens Greece Berlin Germany Germany 0.6734622120857239
capital-common-countries Athens Greece Bern Switzerland Switzerland 0.4919748306274414
capital-common-countries Athens Greece Cairo Egypt Egypt 0.7527809739112854
capital-common-countries Athens Greece Canberra Australia Australia 0.583732545375824
capital-common-countries Athens Greece Hanoi Vietnam Viet_Nam 0.6276341676712036
capital-common-countries Athens Greece Havana Cuba Cuba 0.6460992097854614
capital-common-countries Athens Greece Helsinki Finland Finland 0.6899983882904053

65. Richtige Antwortrate bei Analogie-Aufgaben

Messen Sie die korrekte Antwortrate der semantischen Analogie und der syntaktischen Analogie anhand der Ausführungsergebnisse von> 64.

Berechnen Sie für jede entsprechende Kategorie.

with open('./questions-words-add.txt', 'r') as f:
  sem_cnt = 0
  sem_cor = 0
  syn_cnt = 0
  syn_cor = 0
  for line in f:
    line = line.split()
    if not line[0].startswith('gram'):
      sem_cnt += 1
      if line[4] == line[5]:
        sem_cor += 1
    else:
      syn_cnt += 1
      if line[4] == line[5]:
        syn_cor += 1

print(f'Semantische Analogie korrekte Antwortrate: {sem_cor/sem_cnt:.3f}')
print(f'Literarische Analogie korrekte Antwortrate: {syn_cor/syn_cnt:.3f}') 

Ausgabe


Semantische Analogie korrekte Antwortrate: 0.731
Literarische Analogie korrekte Antwortrate: 0.740

66. Bewertung durch WordSimilarity-353

Laden Sie die Bewertungsdaten der WordSimilarity-353-Testsammlung herunter und berechnen Sie den Spearman-Korrelationskoeffizienten zwischen der durch Wortvektoren berechneten Rangfolge der Ähnlichkeit und der Rangfolge der Beurteilung der menschlichen Ähnlichkeit.

Diese Daten erhalten eine vom Menschen bewertete Ähnlichkeit mit einem Wortpaar. Berechnen Sie die Ähnlichkeit der Wortvektoren für jedes Paar und den Spearman-Rangkorrelationskoeffizienten für beide.

!wget http://www.gabrilovich.com/resources/data/wordsim353/wordsim353.zip
!unzip wordsim353.zip

Ausgabe


Archive:  wordsim353.zip
  inflating: combined.csv            
  inflating: set1.csv                
  inflating: set2.csv                
  inflating: combined.tab            
  inflating: set1.tab                
  inflating: set2.tab                
  inflating: instructions.txt  
!head -10 './combined.csv'

Ausgabe


Word 1,Word 2,Human (mean)
love,sex,6.77
tiger,cat,7.35
tiger,tiger,10.00
book,paper,7.46
computer,keyboard,7.62
computer,internet,7.58
plane,car,5.77
train,car,6.31
telephone,communication,7.50
ws353 = []
with open('./combined.csv', 'r') as f:
  next(f)
  for line in f:  #Lesen Sie Zeile für Zeile und berechnen Sie den Wortvektor und die Ähnlichkeit
    line = [s.strip() for s in line.split(',')]
    line.append(model.similarity(line[0], line[1]))
    ws353.append(line)

#Bestätigung
for i in range(5):
  print(ws353[i])

Ausgabe


['love', 'sex', '6.77', 0.2639377]
['tiger', 'cat', '7.35', 0.5172962]
['tiger', 'tiger', '10.00', 0.99999994]
['book', 'paper', '7.46', 0.3634626]
['computer', 'keyboard', '7.62', 0.39639163]
import numpy as np
from scipy.stats import spearmanr

#Berechnung des Spearman-Korrelationskoeffizienten
human = np.array(ws353).T[2]
w2v = np.array(ws353).T[3]
correlation, pvalue = spearmanr(human, w2v)

print(f'Spearman-Korrelationskoeffizient: {correlation:.3f}')

Ausgabe


Spearman-Korrelationskoeffizient: 0.685

67. k-bedeutet Clustering

Extrahieren Sie den Wortvektor in Bezug auf den Ländernamen und führen Sie k-means Clustering mit der Anzahl der Cluster k = 5 aus.

Da wir keine geeignete Quelle für die Liste der Ländernamen finden konnten, sammeln wir sie aus den Bewertungsdaten des Wortes Analogie.

#Erwerb des Ländernamens
countries = set()
with open('./questions-words-add.txt') as f:
  for line in f:
    line = line.split()
    if line[0] in ['capital-common-countries', 'capital-world']:
      countries.add(line[2])
    elif line[0] in ['currency', 'gram6-nationality-adjective']:
      countries.add(line[1])
countries = list(countries)

#Holen Sie sich Wortvektor
countries_vec = [model[country] for country in countries]
from sklearn.cluster import KMeans

# k-bedeutet Clustering
kmeans = KMeans(n_clusters=5)
kmeans.fit(countries_vec)
for i in range(5):
    cluster = np.where(kmeans.labels_ == i)[0]
    print('cluster', i)
    print(', '.join([countries[k] for k in cluster]))

Ausgabe


cluster 0
Taiwan, Afghanistan, Iraq, Lebanon, Indonesia, Turkey, Egypt, Libya, Syria, Korea, China, Nepal, Cambodia, India, Bhutan, Qatar, Laos, Malaysia, Iran, Vietnam, Oman, Bahrain, Pakistan, Thailand, Bangladesh, Morocco, Jordan, Israel
cluster 1
Madagascar, Uganda, Botswana, Guinea, Malawi, Tunisia, Nigeria, Mauritania, Kenya, Zambia, Algeria, Mozambique, Ghana, Niger, Somalia, Angola, Mali, Senegal, Sudan, Zimbabwe, Gambia, Eritrea, Liberia, Burundi, Gabon, Rwanda, Namibia
cluster 2
Suriname, Uruguay, Tuvalu, Nicaragua, Colombia, Belize, Venezuela, Ecuador, Fiji, Peru, Guyana, Jamaica, Brazil, Honduras, Samoa, Bahamas, Dominica, Philippines, Cuba, Chile, Mexico, Argentina
cluster 3
Netherlands, Sweden, USA, Ireland, Canada, Spain, Malta, Greenland, Europe, Greece, France, Austria, Norway, Finland, Australia, Japan, Iceland, England, Italy, Denmark, Belgium, Switzerland, Germany, Portugal, Liechtenstein
cluster 4
Croatia, Belarus, Uzbekistan, Latvia, Tajikistan, Slovakia, Ukraine, Hungary, Albania, Poland, Montenegro, Georgia, Russia, Kyrgyzstan, Armenia, Romania, Cyprus, Lithuania, Azerbaijan, Serbia, Slovenia, Turkmenistan, Moldova, Bulgaria, Estonia, Kazakhstan, Macedonia

68. Ward Clustering

Führen Sie hierarchische Cluster nach der Ward-Methode für Wortvektoren aus, die sich auf Ländernamen beziehen. Stellen Sie sich das Clustering-Ergebnis außerdem als Dendrogramm vor.

from matplotlib import pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage

plt.figure(figsize=(15, 5))
Z = linkage(countries_vec, method='ward')
dendrogram(Z, labels=countries)
plt.show()

68.png

69. Visualisierung mit t-SNE

Visualisieren Sie den Vektorraum von Wortvektoren, die sich auf Ländernamen beziehen, mit t-SNE.

Komprimieren Sie den Wortvektor mit t-SNE in zwei Dimensionen und visualisieren Sie ihn in einem Streudiagramm.

!pip install bhtsne
import bhtsne

embedded = bhtsne.tsne(np.array(countries_vec).astype(np.float64), dimensions=2, rand_seed=123)
plt.figure(figsize=(10, 10))
plt.scatter(np.array(embedded).T[0], np.array(embedded).T[1])
for (x, y), name in zip(embedded, countries):
    plt.annotate(name, (x, y))
plt.show()

69.png

abschließend

Sprachverarbeitung 100 Klopfen sind so konzipiert, dass Sie nicht nur die Verarbeitung natürlicher Sprache selbst lernen können, sondern auch die grundlegende Datenverarbeitung und das allgemeine maschinelle Lernen. Sogar diejenigen, die maschinelles Lernen in Online-Kursen studieren, können sehr gute Ergebnisse erzielen. Probieren Sie es also bitte aus.

Zu allen 100 Fragen

Recommended Posts

[Sprachverarbeitung 100 Schläge 2020] Kapitel 7: Wortvektor
100 Sprachverarbeitung Knock 2020 Kapitel 7: Word Vector
100 Sprachverarbeitungsklopfen ~ Kapitel 1
100 Sprachverarbeitung klopft Kapitel 2 (10 ~ 19)
100 Sprachverarbeitungsklopfen 03 ~ 05
100 Sprachverarbeitungsklopfen (2020): 40
100 Sprachverarbeitungsklopfen (2020): 35
[Sprachverarbeitung 100 Schläge 2020] Kapitel 3: Reguläre Ausdrücke
100 Sprachverarbeitungsklopfen (2020): 47
100 Sprachverarbeitungsklopfen (2020): 39
100 Klicks in der Verarbeitung natürlicher Sprache Kapitel 4 Kommentar
[Sprachverarbeitung 100 Schläge 2020] Kapitel 6: Maschinelles Lernen
100 Sprachverarbeitungsklopfen (2020): 22
100 Sprachverarbeitungsklopfen (2020): 26
100 Sprachverarbeitungsklopfen (2020): 34
100 Sprachverarbeitungsklopfen 2020: Kapitel 4 (morphologische Analyse)
[Sprachverarbeitung 100 Schläge 2020] Kapitel 5: Abhängigkeitsanalyse
100 Sprachverarbeitungsklopfen (2020): 42
100 Sprachverarbeitungsklopfen (2020): 29
100 Sprachverarbeitungsklopfen (2020): 49
100 Sprachverarbeitungsklopfen 06 ~ 09
100 Sprachverarbeitungsklopfen (2020): 43
100 Sprachverarbeitungsklopfen (2020): 24
[Sprachverarbeitung 100 Schläge 2020] Kapitel 1: Vorbereitende Bewegung
100 Sprachverarbeitungsklopfen (2020): 45
Sprachverarbeitung 100 knock-86: Wortvektoranzeige
100 Sprachverarbeitungsklopfen (2020): 10-19
100 Sprachverarbeitungsklopfen (2020): 30
100 Sprachverarbeitungsklopfen (2020): 00-09
100 Sprachverarbeitung klopfen 2020: Kapitel 3 (regulärer Ausdruck)
100 Sprachverarbeitungsklopfen (2020): 31
[Sprachverarbeitung 100 Schläge 2020] Kapitel 8: Neuronales Netz
100 Sprachverarbeitungsklopfen (2020): 48
[Sprachverarbeitung 100 Schläge 2020] Kapitel 2: UNIX-Befehle
100 Sprachverarbeitungsklopfen (2020): 44
100 Sprachverarbeitungsklopfen (2020): 41
100 Sprachverarbeitungsklopfen (2020): 37
[Sprachverarbeitung 100 Schläge 2020] Kapitel 9: RNN, CNN
100 Sprachverarbeitungsklopfen (2020): 25
100 Sprachverarbeitungsklopfen (2020): 23
100 Sprachverarbeitungsklopfen (2020): 33
100 Sprachverarbeitungsklopfen (2020): 20
100 Sprachverarbeitungsklopfen (2020): 27
[Sprachverarbeitung 100 Schläge 2020] Kapitel 4: Morphologische Analyse
100 Sprachverarbeitungsklopfen (2020): 46
100 Sprachverarbeitungsklopfen (2020): 21
100 Sprachverarbeitungsklopfen (2020): 36
Sprachverarbeitung 100 Schläge Kapitel 4: Morphologische Analyse 31. Verben
100 Amateur-Sprachverarbeitungsklopfen: 41
100 Amateur-Sprachverarbeitungsklopfen: 71
100 Amateur-Sprachverarbeitungsklopfen: 24
100 Amateur-Sprachverarbeitungsklopfen: 50
100 Amateur-Sprachverarbeitungsklopfen: 70
100 Amateur-Sprachverarbeitungsklopfen: 62
100 Amateur-Sprachverarbeitungsklopfen: 60
100 Amateur-Sprachverarbeitungsklopfen: 92
100 Amateur-Sprachverarbeitungsklopfen: 30
100 Amateur-Sprachverarbeitungsklopfen: 06
100 Amateur-Sprachverarbeitungsklopfen: 84
100 Amateur-Sprachverarbeitungsklopfen: 81
100 Amateur-Sprachverarbeitungsklopfen: 33