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
gogl 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.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.