2016-12-11 5 views
2

Der folgende Code verwendet spaCy word vectors, um die 20 am ähnlichsten Wörter zu einem bestimmten Wort zu finden, indem zuerst Kosinusähnlichkeit für alle Wörter im Vokabular berechnet wird (mehr als eine Million) und dann diese Liste der ähnlichsten Wörter sortiert wird.Kann ich das Vokabular eines Parsers in SpaCy löschen?

parser = English() 

# access known words from the parser's vocabulary 
current_word = parser.vocab[word] 

# 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_ != word}) 

# sort by similarity 
allWords.sort(key=lambda w: cosine(w.vector, current_word.vector)) 
allWords.reverse() 

print("Top 20 most similar words to %s:") % word 
for word in allWords[:20]: 
    print(word.orth_) 

Was würde ich gerne wissen, ob es ist ein Weg, Spacy Vokabular nur auf die Worte zu beschränken, die in einer vorgegebenen Liste auftreten, was ich hoffe, würde enorm die Kosten für den Sortiervorgang reduzieren.

Um klar zu sein, würde ich gerne eine Liste von nur ein paar Wörtern oder nur die Wörter in einem gegebenen Text übergeben, und in der Lage sein, schnell zu suchen, welche dieser Wörter in SpaCy's Vektorraum am nächsten sind .

Jede Hilfe an dieser Front geschätzt.

Antwort

1

Die Spacy Dokumentation sagt, dass:

Die Standard-Englisch Modellvektoren für eine Million Vokabular Einträge installiert, mit den 300-dimensionalen Vektoren auf dem corpus Gemeinsame Crawl mit dem Glove-Algorithmus trainiert. Die GloVe Common Crawl Vektoren haben einen De-facto-Standard für praktische NLP.

So können Sie einfach die GloVe vectors mit Gensim laden. Ich bin mir nicht sicher, ob Sie sie direkt laden können oder ob Sie this script verwenden müssen.

Wenn Sie das Wort Vektoren in Gensim als model geladen haben, können Sie einfach word_vectors.similarity('woman', 'man') verwenden, um die Ähnlichkeit zwischen zwei Wörtern zu erhalten. Wenn Sie eine Wörterliste haben, können Sie Folgendes tun:

def most_similar(word, candidates, model, n=20): 
    "Get N most similar words from a list of candidates" 
    similarities = [(model.similarity(word,candidate), candidate) 
        for candidate in candidates] 
    most_similar_words = sorted(similarities, reverse=True)[:n] 
    only_words = [w for sim,w in most_similar_words] 
    return only_words 
Verwandte Themen