Использование встраивания glove.6B.100d.txt в spacy с нулевым lex.rank - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь загрузить перчатку 100d emebddings в пространственный конвейер nlp.

Я создаю словарь в просторном формате следующим образом:

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

glove.6B.100d.txt конвертируется в формат word2ve c путем добавления «400000 100» в первую строку .

Теперь

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

Я просто хочу использовать вложения перчаток 100d в spacy в сочетании с моделями tagger, parser, ner из en_core_web_md.

Кто-нибудь знает, как go сделать это правильно (возможно ли это)?

1 Ответ

1 голос
/ 18 июня 2020

Модели tagger / parser / ner обучаются с включенными векторами слов в качестве функций, поэтому, если вы замените их другими векторами, вы сломаете все эти компоненты.

Вы можете использовать новые векторы для обучения новая модель, но замена векторов в модели обученными компонентами не сработает. Компоненты tagger / parser / ner, скорее всего, дадут бессмысленные результаты.

Если вы хотите, чтобы векторы 100d вместо векторов 300d для экономии места, вы можете изменить размер векторов, что приведет к усечению каждой записи до первых 100 измерений. В результате производительность go немного снизится.

import spacy
nlp = spacy.load("en_core_web_md")
assert nlp.vocab.vectors.shape == (20000, 300)
nlp.vocab.vectors.resize((20000, 100))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...