Word2Vec в примерах

Волею судеб в мои руки попал обученный на поисковых запросах Word2Vec. Под катом даны примеры использования с пояснениями.

Что есть Word2Vec?

Word2Vec — это технология от гугл, которая заточена на статистическую обработку больших массивов текстовой информации. W2V собирает статистику по совместному появлению слов в фразах, после чего методами нейронных сетей решает задачу снижения размерности и выдает на выходе компактные векторные представления слов, в максимальной степени отражающие отношения этих слов в обрабатываемых текстах. Советую почитать первоисточник, дабы не полагаться на мой путанный пересказ технологии.

Какой Word2Vec исследовался?

Для обучения были взяты запросы к отечественному интернет-поисковику, соответственно — в массе своей русскоязычные. Длина вектора — 256 элементов, доступны как для алгоритма «skipgrams», так и «bag of words». Общее количество слов — более 2.6 миллиона, это все слова русского языка, многие слова из других языков, опечатки, названия и коды — в общем всё, что только люди могли искать.

Запросы к поисковику сильно отличаются по характеристикам от обычных текстов, и это даёт некоторое новое качество результатов.

Опечатки

./distance vectors.bin
Enter word or sentence (EXIT to break): преключение

Word: преключение Position in vocabulary: 124515

Word Cosine distance
— приключение 0.748698
преключения 0.726111
приключения 0.692828
приключеия 0.670168
прключение 0.666706
приключеня 0.663286
прключения 0.660438
приключени 0.659609

К нашим услугам не только разрешение опечаток в запросе, но и полный перечень всех опечаток, совершаемых людьми. Все опечатки собраны в единый кластер, что удобно. Отличие от систем проверки правописания — кардинальное. Ведь опечатка разрешается не методом вычисления расстояния Левенштейна (минимальное количество изменений, необходимых для получения из ошибочной формы правильной), а по статистике реальных ошибок реальных пользователей.

Транслитерация, не та раскладка

./distance vectors.bin
Enter word or sentence (EXIT to break): avito

Word: avito Position in vocabulary: 1999

Word Cosine distance
— awito 0.693721
авито 0.675299
fvito 0.661414
авита 0.659454
irr 0.642429
овито 0.606189
аviто 0.598056

 

./distance vectors.bin
Enter word or sentence (EXIT to break): пщщпду
— пщщщпду 0.723194
пщщпд 0.721070
пщпд 0.712373
пщппду 0.704579
пщщаду 0.695897
пщщпдк 0.694641
пщпду 0.692646
ппщду 0.681183
пщщп 0.660203
пгпд 0.653649
гугл 0.649897
поопду 0.647420
ппщпду 0.643923
пщщплу 0.641619
нфтвуч 0.640587
пщщпдуюкг 0.631423
пщщпу 0.620105
gogle 0.616396
иштп 0.612234
google 0.608240

Хотя задачи транслитерации и исправления неверной раскладки и решаются более простыми и быстрыми методами, всё равно приятно, что Word2Vec способен здесь не подкачать.

Названия сайтов, сайты-аналоги

./distance vectors.bin
Enter word or sentence (EXIT to break): гугл
— гугол 0.850174
гугле 0.809912
гогл 0.786360
гугль 0.760508
гоогл 0.734248
гуг 0.731465
гугла 0.726011
гуугл 0.725497
гкгл 0.724901
гугул 0.722874
гогле 0.719596
гугд 0.719277
гугел 0.715329
гугал 0.713950
яндекс 0.695366
google 0.690433
googl 0.669867

 

./distance vectors.bin
Enter word or sentence (EXIT to break): mail
— rambler 0.777771
meil 0.765292
inbox 0.745602
maill 0.741604
yandex 0.696301
maii 0.675455
myrambler 0.674704
zmail 0.657099
mefr 0.655842
jandex 0.655119
gmail 0.652458
вкmail 0.639919

Кластеризация слов — основная функция Word2Vec, и как видно, работает она хорошо.

Семантически близкие слова

./distance vectors.bin
Enter word or sentence (EXIT to break): кофе
— коффе 0.734483
чая 0.690234
чай 0.688656
капучино 0.666638
кофн 0.636362
какао 0.619801
эспрессо 0.599390
кофя 0.595211
цикорий 0.594247
кофэ 0.593993
копучино 0.587324
шоколад 0.585655
капучинно 0.580286
кардамоном 0.566781
латте 0.563224

 

