Dies ist die Aufzeichnung der 93. "Berechnung der Genauigkeitsrate der Analogie-Aufgabe" von Language Processing 100 Knock 2015. Es ist einfach zu gewinnen, wenn Sie die richtige Antwortrate für das vorherige Klopfergebnis berechnen. Das Ergebnis des selbst erstellten Programms liegt bei etwa 25%, und das Ergebnis bei Verwendung von Gensim beträgt 58%, was einen großen Unterschied darstellt (es gibt einige Zweifel, wie die richtige Antwortrate berechnet werden kann).
Verknüpfung | Bemerkungen |
---|---|
093.Berechnung der Genauigkeitsrate der Analogie-Aufgabe.ipynb | Antwortprogramm GitHub Link |
100 Klicks Amateur-Sprachverarbeitung:93 | Ich bin Ihnen immer mit 100 Sprachverarbeitungsklopfen zu Dank verpflichtet |
Art | Ausführung | Inhalt |
---|---|---|
OS | Ubuntu18.04.01 LTS | Es läuft virtuell |
pyenv | 1.2.15 | Ich benutze pyenv, weil ich manchmal mehrere Python-Umgebungen benutze |
Python | 3.6.9 | python3 auf pyenv.6.Ich benutze 9 3.7 oder 3.Es gibt keinen tiefen Grund, keine 8er-Serie zu verwenden Pakete werden mit venv verwaltet |
In der obigen Umgebung verwende ich die folgenden zusätzlichen Python-Pakete. Einfach mit normalem Pip installieren.
Art | Ausführung |
---|---|
pandas | 0.25.3 |
In Kapitel 10 werden wir weiter daran arbeiten, Wortvektoren aus dem vorherigen Kapitel zu lernen.
Verwenden Sie die in> 92 erstellten Daten, um die richtige Antwortrate für die Analogie-Aufgabe jedes Modells zu finden.
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')
Ich denke, es gibt eine intelligentere Art, es zu schreiben, aber ich konzentriere mich nicht wirklich auf die Zeit. Die Datei wird gelesen und die Genauigkeitsrate berechnet. Ich war mir nicht sicher, was ich mit dem Nenner anfangen sollte, aber wenn ich kein Wort im Korpus finden konnte, schloss ich es vom Nenner aus.
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())
Dies ist das Ergebnis meines eigenen Programms.
<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
Dies ist das Ergebnis bei Verwendung von Gensim. Ich mache mir Sorgen, dass "Verfügbare Datensätze" abnehmen. Sicherlich scheint Gensim eine Logik zu haben, auf die Word2Vec nicht abzielt, wenn es selten vorkommt ...
<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