Как динамически назначить правильный «размер» для Word2Vec? - PullRequest
0 голосов
/ 15 июня 2019

Вопрос двоякий: 1. Как выбрать идеальное значение для size?2. Как динамически получить размер словаря (для каждой строки, как я собираюсь), чтобы установить этот идеальный размер?

Мои данные выглядят следующим образом (пример) - всего одна строка и один столбец:

Строка 1

{kfhahf}    
Lfhslnf;
.
.
. 

Строка 2

(stdgff  ksshu, hsihf)
asgasf;
.
.
. 

И т.д.

Основано на этом сообщении: Python: Что такое параметр "size" в классе модели Gensim Word2vec Параметр size должен быть меньше (или равен?)размер словаря.Итак, я пытаюсь динамически назначить размер следующим образом:

from nltk.tokenize import word_tokenize
from gensim.models import Word2Vec

# I do Word2Vec for each row
For item in dataset:
    Tokenized = word_tokenize(item)
    model = Word2Vec([Tokenized], min_count=1)

Я получаю размер словаря здесь.Поэтому я создаю вторую модель:

model1 = Word2Vec([Tokenized], min_count=1, size=len(model.wv.vocab))

Это устанавливает значение size на текущее значение вокаба текущей строки, как я и предполагал.Но так ли это?Каков правильный размер для небольшого словарного текста?

1 Ответ

1 голос
/ 15 июня 2019

Нет простой формулы для лучшего size - это будет зависеть от ваших данных и целей.

Лучшей практикой является разработка надежного, автоматизируемого способа оценки набора слов-векторов для ваших целей - скорее всего, с помощью некоторого созданного вручную репрезентативного подмножества типов суждений и предпочтительных результатов, которые вам нужны. Затем попробуйте много значений size (и других параметров), пока не найдете значения, которые имеют наивысший балл для ваших целей.

В области моделирования на естественном языке, где словари состоят как минимум из десятков тысяч уникальных слов, но, возможно, из сотен тысяч или миллионов, типичные значения size обычно находятся в 100-1000 диапазон, но очень часто в диапазоне 200-400. Таким образом, вы можете начать поиск альтернативных значений, если ваша задача / словарь похожи.

Но если ваши данные или словарь малы, вам, возможно, придется попробовать меньшие значения. (Word2Vec действительно нуждается в больших, разнообразных данных обучения для лучшей работы.)

Относительно вашего кода, как показано:

  • вряд ли есть смысл вычислять новый model для каждого item в вашем наборе данных (отбрасывая предыдущий model на каждой итерации цикла). Если вы хотите подсчитать количество уникальных токенов в любом из токенизированных предметов, вы можете использовать идиоматический Python, такой как len(set(word_tokenize(item))). Любая интересующая модель Word2Vec, вероятно, должна быть обучена на комбинированном корпусе токенов из всех предметов.

  • обычно бывает, что min_count=1 делает модель хуже, чем большие значения (например, значение по умолчанию min_count=5). Слова, которые появляются только один раз, как правило, не могут получить хорошие слова-векторы, поскольку для работы алгоритма требуется несколько тонко контрастирующих примеров. Но попытка создать из этих одиночных векторов полезные векторы слов обычно требует тренировочных усилий и модельного состояния, которые могут быть более полезными для других слов с адекватными примерами - поэтому сохранение этих редких слов даже делает другими слова-векторы хуже. (Совершенно определенно не случай, когда «сохранение каждого необработанного слова делает модель лучше», хотя почти всегда так «более реальные разнообразные данные делают модель лучше».)

...