使用 glove.6B.100d.txt 嵌入 spacy 得到零 lex.rank

Using glove.6B.100d.txt embedding in spacy getting zero lex.rank

我正在尝试在 spacy nlp 管道中加载 glove 100d emebddings。

我按如下方式创建了 spacy 格式的词汇表:

python -m spacy init-model en spacy.glove.model --vectors-loc glove.6B.100d.txt

glove.6B.100d.txt通过在第一行添加“400000 100”转换为word2vec格式。

现在

spacy.glove.model/vocab has following files: 
5468549  key2row
38430528  lexemes.bin
5485216  strings.json
160000128  vectors

在代码中:

import spacy 
nlp = spacy.load("en_core_web_md")

from spacy.vocab import Vocab
vocab = Vocab().from_disk('./spacy.glove.model/vocab')

nlp.vocab = vocab

print(len(nlp.vocab.strings)) 
print(nlp.vocab.vectors.shape) gives 

给予 407174 (400000, 100)

然而问题是:

V=nlp.vocab
max_rank = max(lex.rank for lex in V if lex.has_vector)
print(max_rank) 

给出 0

我只想将 spacy 中的 100d 手套嵌入与来自 en_core_web_md 的 "tagger"、"parser"、"ner" 模型结合使用。

有谁知道如何正确地做到这一点(这可能吗)?

tagger/parser/ner 模型使用包含的词向量作为特征进行训练,因此如果您将它们替换为不同的向量,您将破坏所有这些组件。

您可以使用新向量来训练新模型,但用训练过的组件替换模型中的向量效果不佳。 tagger/parser/ner 组件很可能会提供无意义的结果。

如果您想要保存 100d 个向量而不是 300d 个向量space,您可以调整向量的大小,这会将每个条目截断为前 100 个维度。结果性能会有所下降。

import spacy
nlp = spacy.load("en_core_web_md")
assert nlp.vocab.vectors.shape == (20000, 300)
nlp.vocab.vectors.resize((20000, 100))