Python: субдискретизация токенов или субдискретизация модели word2vec

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

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

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

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


person chiaras15    schedule 23.01.2020    source источник
comment
Почему вам нужно уменьшить большой корпус до аналогичного размера? (Почему бы не сделать наилучшую возможную модель из каждого полного корпуса?) Причины, по которым вы хотите выбросить большое количество данных, могут повлиять на то, какие подходы к подвыборке будут подходящими. Точно так же вы хотите, чтобы сокращенный первый корпус был того же размера, что и второй корпус, с точки зрения количества предложений, или количества необработанных обучающих слов, или количества фактических обучающих слов (после таких вещей, как удаление редких слов), или подсчет окончательного выученного словарного запаса? (У каждого будет немного другой подход и немного разные эффекты.)   -  person gojomo    schedule 23.01.2020
comment
Я хочу обучить 2 модели: одну с полным корпусом, а другую с первым корпусом, размер которого будет уменьшен до размера второго корпуса (результаты я обсужу в проекте для моего магистерского курса). Во втором случае я бы хотел, чтобы в первом корпусе было то же количество необработанных обучающих слов, что и во втором корпусе, но при этом сохранялась моя структура списка предложений токенов. Имеет ли это смысл?   -  person chiaras15    schedule 23.01.2020
comment
Спасибо, но почему этот процесс согласования размеров корпусов считается важным? Какие преимущества это даст по сравнению с обычно оптимальным подходом, заключающимся в использовании как можно большего количества данных, которые вы можете получить и уложиться в ваши ресурсы/временные ограничения? (Я изложу несколько идей о том, как сделать то, о чем вы буквально просите, в формальном ответе, но, не зная причин, они могут быть неуместными/оптимальными.)   -  person gojomo    schedule 24.01.2020
comment
Большое спасибо! Я подумал, что нужно сделать все корпуса, которые я хочу сравнить, одного размера.. Я очень новичок ????   -  person chiaras15    schedule 25.01.2020


Ответы (1)


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

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

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

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

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

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

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

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

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

corpus_a_subset = random.sample(corpus_a, 309000)

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

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

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

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

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

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

person gojomo    schedule 24.01.2020
comment
Большое спасибо!! Это было очень понятное объяснение :) - person chiaras15; 25.01.2020