0

我正在尝试在 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”模型结合使用。

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

4

1 回答 1

1

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

您可以使用新向量来训练新模型,但是用经过训练的组件替换模型中的向量并不能很好地工作。标记器/解析器/ner 组件很可能会提供无意义的结果。

如果您想要 100d 向量而不是 300d 向量来节省空间,您可以调整向量的大小,这会将每个条目截断为前 100 个维度。结果性能会下降一点。

import spacy
nlp = spacy.load("en_core_web_md")
assert nlp.vocab.vectors.shape == (20000, 300)
nlp.vocab.vectors.resize((20000, 100))
于 2020-06-18T08:08:11.103 回答