Давайте пометим несколько вещей, которые вы упомянули явно:
корпус-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