#python #gensim #word-embedding #fasttext
#python #gensim #встраивание слов #fasttext
Вопрос:
У меня есть предварительно подготовленный файл вложений, который был квантован в формате .ftz. Мне это нужно для поиска слов, поиска ближайших соседей. Но я не могу найти какие-либо инструменты, которые могут это сделать. FastText может загружать файл вложений, но не может найти ближайшего соседа, Gensim может искать ближайшего соседа, но не может загрузить модель…
Или я не нахожу правильную функцию?
Спасибо!
Комментарии:
1. Если я правильно понимаю, FastText от Facebook предлагает оптимизацию «квантования» только для моделей своего
supervised
режима, и Gensim в настоящее время не поддерживает работу с такими моделями. Итак: по крайней мере, в отношении Gensim вы просто сталкиваетесь с известным ограничением. (Gensim потенциально может легче поддерживать загрузку моделей word-vectors изsupervised
mode, чем поддержку контролируемого обучения… поэтому, если вы сообщаете о возникших ошибках, возможно, можно предложить обходной путь или способ экспорта векторов слов в формате, таком как обычный текстовый формат, который мог бы прочитать Gensim.)2. @gojomo: вероятно, это должен быть ответ,
Ответ №1:
Модели FastText бывают двух видов:
- неконтролируемые модели, которые создают вложения слов и могут находить похожие слова. Собственный пакет Facebook не поддерживает квантование для них.
- контролируемые модели, которые используются для классификации текста и могут быть квантованы изначально, но обычно не создают значимых вложений слов.
Для сжатия неконтролируемых моделей я создал пакет compress-fasttext, который представляет собой оболочку вокруг Gensim, которая может уменьшить размер неконтролируемых моделей путем обрезки и квантования. Этот пост описывает это более подробно.
С помощью этого пакета вы можете искать похожие слова в небольших моделях следующим образом:
import compress_fasttext
small_model = compress_fasttext.models.CompressedFastTextKeyedVectors.load(
'https://github.com/avidale/compress-fasttext/releases/download/v0.0.4/cc.en.300.compressed.bin'
)
print(small_model.most_similar('Python'))
# [('PHP', 0.5253), ('.NET', 0.5027), ('Java', 0.4897), ... ]
Конечно, это работает, только если модель была сжата с использованием того же пакета. Таким образом, вы можете сжать свою собственную неконтролируемую модель:
import compress_fasttext
from gensim.models.fasttext import load_facebook_model
big_model = load_facebook_model('path-to-original-model').wv
small_model = compress_fasttext.prune_ft_freq(big_model, pq=True)
small_model.save('path-to-new-model')