Невозможно воспроизвести предварительно обученные векторы слов из своих векторов - PullRequest
0 голосов
/ 04 марта 2020

Просто любопытство, но я отлаживал код FastText от gensim для репликации реализации слов вне словаря (OOV), и я не смог этого сделать sh. Итак, процесс, которому я следую, тренирует крошечную модель с игрушечным корпусом, а затем сравнивает результирующие векторы слова в словаре. Это означает, что если весь процесс в порядке, выходные массивы должны быть одинаковыми.

Вот код, который я использовал для теста:

from gensim.models import FastText
import numpy as np
# Default gensim's function for hashing ngrams
from gensim.models._utils_any2vec import ft_hash_bytes

# Toy corpus
sentences = [['hello', 'test', 'hello', 'greeting'],
             ['hey', 'hello', 'another', 'test']]

# Instatiate FastText gensim's class
ft = FastText(sg=1, size=5, min_count=1, \
window=2, hs=0, negative=20, \
seed=0, workers=1, bucket=100, \
min_n=3, max_n=4)

# Build vocab
ft.build_vocab(sentences)

# Fit model weights (vectors_ngram)
ft.train(sentences=sentences, total_examples=ft.corpus_count, epochs=5)

# Save model
ft.save('./ft.model')
del ft

# Load model
ft = FastText.load('./ft.model')

# Generate ngrams for test-word given min_n=3 and max_n=4
encoded_ngrams = [b"<he", b"<hel", b"hel", b"hell", b"ell", b"ello", b"llo", b"llo>", b"lo>"]
# Hash ngrams to its corresponding index, just as Gensim does
ngram_hashes = [ft_hash_bytes(n) % 100 for n in encoded_ngrams]
word_vec = np.zeros(5, dtype=np.float32)
for nh in ngram_hashes:
    word_vec += ft.wv.vectors_ngrams[nh]

# Compare both arrays
print(np.isclose(ft.wv['hello'], word_vec))

Вывод этого скрипта: Неверно для каждого измерения сравниваемых массивов.

Было бы неплохо, если бы кто-то указал мне, если я что-то упускаю или делаю что-то не так. Заранее спасибо!

1 Ответ

0 голосов
/ 04 марта 2020

Вычисление слова-вектора FastText полного слова - это не просто сумма его символов n-грамм-векторов, а также необработанный вектор полного слова, который также обучается для словарных слов.

Векторы полных слов, которые вы возвращаете из ft.wv[word] для известных слов, уже рассчитали эту комбинацию заранее. См. Метод adjust_vectors() для примера этого полного вычисления:

https://github.com/RaRe-Technologies/gensim/blob/68ec5b8ed7f18e75e0b13689f4da53405ef3ed96/gensim/models/keyedvectors.py#L2282

необработанные векторы полных слов находятся в .vectors_vocab массив объекта model.wv.

(Если этого недостаточно для согласования вопросов: убедитесь, что вы используете самую последнюю версию gensim, поскольку было много последних исправлений FT. И, убедитесь, что ваш список ngram-хэшей совпадает с выводом метода ft_ngram_hashes() библиотеки - если нет, то ваше ручное создание ngram-list-списка и последующее хеширование могут делать что-то другое.)

...