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.
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).
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.
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,
・ ・ ・
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
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)]
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)]
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
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
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
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
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()
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()
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.
Recommended Posts