[PYTHON] 100 coups de traitement du langage amateur: 95

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).

Chapitre 10: Méthode de l'espace vectoriel (II)

Dans le chapitre 10, nous continuerons à travailler sur l'apprentissage des vecteurs de mots du chapitre précédent.

95. Évaluation par WordSimilarity-353

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.

Le code fini:

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ésultat de l'exécution:

Résultats pour le vecteur de mots dans Problème 85

Résultats pour le mot vecteur en question 85


0.22645511508225769
Résultats pour le vecteur de mots dans Problème 90

Résultats pour la question 90 mot vecteur


0.5013384068756902

Coefficient de corrélation de rang de Spearman

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.

\rho = 1 - \frac{6 \sum D^2}{N^3 - N}

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

100 coups de traitement du langage amateur: 41
100 coups de traitement du langage amateur: 71
100 coups de traitement du langage amateur: 56
100 coups de traitement du langage amateur: 50
100 coups de traitement du langage amateur: 59
100 coups de traitement du langage amateur: 70
100 coups de traitement du langage amateur: 62
100 coups de traitement du langage amateur: 60
100 coups de langue amateur: 30
100 coups de langue amateur: 06
100 coups de traitement du langage amateur: 84
100 coups de traitement du langage amateur: 81
100 coups de langue amateur: 33
100 coups de traitement du langage amateur: 46
100 coups de traitement du langage amateur: 88
100 coups de traitement du langage amateur: 89
100 coups de traitement du langage amateur: 40
100 coups de traitement du langage amateur: 45
100 coups de traitement du langage amateur: 43
100 coups de traitement du langage amateur: 55
100 coups de traitement du langage amateur: 22
100 coups de traitement du langage amateur: 61
100 coups de traitement du langage amateur: 94
100 coups de traitement du langage amateur: 54
100 coups de langue amateur: 04
100 coups de traitement du langage amateur: 63
100 coups de traitement du langage amateur: 78
100 coups de traitement du langage amateur: 12
100 coups de traitement du langage amateur: 14
100 coups de langue amateur: 08
100 coups de traitement du langage amateur: 42
100 coups de traitement du langage amateur: 19
100 coups de traitement du langage amateur: 73
100 coups de traitement du langage amateur: 75
100 coups de traitement du langage amateur: 98
100 coups de traitement du langage amateur: 95
100 coups de traitement du langage amateur: 32
100 coups de traitement du langage amateur: 96
100 coups de traitement du langage amateur: 87
100 coups de traitement du langage amateur: 72
100 coups de traitement du langage amateur: 79
100 coups de traitement du langage amateur: 23
100 coups de langue amateur: 05
100 coups de langue amateur: 00
100 coups de langue amateur: 02
100 coups de traitement du langage amateur: 37
100 coups de traitement du langage amateur: 21
100 coups de traitement du langage amateur: 68
100 coups de traitement du langage amateur: 11
100 coups de traitement du langage amateur: 90
100 coups de traitement du langage amateur: 74
100 coups de traitement du langage amateur: 66
100 coups de traitement du langage amateur: 28
100 coups de traitement du langage amateur: 64
100 coups de traitement du langage amateur: 34
100 coups de traitement du langage amateur: 36
100 coups de traitement du langage amateur: 77
100 coups de langue amateur: 01
100 coups de traitement du langage amateur: 16
100 coups de traitement du langage amateur: 27
100 coups de traitement du langage amateur: 10