C'est un record de défi de 100 langues de traitement knock 2015. L'environnement est Ubuntu 16.04 LTS + Python 3.5.2 : : Anaconda 4.1.1 (64 bits). Cliquez ici pour une liste des coups passés (http://qiita.com/segavvy/items/fb50ba8097d59475f760).
Dans le chapitre 10, nous continuerons à travailler sur l'apprentissage des vecteurs de mots du chapitre précédent.
Utilisez les données créées en> 94 pour calculer le coefficient de corrélation de Spearman entre la sortie de classement de similarité de chaque modèle et le classement de jugement de similarité humaine.
main.py
# coding: utf-8
import numpy as np
fname_input = 'combined_out.tab'
with open(fname_input, 'rt') as data_file:
#Création de séquence de similitude
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
#Trier
human_index_sorted = np.argsort(human_score)
my_index_sorted = np.argsort(my_score)
#Disposition des grades
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
#Calcul du coefficient de corrélation de Spearman
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)
Résultats pour le mot vecteur en question 85
0.22645511508225769
Résultats pour la question 90 mot vecteur
0.5013384068756902
Le coefficient de corrélation de Spearman est une valeur qui indique à quel point il existe une corrélation entre deux classements comme celui-ci. Les détails sortiront beaucoup si vous recherchez sur Google avec le "coefficient de corrélation de rang de Spearman", donc je vais l'omettre, mais vous pouvez le trouver avec la formule suivante.
Où $ D $ est la différence entre les deux classements pour chaque élément de données, et $ N $ est le nombre d'éléments de données. Le maximum est 1, et plus la valeur est élevée, plus il y a de corrélation. Dans ce problème, plus la valeur est élevée, plus le classement est proche du jugement humain.
Pour trouver $ D $, d'abord pour chaque ligne de "shared_out.tab" créée dans Problème 94, le classement en similitude humaine et Vous devez trouver le rang dans le mot vecteur. Si vous triez simplement, vous ne connaîtrez pas la ligne d'origine et vous ne pourrez pas trouver la différence de classement, je l'ai donc utilisée dans Problème 75 Numpy. Trouvez l'index trié avec argsort ()
et utilisez-le pour créer un nouvel index. J'ai essayé de créer un tableau de rangs pour chaque ligne.
Le résultat est une victoire écrasante pour word2vec. word2vec est incroyable.
main2.py (version conseillée par shiracamus)
# 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__)
#Création d'un tableau de données
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())
#Classement
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
#Calcul du coefficient de corrélation de Spearman
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)
C'est tout pour le 96e coup. Si vous avez des erreurs, j'apprécierais que vous les signaliez.
Recommended Posts