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

3
以下代码使用 spaCy词向量,通过首先计算词汇表中所有单词的余弦相似度,然后对最相似单词列表进行排序,找到给定单词的前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向量空间中最接近彼此的这些单词。
对此方面的任何帮助都将不胜感激。
2个回答

1

SpaCy文档表示:

默认的英语模型安装了100万个词汇条目的向量,使用在Common Crawl语料库上使用GloVe算法训练的300维向量。GloVe common crawl向量已成为实用NLP的事实标准。

因此,您可以使用Gensim加载GloVe向量。我不确定是否可以直接加载它们,还是必须使用{{link2:此脚本}}。

如果您已将单词向量加载到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

0

Spacy有一个名为Vectors的类,其中包含一个most_similar方法。您可以定义一个包装函数来避免编写自己的实现:

import spacy
import numpy as np

def most_similar(word, model, n=20):
    nlp = spacy.load(model)
    doc = nlp(word)
    vecs = [token.vector for token in doc]
    queries = np.array(vecs)
    keys_arr, best_rows_arr, scores_arr = nlp.vocab.vectors.most_similar(queries, n=n)
    keys = keys_arr[0] # The array of keys is nested in another array from the previous step.
    similar_words_list = [nlp.vocab[key].text for key in keys]
    return similar_words_list

并且像这样调用:most_similar('apple', 'en_core_web_md', n=20) 这将基于Spacy模型包“en_core_web_md”,使用余弦相似度查找单词“apple”的20个最相似的单词。

这是结果:['BLACKBERRY','APPLE','apples','PRUNES','iPHone','3g / 3gs','fruit','FIG','CREAMSICLE','iPad','ipad4','LONGAN','CALVADOS','iPOD','iPod','SORBET','PERSICA','peach','juice','JUICE']


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接