Один из прорывов в работе компов с семантикой текста это модель word2vec и её производные вроде doc2vec. Модель была предложена всего несколько лет назад ребятами из Гугла.

Как следует из названия, слово или набор слов представляется в виде вектора (word to vector), а из школьного курса математики известно, что векторы можно складывать, вычитать и так далее. Соответственно, теперь можно складывать и вычитать слова.

Модель задаёт векторы слов в 300-мерном пространстве, но не надо пугаться. Если вектор на двумерной плоскости записывается двумя числами, то вектор в 300-мерном пространстве это просто 300 чисел через запятую) Слова сортируются по векторному пространству в зависимости от контекста в процессе обучения модели по большому количеству текста. И получается сортировка по смыслу/сути/понятию. Соответственно, операции со словами выглядят как операции с смысловыми признаками. Например, при сложении слов “король” и “женщина” подразумевается нечто, обладающее признаками “королевский” и “женский” и модель ответит “королева”. Вычитание “женщины” из “королевы” даст короля. Это достаточно простые примеры, но на лицо работа именно с абстрактными значениями слов.

Модель меня заинтересовала и я написал бота для мессенджера “телеграм”, чтобы удобнее было с ней играться и понять её особенности и возможности. Бот получает от пользователя четыре слова, затем из первого вычитает второе, а третье и четвёртое воспринимает как ответы пользователя на разность и говорит насколько они близки к реальной векторной разности по шкале от -1 до +1. Затем отправляет в чат десять слов, которые по мнению модели наиболее близки к разности.



Выше были простые примеры и, на мой взгляд, модель с ними справилась нормально. Модель способна и на операции с ещё более абстрактными понятиями, но до Скайнета, конечно, далеко. Где-то лажает, где-то нет. Например, вычитая “душу” из “человека” среди ответов модели третье место занимает “шимпанзе” =) На сумму “газа” и “дыхания” модель уверенно отвечает “воздух”, складывая “чувство” и “секс” получает “любовь”.

Вычитая любое слово из самого себя получается нулевой вектор, который никуда не направлен и, значит, и не имеет смысловых признаков. Иными словами - белиберда =)

Боту можно писать и вдвоём, пытаясь дать ближайшее слово к разности/сумме ранее написанных слов. Второй левел это играть, пытаясь дать наиболее противоположное слово к загаданному, что более требовательно к фантазии) Если, например, угадывать наиболее противоположное слово к слову "сталь", то это будет никак не "вата", потому что и то и другое это материал, вещество и так далее и, соответственно, вата это не лучший вариант) Максимально противоположное не должно обладать смысловым признаком "материал" и всем остальным, чем обладает слово "сталь".

Помимо угадывания ближайших/далёких слов можно решать уравнения, пытаясь подобрать слово для переменной. например в уравнении "X + Y = любовь" слова подобрать легко, а в "Бог - X = человек" гораздо сложнее подобрать Х)

А модель doc2vec позволяет складывать и вычитать не только слова, а целые предложения и тексты (их смыслы), но это уже другая история =)

Кто хочет поиграться с моделью - пишите боту Word2vec_bot в телеграм) Что-то там может быть неудобно или не сразу понятно - извиняйте, я писал на скорую руку и для себя(