Gensim: Есть ли шанс получить частоту слов в формате Word2Vec? - PullRequest
0 голосов
/ 06 ноября 2019

Я занимаюсь исследованиями с использованием предварительно обученной модели быстрого текста, и мне нужна частота слов для дальнейшего анализа. Содержат ли файлы .vec или .bin на сайте fasttext информацию о частоте слов? если да, как я могу получить?

Я использую load_word2vec_format для загрузки модели, которую пытался использовать model.wv.vocab [word] .count, которая дает вам только ранжирование частоты слова, а не исходную частоту слова.

1 Ответ

0 голосов
/ 06 ноября 2019

Я не верю, что эти форматы содержат информацию о частоте слов.

В той степени, в которой любые предварительно обученные векторы слов объявляют то, на чем они обучались - например, текст Википедии - вы можете вернуться в учебный корпус (или в некотором разумном приближении), чтобы выполнить свою собственную частоту -сосчитать. Даже если у вас есть только «похожий» корпус, частоты могут быть «достаточно близки» для вашей аналитической потребности.

Точно так же вы могли бы потенциально использовать частотный ранг для синтеза фиктивной таблицы частот, используя Закон Ципфа , что примерно справедливо для нормальных естественных тел. Опять же, относительные пропорции между словами могут быть достаточно близки к реальным пропорциям для вашей потребности, даже с реальными / точными частотами, которые использовались во время обучения векторов-слов.

Обобщая версию формулы закона Ципфа на странице Википедии, которая использует число гармоник (H) в знаменателе, с эффективным приближением H, данным в , этот ответ , мыможет создать функцию, которая, учитывая ранг слова (начиная с 1) и общее количество уникальных слов, дает пропорциональную частоту, предсказанную законом Ципфа:

from numpy import euler_gamma
from scipy.special import digamma

def digamma_H(s):
    """ If s is complex the result becomes complex. """
    return digamma(s + 1) + euler_gamma

def zipf_at(k_rank, N_total):
    return 1.0 / (k_rank * digamma_H(N_total))

Тогда, если у вас был предварительно обученный набор1 миллион слов-векторов, вы можете оценить частоту первого слова как:

>>> zipf_at(1, 1000000)
0.06947953777315177
...