Эффективное встраивание фрагментов слов в векторное пространство слов средствами gensim

Oct 26, 2016 16:53

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

Окончания слов в русском языке обычно нагружены грамматической информацией. Поэтому возникает соблазн брать у несловарного терма окончание и как-то получить для него w2v встраивание. Например, для слова "гравицаповыми" взять окончание "~выми", и поискать в w2v пространстве ближайшие:

--- SEARCHING BY ENDING ---
~выми  is known!
настоящими ==> 0.981663823128
крылатыми ==> 0.979067623615
нашими ==> 0.978263318539
новыми ==> 0.978013753891
обычными ==> 0.977620720863
обсидиановыми ==> 0.977335035801
старыми ==> 0.976929605007
большими ==> 0.97685033083
этими ==> 0.97648870945
хорошими ==> 0.976358771324

Как видим, метод реально работает. Каким образом встраивать терм ~выми вместе с "нормальными" словами?

Сделаем так. В большом корпусе текстов будем для некоторых предложений создавать копию с заменой слов на "...выми" на термы "~выми". Например, для предложения:

занимаемся игровыми программами

добавим в корпус также предложение:

занимаемся ~выми программами

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

Главная проблема - размер получаемого корпуса. Описанный процесс data augmentation приводит к кратному распуханию текстового файла, например из 8 Гб корпуса легко получается 50-100 Гб монстр. Такие объемы чрезмерны для SSD, да и на HDD это выглядит слишком big data.

К счастью, в библиотеке gensim есть прекрасная возможность вместо текстового файла подавать на вход любой генератор текста - класс, который при итерировании будет возвращать предложения. То, что нужно! Пишем класс, который будет выполнять сэмплинг исходного текста, возвращая по несколько вариантов каждого предложения с заменами слов на квазиморфемы. Для сишного word2vec аналогичный прием потребовал бы организации pipe с генератором текста, что, например, на Win выглядит не очень надежно (а не будет ли там организовано системой промежуточных временных файлов?).

Ссылка на питоновский код c генерацией корпуса на лету для встраивания квазиморфем

Ссылка на код, который проверяет несколько вариантов запросов с разными комбинациями частей слов, включая усреднение векторов

vector space model, unsupervised feature learning, gensim, language model, word2vec, vector model, python, word embedding

Previous post Next post
Up