[recovery mode] Word2Vec в примерах

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

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

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

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

Опечатки

./distance vectors.binEnter 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.binEnter word or sentence (EXIT to break): avito

Word: avito Position in vocabulary: 1999

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

./distance vectors.binEnter 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.620105gogle 0.616396иштп 0.612234google 0.608240

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

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

./distance vectors.binEnter 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.695366google 0.690433googl 0.669867

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

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

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

./distance vectors.binEnter 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.binEnter word or sentence (EXIT to break): кофе— зернах 0.757635растворимый 0.709936чая 0.709579коффе 0.704036mellanrost 0.694822сублемированный 0.694553 молотый 0.690066кофейные 0.680409чай 0.679867декофеинизированный 0.678563капучино 0.677856monoarabica 0.676757свежесваренный 0.676544декаф 0.674104 гевалия 0.673163расстворимый 0.659948etiopia 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.159387Importance пиццу = 1Importance в = 0.403579Importance москве = 0.455351

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

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

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

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

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

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

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

Выводы

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

© Habrahabr.ru