Есть ли хорошие способы уменьшить размер словарного запаса при обработке естественного языка? - PullRequest
1 голос
/ 11 февраля 2020

При работе над такими задачами, как классификация текста, QA, исходный словарь, генерируемый из корпуса, обычно слишком велик и содержит много «неважных» слов. Самые популярные способы уменьшения размера словарного запаса - отбрасывание стоп-слов и слов с низкими частотами.

Например, в gensim

gensim.utils.prune_vocab(vocab, min_reduce, trim_rule=None):
    Remove all entries from the vocab dictionary with count smaller than min_reduce.
    Modifies vocab in place, returns the sum of all counts that were pruned.

Но на практике настройка минимальное количество является эмпирическим и не кажется достаточно точным. Я замечаю, что термин частота каждого слова в словаре часто следует за длиннохвостым распределением, это хороший способ, если я оставлю только топ-слова K, которые занимают X% (95%, 90%, 85%, ... ) общего срока частоты? Или есть какие-нибудь разумные способы уменьшить словарный запас, не оказывая серьезного влияния на задачу НЛП?

Ответы [ 2 ]

0 голосов
/ 11 февраля 2020

В общем, наименее часто встречающиеся слова в ваших тренировочных данных также безопаснее всего отбрасывать.

Это особенно касается «word2ve c» и подобных алгоритмов. Может быть недостаточно разнообразных примеров использования каждого редкого слова для изучения надежных представлений - в отличие от слабых / идиосинкратированных c представлений, основанных на нескольких не обязательно репрезентативных примерах их использования, которые у вас есть.

Кроме того, в будущих текстах редкие слова не будут повторяться так часто, что снижает их относительную ценность в модели.

И, благодаря типичному «zipfian» распределению частот слов в материале на естественном языке, в то время как каждое отдельное редкое слово встречается всего несколько раз, всего таких слов много. Таким образом, простое отбрасывание слов в одном или нескольких случаях часто значительно сокращает словарный запас (и, следовательно, общую модель) вдвое или более.

Наконец, в 'word2ve c' было замечено, что отбрасываются те промежуточные редкие слова, которых в общем количестве много, хотя у каждого из них есть только примеры с ограниченным качеством - качество выживания чаще словосочетания часто улучшаются. Эти более важные слова имеют меньше промежуточных «шумных» слов с меньшим значением, которые выводят их из контекста друг друга windows или тянут веса модели в других направлениях с помощью чередующихся обучающих примеров.

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

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

Обратите внимание, что для модели Word2Vec gensim и связанных с ней алгоритмов, в дополнение к параметру min_count, который отбрасывает все слова, появляющиеся меньше этого значения, существует также параметр max_final_vocab, который будет динамически выберите значение min_count, достаточное для достижения окончательного размера словаря, не превышающего значение max_final_vocab.

Так что, если вы знаете, что у вас есть системная память для поддержки модели с миллионным словом, вам не нужно использовать метод проб и ошибок для значений min_count, чтобы достичь чего-то близкого: вы можете просто укажите max_final_vocab=1000000, min_count=1.

(С другой стороны, будьте осторожны с параметром max_vocab_size. Он должен использоваться только для предотвращения перерасчета доступной оперативной памяти при первоначальном опросе по количеству слов, и поэтому должен быть установлен до максимальной величины, которой может управлять ваша система - намного, намного больше, чем вы хотели бы, чтобы ваш фактический конечный размер словаря был равен. Это потому, что max_vocab_size применяется всякий раз, когда текущее обследование достигает этого размера - не только на конец - и отбрасывает большое количество меньших слов, а затем применяет более высокий уровень каждый раз, когда он применяется.Если этот предел достигнут вообще, это означает, что окончательный счет будет только приблизительным - а возрастающий этаж означает иногда бегущий словарь будет сокращено до 10% или около того max_vocab_size.)

0 голосов
/ 11 февраля 2020

Действительно, есть несколько недавних разработок, которые пытаются противодействовать этой проблеме. Наиболее заметными из них являются, вероятно, единицы подслов (также известные как кодировки пар байтов или BPE), которые вы можете представить как понятие, похожее на слоги в слове (но не одно и то же!); Слово типа basketball может быть преобразовано в варианты типа bas @@ket @@ball или basket @@ball. Обратите внимание, что это построенный пример, который может не отражать фактически выбранные подслова.

Сама идея относительно старая (статья 1994 г.), но недавно была популяризирована Sennrich et al. , и в основном используется в каждой современной библиотеке NLP, которая имеет дело с большими словарями.

Возможно, две самые большие реализации этой идеи - fastBPE и Google SentencePiece .

С единицами подслов вы теперь в основном имеете свободу определять фиксированный размер словаря, и алгоритм затем попытается оптимизировать в направлении сочетания разнесения слов. и, в основном, разделение «более сложных слов» на несколько частей, так что желаемый размер словаря может охватывать любое слово в корпусе. Тем не менее, для точного алгоритма я настоятельно рекомендую вам изучить связанную статью или ее реализацию.

...