Il s'agit de l'enregistrement de la 93e "Calcul du taux de précision de la tâche d'analogie" de Traitement du langage 100 knock 2015. Il est facile de gagner simplement en calculant le taux de réponse correct pour le résultat de frappe précédent. Le résultat du programme auto-conçu est d'environ 25% et le résultat lors de l'utilisation de Gensim est de 58%, ce qui est une grande différence (il y a un doute sur la façon de calculer le taux de réponse correct).
Lien | Remarques |
---|---|
093.Calcul du taux de précision de la tâche d'analogie.ipynb | Lien GitHub du programme de réponse |
100 coups de traitement du langage amateur:93 | Je vous suis toujours redevable de 100 coups de traitement linguistique |
type | version | Contenu |
---|---|---|
OS | Ubuntu18.04.01 LTS | Il fonctionne virtuellement |
pyenv | 1.2.15 | J'utilise pyenv car j'utilise parfois plusieurs environnements Python |
Python | 3.6.9 | python3 sur pyenv.6.J'utilise 9 3.7 ou 3.Il n'y a aucune raison profonde de ne pas utiliser la série 8 Les packages sont gérés à l'aide de venv |
Dans l'environnement ci-dessus, j'utilise les packages Python supplémentaires suivants. Installez simplement avec pip ordinaire.
type | version |
---|---|
pandas | 0.25.3 |
Au chapitre 10, nous continuerons à travailler sur l'apprentissage des vecteurs de mots du chapitre précédent.
Utilisez les données créées dans> 92 pour trouver le taux de réponse correct pour la tâche d'analogie de chaque modèle.
import pandas as pd
def calc_accuracy(file):
df = pd.read_table(file, header=None, usecols=[3, 4, 5], names=['word4', 'result', 'similarity'])
print(df.info())
print('Total records:', len(df))
print('Available records:', (df['similarity'] != -1).sum())
print('Correct records:', (df['word4'] == df['result']).sum())
print('Accuracy', (df['word4'] == df['result']).sum() / (df['similarity'] != -1).sum())
calc_accuracy('092.analogy_word2vec_1.txt')
calc_accuracy('092.analogy_word2vec_2.txt')
Je pense qu'il existe une manière plus intelligente de l'écrire, mais je ne me concentre pas vraiment sur le temps. Le fichier est lu et le taux de précision est calculé. Je ne savais pas quoi faire du dénominateur, mais si je ne trouvais pas un mot dans le corpus, je l'excluais du dénominateur.
df = pd.read_table(file, header=None, usecols=[3, 4, 5], names=['word4', 'result', 'similarity'])
print(df.info())
print('Total records:', len(df))
print('Available records:', (df['similarity'] != -1).sum())
print('Correct records:', (df['word4'] == df['result']).sum())
print('Accuracy', (df['word4'] == df['result']).sum() / (df['similarity'] != -1).sum())
C'est le résultat de mon propre programme.
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 506 entries, 0 to 505
Data columns (total 3 columns):
word4 506 non-null object
result 462 non-null object
similarity 504 non-null float64
dtypes: float64(1), object(2)
memory usage: 12.0+ KB
None
Total records: 506
Available records: 462
Correct records: 114
Accuracy 0.24675324675324675
C'est le résultat lors de l'utilisation de Gensim. Je crains que les «enregistrements disponibles» diminuent. Certes Gensim semble avoir la logique que Word2Vec ne cible pas quand il est peu fréquent ...
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 506 entries, 0 to 505
Data columns (total 3 columns):
word4 506 non-null object
result 400 non-null object
similarity 506 non-null float64
dtypes: float64(1), object(2)
memory usage: 12.0+ KB
None
Total records: 506
Available records: 400
Correct records: 231
Accuracy 0.5775