Как да започнем с 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 наистина работещ за вас е да имате много и много текстови данни в съответния домейн. Например, ако целта ви е да изградите лексикон на настроението, използването на набор от данни от медицински домейн или дори Wikipedia може да не е ефективно. Така че, изберете вашия набор от данни разумно.

За този урок ще използвам данни от набора от данни OpinRank от някои от моите докторски работи. Този набор от данни съдържа пълни потребителски отзиви за автомобили и хотели. Специално събрах всички отзиви за хотели в един голям файл, който е около 97 MB компресиран и 229 MB некомпресиран. За този урок ще използваме компресирания файл. Всеки ред в този файл представлява отзив за хотел.

Сега, нека разгледаме по-отблизо тези данни по-долу, като отпечатаме първия ред.

Трябва да видите следното:

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-те подобни думи.

О, това изглежда доста добре. Нека разгледаме повече.

Подобно на учтив:

Подобно на Франция:

Подобно на шокиран:

Като цяло резултатите всъщност имат смисъл. Всички свързани думи са склонни да се използват в един и същ контекст за дадената дума за заявка.

Now you could even use Word2Vec to compute similarity between two words in the vocabulary by invoking the similarity(...) function and passing in the relevant words.

Under the hood, the above three snippets compute the cosine similarity between the two specified words using word vectors of each. From the scores above, it makes sense that dirty is highly similar to smelly but dirty is dissimilar to clean. If you do a similarity between two identical words, the score will be 1.0 as the range of the cosine similarity score will always be between [0.0-1.0]. You can read more about cosine similarity scoring here.

You will find more examples of how you could use Word2Vec in my Jupyter Notebook.

A closer look at the parameter settings

To train the model earlier, we had to set some parameters. Now, let’s try to understand what some of them mean. For reference, this is the command that we used to train the model.

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

size

The size of the dense vector that is to represent each token or word. If you have very limited data, then size should be a much smaller value. If you have lots of data, its good to experiment with various sizes. A value of 100–150 has worked well for me for similarity lookups.

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