Чтобы определять 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 генерацией корпуса на лету для встраивания квазиморфем Ссылка на код, который проверяет несколько вариантов запросов с разными комбинациями частей слов, включая усреднение векторов