2016-11-07 2 views
3
from spacy.en import English 
from numpy import dot 
from numpy.linalg import norm 

parser = English() 

# you can access known words from the parser's vocabulary 
nasa = parser.vocab['NASA'] 

# cosine similarity 
cosine = lambda v1, v2: dot(v1, v2)/(norm(v1) * norm(v2)) 

# gather all known words, take only the lowercased versions 
allWords = list({w for w in parser.vocab if w.has_repvec and w.orth_.islower() and w.lower_ != "nasa"}) 

# sort by similarity to NASA 
allWords.sort(key=lambda w: cosine(w.repvec, nasa.repvec)) 
allWords.reverse() 
print("Top 10 most similar words to NASA:") 
for word in allWords[:10]: 
    print(word.orth_) 

Ich versuche, das obige Beispiel zu laufen, aber ich immer die unten angegebenen Fehler:Wortvektoren Beispiel Ausgabe in spacigen

Traceback (most recent call last): 
File "C:\Users\bulusu.kiran\Documents\WORK\nlp\wordVectors1.py", line 8, in <module> 
nasa = parser.vocab['NASA'] 
File "spacy/vocab.pyx", line 330, in spacy.vocab.Vocab.__getitem__ (spacy/vocab.cpp:7708) 
orth = id_or_string TypeError: an integer is required 

Beispiel entnommen aus: Intro to NLP with spaCy

Was diesen Fehler verursacht?

+0

Großartiges Beispiel, das Sie gepostet haben, wenn sie nur diese Art von Ding in ihrer Dokumentation gehabt hätten. – cardamom

Antwort

6

Welche Version von Python verwenden Sie? Dies könnte das Ergebnis eines Unicode-Fehlers sein. Ich habe es in Python 2.7 von

ersetzt
nasa = parser.vocab['NASA'] 

mit

nasa = parser.vocab[u'NASA'] 

Sie dann diesen Fehler bekommen zu arbeiten:

AttributeError: 'spacy.lexeme.Lexeme' object has no attribute 'has_repvec' 

Es gibt eine similar issue on the SpaCy repo, aber diese können beide fixiert werden durch Ersetzen von has_repvec durch has_vector und repvec durch vector. Ich werde auch diesen GitHub-Thread kommentieren.

Complete, aktualisiert Code, den ich verwendet:

import spacy 

from numpy import dot 
from numpy.linalg import norm 

parser = spacy.load('en') 
nasa = parser.vocab[u'NASA'] 

# cosine similarity 
cosine = lambda v1, v2: dot(v1, v2)/(norm(v1) * norm(v2)) 

# gather all known words, take only the lowercased versions 
allWords = list({w for w in parser.vocab if w.has_vector and w.orth_.islower() and w.lower_ != "nasa"}) 

# sort by similarity to NASA 
allWords.sort(key=lambda w: cosine(w.vector, nasa.vector)) 
allWords.reverse() 
print("Top 10 most similar words to NASA:") 
for word in allWords[:10]: 
    print(word.orth_) 

hoffe, das hilft!

+1

Dank Eric, es funktionierte wie ein Zauber. – phani