Wie Sie mit Word2Vec beginnen - und wie Sie es dann zum Laufen bringen

Die Idee hinter Word2Vec ist ziemlich einfach. Wir gehen davon aus, dass die Bedeutung eines Wortes von der Firma abgeleitet werden kann, die es führt. Dies ist analog zu dem Sprichwort: „ Zeig mir deine Freunde, und ich werde dir sagen, wer du bist.

Wenn Sie zwei Wörter haben, die sehr ähnliche Nachbarn haben (was bedeutet: Der Kontext, in dem sie verwendet werden, ist ungefähr der gleiche), dann sind diese Wörter wahrscheinlich in ihrer Bedeutung ziemlich ähnlich oder zumindest verwandt. Zum Beispiel werden die Wörter schockiert , entsetzt und erstaunt normalerweise in einem ähnlichen Kontext verwendet.

Mit dieser zugrunde liegenden Annahme können Sie Word2Vec verwenden, um ähnliche Konzepte aufzudecken, nicht verwandte Konzepte zu finden, Ähnlichkeiten zwischen zwei Wörtern zu berechnen und vieles mehr!

Auf das Geschäft

In diesem Tutorial erfahren Sie, wie Sie die Gensim-Implementierung von Word2Vec verwenden und tatsächlich zum Laufen bringen. Ich habe lange Beschwerden über schlechte Leistung im Allgemeinen gehört, aber es ist wirklich eine Kombination aus zwei Dingen: (1) Ihren Eingabedaten und (2) Ihren Parametereinstellungen .

Beachten Sie, dass die Trainingsalgorithmen im Gensim-Paket tatsächlich von Google aus der ursprünglichen Word2Vec-Implementierung portiert und um zusätzliche Funktionen erweitert wurden.

Importe und Protokollierung

Zuerst beginnen wir mit unseren Importen und erstellen eine Protokollierung:

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

Datensatz

Unsere nächste Aufgabe ist es, einen wirklich guten Datensatz zu finden. Das Geheimnis, damit Word2Vec wirklich für Sie funktioniert, besteht darin, viele, viele Textdaten in der entsprechenden Domäne zu haben. Wenn Sie beispielsweise ein Stimmungslexikon erstellen möchten, ist die Verwendung eines Datensatzes aus dem medizinischen Bereich oder sogar aus Wikipedia möglicherweise nicht effektiv. Wählen Sie Ihren Datensatz also mit Bedacht aus.

Für dieses Tutorial werde ich Daten aus dem OpinRank-Datensatz aus einigen meiner Doktorarbeiten verwenden. Dieser Datensatz enthält vollständige Nutzerkritiken zu Autos und Hotels. Ich habe alle Hotelbewertungen speziell in einer großen Datei zusammengefasst, die etwa 97 MB komprimiert und 229 MB unkomprimiert ist. Wir werden die komprimierte Datei für dieses Tutorial verwenden. Jede Zeile in dieser Datei repräsentiert eine Hotelbewertung.

Schauen wir uns diese Daten unten genauer an, indem wir die erste Zeile drucken.

Sie sollten Folgendes sehen:

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"

Sie können sehen, dass dies eine ziemlich gute, vollständige Rezension mit vielen Worten ist, und genau das wollen wir. Wir haben ungefähr 255.000 solcher Bewertungen in diesem Datensatz.

Um Verwirrung zu vermeiden, heißt es im Word2Vec-Tutorial von Gensim, dass Sie eine Folge von Sätzen als Eingabe an Word2Vec übergeben müssen. Sie können jedoch eine ganze Rezension als Satz (dh eine viel größere Textgröße) übergeben, wenn Sie über viele Daten verfügen und dies keinen großen Unterschied machen sollte. Am Ende verwenden wir den Datensatz nur, um alle benachbarten Wörter für ein bestimmtes Zielwort abzurufen.

Dateien in eine Liste einlesen

Nachdem wir einen kleinen Einblick in unseren Datensatz erhalten haben, können wir ihn in eine Liste einlesen, damit wir ihn an das Word2Vec-Modell weitergeben können. Beachten Sie im folgenden Code, dass ich die komprimierte Datei direkt lese. Ich mache auch eine milde Vorverarbeitung der Bewertungen mit gensim.utils.simple_preprocess (line). Dies führt einige grundlegende Vorverarbeitungen wie Tokenisierung, Kleinbuchstaben usw. durch und gibt eine Liste von Token (Wörtern) zurück. Die Dokumentation dieser Vorverarbeitungsmethode finden Sie auf der offiziellen Gensim-Dokumentationsseite.

Training des Word2Vec-Modells

Das Training des Modells ist ziemlich einfach. Sie instanziieren einfach Word2Vec und bestehen die Bewertungen, die wir im vorherigen Schritt gelesen haben. Wir geben also im Wesentlichen eine Liste von Listen weiter, wobei jede Liste in der Hauptliste eine Reihe von Token aus einer Benutzerbewertung enthält. Word2Vec verwendet all diese Token, um intern ein Vokabular zu erstellen. Und mit Vokabeln meine ich eine Reihe einzigartiger Wörter.

Nach dem Aufbau des Wortschatzes müssen wir nur noch anrufen train(...), um mit dem Training des Word2Vec-Modells zu beginnen. Hinter den Kulissen trainieren wir tatsächlich ein einfaches neuronales Netzwerk mit einer einzigen verborgenen Schicht. Aber wir werden das neuronale Netzwerk nach dem Training tatsächlich nicht nutzen. Stattdessen ist das Ziel, die Gewichte der verborgenen Schicht zu lernen. Diese Gewichte sind im Wesentlichen die Wortvektoren, die wir lernen möchten.

Das Training für den Word2Vec OpinRank-Datensatz dauert etwa 10 bis 15 Minuten. Bitte haben Sie etwas Geduld, während Sie Ihren Code für diesen Datensatz ausführen

Der lustige Teil - einige Ergebnisse!

Kommen wir schon zu den lustigen Sachen! Da wir auf User Reviews trainiert haben, wäre es schön, Ähnlichkeiten bei einigen Adjektiven zu sehen. Dieses erste Beispiel zeigt eine einfache Suche nach Wörtern, die dem Wort "schmutzig" ähnlich sind. Alles, was wir hier tun müssen, ist, die most_similarFunktion aufzurufen und das Wort "schmutzig" als positives Beispiel anzugeben. Dies gibt die Top 10 ähnlichen Wörter zurück.

Oh, das sieht ziemlich gut aus. Schauen wir uns mehr an.

Ähnlich höflich:

Ähnlich wie in Frankreich:

Ähnlich wie schockiert:

Insgesamt sind die Ergebnisse tatsächlich sinnvoll. Alle verwandten Wörter werden in der Regel im selben Kontext für das angegebene Abfragewort verwendet.

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