Python: токены понижающей дискретизации или понижающая дискретизация word2ve c модель - PullRequest
0 голосов
/ 23 января 2020

Мне нужна помощь с проблемой понижающей дискретизации. Мне нужно составить больший корпус (6 654 940 предложений, 19 592 258 токенов), сравнимый с меньшим (15 607 предложений, 927 711 токенов), чтобы реализовать их на 2 сопоставимых моделях word2ve c. Каждый корпус представляет собой список списков, в котором каждый список является токенизированным предложением: например, [['the', 'boy', 'eats']['the', 'teacher', 'explains']...]

Я хочу уменьшить выборку самого большого, чтобы иметь такое же количество токенов меньшего (сохраняя исходную структуру данных : предложения понижающей выборки, пока я не получу желаемое количество токенов). Я очень новичок в программировании, и я подумал о двух возможных способах продолжения, но я не уверен, как их реализовать: - сокращение выборки в списке списков - сокращение выборки обученной модели word2ve c (я видел на форуме, что Параметр «выборка» используется для понижения частоты наиболее частых слов, но я хочу получить случайные предложения)

Можете ли вы мне помочь?

Спасибо большое !! :)

1 Ответ

0 голосов
/ 24 января 2020

Обозначим несколько вещей, которые вы явно упомянули:

корпус-A 6 654 940 предложений, 19 592 258 токенов (2,9 токена на предложение)

корпус-B 15 607 предложений, 927 711 токенов (60 токенов на предложение)

Сразу замечу, что крошечный средний размер корпус-A предложения предполагают, что они могут не относиться к типу слов естественного языка, по которым обычно запускается word2vec. И такие ограниченные предложения могут не приводить к типам window размеров, которые наиболее типичны для этого вида обучения. (windows будет нетипично маленьким, независимо от того, какой вы выберете window. И обратите внимание, что далее из предложения с одним токеном не может быть никакого обучения - это неоперация.)

Итак, любое масштабирование / выборка corpus-A (с его предложениями из 3 токенов) в конце процесса не будет очень похожа на corpus-B (с это более типичные предложения от десятков до сотен токенов). Они на самом деле не будут похожи, за исключением какого-то единственного измерения, которое вы выберете.

Если на самом деле у вас достаточно памяти, чтобы работать с corpus-A полностью в оперативной памяти, то выбирайте случайное подмножество из 15607 предложений - в соответствии с количеством предложений corpus-B , очень просто с использованием стандартных Python функций:

import random
corpus_a_subset = random.sample(corpus_a, len(corpus_b))

Конечно, этот конкретный corpus_a_subset будет соответствовать только количеству предложений в corpus_b, но на самом деле будет гораздо меньше в необработанных словах - длиной около 47 тыс. Токенов - с учетом гораздо более короткого среднего размера предложений корпус-A .

Если вместо этого вы стремитесь получить подмножество длиной примерно 927 тыс. Токенов, соответствующее количеству токенов corpus-B , вам потребуется (927 тыс. / 3 =) 309000 предложений:

corpus_a_subset = random.sample(corpus_a, 309000)

Тем не менее, хотя это должно сделать corpus_a_subset близко совпадающим с необработанным количеством слов corpus_b, это все же, вероятно, очень разные корпуса с точки зрения уникальных токенов, относительных частот токенов и даже общее количество обучающих контекстов - поскольку контексты с более короткими предложениями будут гораздо чаще ограничиваться концом предложения, чем полной длиной window. (Несмотря на схожесть в подсчете количества жетонов, время обучения может заметно отличаться, особенно если ваш window большой.)

Если ваш основной интерес - просто возможность тренироваться на corpus-A подмножество так же быстро, как и меньший корпус, есть и другие способы, кроме отбрасывания многих его предложений, чтобы уменьшить его:

  • параметр sample увеличивает скорость, с которой вхождения часто встречающихся слов пропускаются случайным образом. В типичных частотах слов Zipfian, обычные слова появляются так много раз, во всех их возможных различных использованиях, что можно игнорировать многие из них как избыточные. И, кроме того, отказ от многих из этих чрезмерных примеров, позволяющий уделять относительно больше внимания более редким словам, часто повышает общую полезность конечных векторов слов. Особенно в очень больших корпусах, выбор более агрессивного (меньшего) значения sample может выбрасывать много корпуса, ускоряя обучение, но все же приводя к лучшим векторам.

  • повышение параметра min_count отбрасывает все меньше и меньше слов. В отличие от любой интуиции, что «больше данных всегда лучше», это часто повышает полезность векторов выживших слов. Это связано с тем, что слова с несколькими примерами использования, как правило, не получают больших векторов - эти несколько примеров не покажут нужного разнообразия и репрезентативности - однако распространенность такого количества таких редких, но недостаточно продемонстрированных слов по-прежнему мешает обучению других слов.

Пока примеров наиболее часто встречающихся и важных слов достаточно, агрессивные настройки sample и min_count для большого корпуса могут уменьшать эффективный размер на 90% и более - и при этом создавать качественные векторы для оставшихся слов.

Но также обратите внимание: ни один из ваших корпусов не такой большой, как лучше всего подходит для word2vec тренировок. Это выигрывает от большого разнообразия корпусов. Ваш корпус-B , в частности, крошечный по сравнению с большим количеством word2vec работы - и хотя вы можете несколько «растянуть» влияние корпуса с помощью большего количества тренировочных эпох, используя меньшие векторы или меньший выживший словарный запас, вы все еще можете быть ниже размера корпуса, где word2vec работает лучше всего. Поэтому, если это вообще возможно, я бы искал способы вырастить корпус-B , больше, чем уменьшить корпус-A .

...