我可以在spaCy中修剪解析器的词汇吗?

时间:2016-12-11 19:36:41

标签: vocabulary spacy

以下代码使用spaCy word vectors通过首先计算词汇表中所有单词的余弦相似度(超过一百万)来查找给定单词的20个最相似的单词,然后对这个单词中最相似的单词进行排序

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

我想知道的是,是否有一种方法将spaCy的词汇量仅限于给定列表中出现的单词,我希望这会大大降低排序操作的成本。

为了清楚起见,我想传递一个单词列表,或者只是给定文本中的单词,并且能够快速查找这些单词中哪些在spaCy的向量空间中彼此最接近。

对此方面的任何帮助都表示赞赏。

1 个答案:

答案 0 :(得分:1)

SpaCy文档说:

  

默认的英语模型会安装一百万个词汇表的向量   条目,使用在共同爬网上训练的300维向量   语料库使用GloVe算法。 GloVe常见的爬行向量有   成为实用NLP的事实上的标准。

所以你可以使用Gensim加载GloVe vectors。我不确定您是否可以直接加载它们,或者是否必须使用this script

如果您已将Gensim中的单词向量加载为model,则只需使用word_vectors.similarity('woman', 'man')即可获得两个单词之间的相似度。如果你有一个单词列表,你可以这样做:

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