Як розпочати роботу з Word2Vec - і як це зробити

Ідея Word2Vec досить проста. Ми робимо припущення, що про значення слова може зробити висновок компанія, яку вона тримає. Це аналогічно приказці: « Покажи мені своїх друзів, і я скажу, хто ти. "

Якщо у вас є два слова, які мають дуже схожих сусідів (мається на увазі: контекст, у якому він вживається, приблизно однаковий), то ці слова, ймовірно, досить подібні за значенням або принаймні пов’язані між собою. Наприклад, слова шоковані , приголомшені, і вражений , як правило , використовуються в аналогічному контексті.

Використовуючи це основне припущення, ви можете використовувати Word2Vec для виведення подібних понять, пошуку непов’язаних понять, обчислення подібності між двома словами тощо!

До справи

У цьому підручнику ви дізнаєтесь, як використовувати реалізацію Gensim Word2Vec і фактично змусити її працювати. Я давно чув скарги на погану роботу в цілому, але насправді це поєднання двох речей: (1) вхідних даних та (2) налаштувань параметрів .

Зауважте, що алгоритми навчання в пакеті Gensim насправді були перенесені з оригінальної реалізації Word2Vec компанією Google і розширені з додатковою функціональністю.

Імпорт та реєстрація

По-перше, ми починаємо з нашого імпорту та встановлюємо реєстрацію:

# imports needed and loggingimport gzipimport gensim import logging
logging.basicConfig(format=’%(asctime)s : %(levelname)s : %(message)s’, level=logging.INFO)

Набір даних

Наше наступне завдання - знайти дійсно хороший набір даних. Секрет того, як Word2Vec дійсно працює для вас, полягає у тому, щоб мати багато-багато текстових даних у відповідному домені. Наприклад, якщо ваша мета - створити лексикон настроїв, то використання набору даних з медичного домену або навіть Вікіпедії може бути неефективним. Отже, вибирайте свій набір даних з розумом.

Для цього підручника я буду використовувати дані з набору даних OpinRank з деяких моїх кандидатських робіт. Цей набір даних містить повні відгуки користувачів про машини та готелі. Я спеціально зібрав усі відгуки про готелі у один великий файл, який складає близько 97 МБ стисненого та 229 МБ нестисненого. Для цього підручника ми використовуватимемо стислий файл. Кожен рядок у цьому файлі представляє відгук про готель.

Тепер давайте ближче розглянемо ці дані нижче, надрукувавши перший рядок.

Ви повинні побачити наступне:

b"Oct 12 2009 \tNice trendy hotel location not too bad.\tI stayed in this hotel for one night. As this is a fairly new place some of the taxi drivers did not know where it was and/or did not want to drive there. Once I have eventually arrived at the hotel, I was very pleasantly surprised with the decor of the lobby/ground floor area. It was very stylish and modern. I found the reception's staff geeting me with 'Aloha' a bit out of place, but I guess they are briefed to say that to keep up the coroporate image.As I have a Starwood Preferred Guest member, I was given a small gift upon-check in. It was only a couple of fridge magnets in a gift box, but nevertheless a nice gesture.My room was nice and roomy, there are tea and coffee facilities in each room and you get two complimentary bottles of water plus some toiletries by 'bliss'.The location is not great. It is at the last metro stop and you then need to take a taxi, but if you are not planning on going to see the historic sites in Beijing, then you will be ok.I chose to have some breakfast in the hotel, which was really tasty and there was a good selection of dishes. There are a couple of computers to use in the communal area, as well as a pool table. There is also a small swimming pool and a gym area.I would definitely stay in this hotel again, but only if I did not plan to travel to central Beijing, as it can take a long time. The location is ok if you plan to do a lot of shopping, as there is a big shopping centre just few minutes away from the hotel and there are plenty of eating options around, including restaurants that serve a dog meat!\t\r\n"

Ви бачите, що це досить хороший, повний огляд з великою кількістю слів, і саме цього ми хочемо. У цьому наборі даних маємо приблизно 255 000 таких оглядів.

Щоб уникнути плутанини, підручник Gensim з Word2Vec говорить, що вам потрібно передати послідовність речень як вхідні дані до Word2Vec. Однак ви можете фактично викласти цілий огляд як речення (тобто набагато більший розмір тексту), якщо у вас багато даних, і це не повинно мати великої різниці. Врешті-решт, все, для чого ми використовуємо набір даних, це отримати всі сусідні слова для даного цільового слова.

Читання файлів у списку

Тепер, коли у нас є найменший пік нашого набору даних, ми можемо прочитати його у списку, щоб передати це на модель Word2Vec. Зверніть увагу в коді нижче, що я безпосередньо читаю стислий файл. Я також роблю невелику попередню обробку оглядів з використанням gensim.utils.simple_preprocess (line). Це робить деяку основну попередню обробку, таку як токенізація, використання нижчих літер тощо, і повертає назад список лексем (слів). Документацію щодо цього методу попередньої обробки можна знайти на офіційному сайті документації Gensim.

