Просто любопытство, но я отлаживал код 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))
Вывод этого скрипта: Неверно для каждого измерения сравниваемых массивов.
Было бы неплохо, если бы кто-то указал мне, если я что-то упускаю или делаю что-то не так. Заранее спасибо!