./distance vectors2.bin
Enter word or sentence (EXIT to break): кофе
— зернах 0.757635
растворимый 0.709936
чая 0.709579
коффе 0.704036
mellanrost 0.694822
сублемированный 0.694553
молотый 0.690066
кофейные 0.680409
чай 0.679867
декофеинизированный 0.678563
капучино 0.677856
monoarabica 0.676757
свежесваренный 0.676544
декаф 0.674104
гевалия 0.673163
расстворимый 0.659948
etiopia 0.657329
электротурке 0.652837

Первая выдача — Word2Vec в режиме «skipgrams» — то есть в режиме выделения слов по их окружению, тогда как вторая выдача — Word2Vec в режиме «bag of words» — выделение слов вместе с их окружением. Первая — слова, взаимозаменяемые с кофе, во втором — слова, характеризующие кофе. Вторая выдача особенно полезна, когда мы начинаем задумываться, как оценить важность слов в запросе. Какое слово является главным, а какое конкретизирует запрос.

Кластеризация запроса

./distance vectors2.bin

Enter word or sentence (EXIT to break): мобильный телефон
— сотовый 0.811114
телефона 0.776416
смартфон 0.730191
телфон 0.719766
мобильного 0.717972
мобильник 0.706131
телефо 0.698894
тлефон 0.695520
тлф 0.693121
мобильнный 0.692854
телеон 0.688251
телефоны 0.685480
телефрн 0.674768
сотового 0.673612

Запрос, составленный из нескольких слов, может быть сведён к одному, наиболее характерному слову. Причём совершенно необязательно, что это слово присутствует в оригинальном запросе вообще. Можно сравнивать многословные запросы между собой и без промежуточной трансляции к одному слову. Здесь мы видим перефразировку и расширение запроса в действии.

Семантические отношения между словами

Самый интересный участок описания Word2Vec у гугла — это как они превращали короля в королеву нехитрыми арифметическими операциями над векторами. На поисковых запросах такой фокус провернуть не удалось, мало в последнее время ищут королей и королев, но кое-какие семантические отношения действительно выделяются.

Требуется найти такое слово, которое относится к Германии так-же, как Париж относится ко Франции. 

./word-analogy vectors2.bin

Enter three words (EXIT to break): франция париж германия
— мюнхен 0.716158
берлин 0.671514
дюссельдорф 0.665014
гамбург 0.661027
кельн 0.646897
амстердам 0.641764
франкфурт 0.638686
прага 0.612585
ашаффенбург 0.609068
дрезден 0.607926
нюрнберг 0.604550
люденшайд 0.604543
гмунден 0.590301

 

./word-analogy vectors2.bin

Enter three words (EXIT to break): сша доллар украина

— гривне 0.622719
долар 0.607078
гривны 0.597969
рубля 0.596636
доллара 0.588882
гривна 0.584129
рублю 0.578501
рубль 0.574094
доллару 0.565995
тенге 0.561814
долара 0.561768
валют 0.556239
доллор 0.548859
гривня 0.544302

Впечатляет…

Оценка важности слов в запросе

Принцип оценки прост. Надо определить, к какому кластеру тяготеет запрос в целом, а потом выбрать слова, максимально удалённые от центра этого кластера. Такие слова и будут главными, а остальные — уточняющими.

./importance vectors.bin

Enter word or sentence (EXIT to break): купить пиццу в москве

Importance купить = 0.159387
Importance пиццу = 1
Importance в = 0.403579
Importance москве = 0.455351

Enter word or sentence (EXIT to break): скачать сумерки

Importance скачать = 0.311702
Importance сумерки = 1

Enter word or sentence (EXIT to break): владимир путин

Importance владимир = 0.28982
Importance путин = 1

Enter word or sentence (EXIT to break): никита путин

Importance никита = 0.793377
Importance путин = 0.529835

Владимир для Путина — слово почти неважное. Почти все Путины, встречающиеся в интернете — Владимиры. А вот Никита Путин — наоборот, Никита важнее. Потому что необходимо из всех Путиных в интернете выбрать именно Никит.

Выводы

Как таковых выводов здесь немного. Технология работает и работает хорошо. Надеюсь, что данный пост будет использован в качестве иллюстрации на русском языке к тем возможностям, которые скрыты в Word2Vec.