Навчання моделі Word2Vec

Навчання моделі досить просте. Ви просто створюєте примірник Word2Vec і пропускаєте огляди, які ми читали на попередньому кроці. Отже, ми по суті передаємо список списків, де кожен список в основному списку містить набір токенів з огляду користувача. Word2Vec використовує всі ці маркери для внутрішнього створення словникового запасу. І під словниковим запасом я маю на увазі набір унікальних слів.

Після побудови словникового запасу нам просто потрібно зателефонувати, train(...)щоб розпочати навчання моделі Word2Vec. За лаштунками ми фактично тренуємо просту нейронну мережу з одним прихованим шаром. Але насправді ми не збираємось використовувати нейронну мережу після навчання. Натомість, мета - вивчити ваги прихованого шару. Ці ваги - це, по суті, вектори слів, які ми намагаємось вивчити.

Навчання набору даних Word2Vec OpinRank займає близько 10-15 хвилин. тож будьте терплячі під час запуску коду на цьому наборі даних

Найцікавіша частина - деякі результати!

Давайте вже перейдемо до цікавих речей! Оскільки ми тренувались на відгуках користувачів, було б непогано побачити подібність деяких прикметників. Цей перший приклад показує простий пошук слів, подібних до слова "брудний". Все, що нам тут потрібно зробити, - це викликати most_similarфункцію і надати слово «брудний» як позитивний приклад. Це повертає 10 найкращих подібних слів.

О, це виглядає досить добре. Давайте розглянемо більше.

Подібно до ввічливого:

Подібно до Франції:

Схоже на шокований:

Загалом, результати насправді мають сенс. Усі споріднені слова, як правило, використовуються в одному контексті для даного слова запиту.

Тепер ви навіть можете використовувати Word2Vec для обчислення подібності між двома словами в словниковому запасі, викликаючи similarity(...)функцію та передаючи відповідні слова.

Під капотом вищезазначені три фрагменти обчислюють подібність косинусів між двома зазначеними словами, використовуючи вектори слів кожного. З наведених вище оцінок має сенс, який dirtyдуже схожий на, smellyале dirtyнесхожий на clean. Якщо ви зробите подібність між двома однаковими словами, оцінка становитиме 1,0, оскільки діапазон оцінки подібності косинусів завжди буде між [0,0-1,0]. Детальніше про оцінку подібності косинусів ви можете прочитати тут.

Ви знайдете більше прикладів того, як ви могли використовувати Word2Vec у моєму блокноті Jupyter.

Детальніше розгляньте параметри параметрів

Щоб навчити модель раніше, нам довелося встановити деякі параметри. Тепер спробуємо зрозуміти, що означають деякі з них. Для довідки, це команда, яку ми використовували для навчання моделі.

model = gensim.models.Word2Vec (documents, size=150, window=10, min_count=2, workers=10)

size

Розмір щільного вектора, який повинен представляти кожну лексему або слово. Якщо у вас дуже обмежені дані, тоді розмір повинен бути набагато меншим. Якщо у вас багато даних, добре експериментувати з різними розмірами. Значення 100–150 добре спрацювало для мене при пошуку схожості.

window

The maximum distance between the target word and its neighboring word. If your neighbor’s position is greater than the maximum window width to the left or the right, then some neighbors are not considered as being related to the target word. In theory, a smaller window should give you terms that are more related. If you have lots of data, then the window size should not matter too much, as long as its not overly narrow or overly broad. If you are not too sure about this, just use the default value.

min_count

Minimium frequency count of words. The model would ignore words that do not statisfy the min_count. Extremely infrequent words are usually unimportant, so its best to get rid of those. Unless your dataset is really tiny, this does not really affect the model.

workers

How many threads to use behind the scenes?

When should you use Word2Vec?

There are many application scenarios for Word2Vec. Imagine if you need to build a sentiment lexicon. Training a Word2Vec model on large amounts of user reviews helps you achieve that. You have a lexicon for not just sentiment, but for most words in the vocabulary.

Beyond raw unstructured text data, you could also use Word2Vec for more structured data. For example, if you had tags for a million StackOverflow questions and answers, you could find related tags and recommend those for exploration. You can do this by treating each set of co-occuring tags as a “sentence” and train a Word2Vec model on this data. Granted, you still need a large number of examples to make it work.

Source code

To use this tutorial’s Jupyter Notebook, you can go to my GitHub repo and follow the instructions on how to get the notebook running locally. I plan to upload the pre-trained vectors which could be used for your own work.

To follow Kavita’s article via email, please subscribe to her blog.

This article was originally published at kavita-ganesan.com