Es ist ein Herausforderungsrekord von 100 Language Processing Knock 2015. Die Umgebung ist Ubuntu 16.04 LTS + Python 3.5.2 : : Anaconda 4.1.1 (64-Bit). Klicken Sie hier, um eine Liste der vergangenen Schläge anzuzeigen (http://qiita.com/segavvy/items/fb50ba8097d59475f760).
In Kapitel 10 werden wir weiter daran arbeiten, Wortvektoren aus dem vorherigen Kapitel zu lernen.
Verwenden Sie die in> 94 erstellten Daten, um den Spearman-Korrelationskoeffizienten zwischen der von jedem Modell ausgegebenen Ähnlichkeitsrangfolge und der Rangfolge der Beurteilung der menschlichen Ähnlichkeit zu berechnen.
main.py
# coding: utf-8
import numpy as np
fname_input = 'combined_out.tab'
with open(fname_input, 'rt') as data_file:
#Sequenzerstellung von Ähnlichkeit
human_score = []
my_score = []
N = 0
for line in data_file:
cols = line.split('\t')
human_score.append(float(cols[2]))
my_score.append(float(cols[3]))
N += 1
#Sortieren
human_index_sorted = np.argsort(human_score)
my_index_sorted = np.argsort(my_score)
#Rangordnung
human_order = [0] * N
my_order = [0] * N
for i in range(N):
human_order[human_index_sorted[i]] = i
my_order[my_index_sorted[i]] = i
#Berechnung des Spearman-Korrelationskoeffizienten
total = 0
for i in range(N):
total += pow(human_order[i] - my_order[i], 2)
result = 1 - (6 * total) / (pow(N, 3) - N)
print(result)
Ergebnisse für den Wortvektor in Frage 85
0.22645511508225769
Ergebnisse für Frage 90 Wortvektor
0.5013384068756902
Der Spearman-Korrelationskoeffizient ist ein Wert, der angibt, wie stark eine Korrelation zwischen zwei Rangfolgen wie dieser besteht. Die Details werden viel herauskommen, wenn Sie mit "Spearmans Rangkorrelationskoeffizient" googeln, also werde ich es weglassen, aber Sie können es mit der folgenden Formel finden.
Dabei ist $ D $ die Differenz zwischen den beiden Rangfolgen für jedes Datenelement und $ N $ die Anzahl der Datenelemente. Das Maximum ist 1 und je größer der Wert, desto korrelierter. In diesem Problem ist die Rangfolge dem menschlichen Urteil umso näher, je größer der Wert ist.
Um $ D $ zu finden, zuerst für jede Zeile von "kombinierter_out.tab", die in Problem 94 erstellt wurde, die Rangfolge in menschlicher Ähnlichkeit und Sie müssen den Rang im Wortvektor finden. Wenn Sie einfach sortieren, kennen Sie die ursprüngliche Zeile nicht und können den Rangunterschied nicht finden. Deshalb habe ich sie in Problem 75 Numpy. Suchen Sie den sortierten Index mit argsort ()
und erstellen Sie damit einen neuen Index. Ich habe versucht, für jede Zeile eine Reihe von Rängen zu erstellen.
Das Ergebnis ist ein überwältigender Sieg für word2vec. word2vec ist unglaublich.
main2.py (Version von Shiracamus empfohlen)
# coding: utf-8
fname_input = 'combined_out.tab'
class Data:
def __init__(self, human_score, my_score):
self.human_score = human_score
self.my_score = my_score
def __repr__(self):
return 'Data%s' % repr(self.__dict__)
#Datenarray-Erstellung
with open(fname_input) as data_file:
def read_data():
for line in data_file:
word1, word2, human_score, my_score = line.split('\t')
yield Data(float(human_score), float(my_score))
data = list(read_data())
#Rangfolge
data_sorted_by_human_score = sorted(data, key=lambda data: data.human_score)
for order, d in enumerate(data_sorted_by_human_score):
d.human_order = order
data_sorted_by_my_score = sorted(data, key=lambda data: data.my_score)
for order, d in enumerate(data_sorted_by_my_score):
d.my_order = order
#Berechnung des Spearman-Korrelationskoeffizienten
N = len(data)
total = sum((d.human_order - d.my_order) ** 2 for d in data)
result = 1 - (6 * total) / (N ** 3 - N)
print(result)
Das ist alles für den 96. Schlag. Wenn Sie Fehler haben, würde ich mich freuen, wenn Sie darauf hinweisen könnten.
Recommended Posts