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