Implementierung von Word2Vec mit der Gensim-Bibliothek in Python

Einführung

Menschen haben eine natürliche Fähigkeit zu verstehen, was andere Menschen sagen und was sie als Antwort darauf sagen sollen. Diese Fähigkeit wird durch die ständige Interaktion mit anderen Menschen und der Gesellschaft über viele Jahre hinweg entwickelt. Die Sprache spielt eine sehr wichtige Rolle bei der Interaktion zwischen Menschen. Sprachen, die Menschen zur Interaktion verwenden, werden als natürliche Sprachen bezeichnet.

Die Regeln der verschiedenen natürlichen Sprachen sind unterschiedlich. Eines haben die natürlichen Sprachen jedoch gemeinsam: Flexibilität und Evolution.

Natürliche Sprachen sind sehr, sehr flexibel. Nehmen wir an, Sie fahren Auto und Ihr Freund sagt eine der drei folgenden Äußerungen: „Halten Sie an“, „Stoppen Sie das Auto“, „Halt“. Sie verstehen sofort, dass er Sie auffordert, das Auto anzuhalten. Der Grund dafür ist, dass natürliche Sprachen extrem flexibel sind. Es gibt mehrere Möglichkeiten, eine Sache zu sagen.

Ein weiterer wichtiger Aspekt natürlicher Sprachen ist die Tatsache, dass sie sich ständig weiterentwickeln. Vor ein paar Jahren gab es zum Beispiel noch keinen Begriff wie „Google it“, der sich auf die Suche nach etwas in der Suchmaschine Google bezieht. Natürliche Sprachen entwickeln sich ständig weiter.

Im Gegensatz dazu folgen Computersprachen einer strengen Syntax. Wenn man einem Computer sagen will, dass er etwas auf dem Bildschirm ausgeben soll, gibt es dafür einen speziellen Befehl. Die Aufgabe der natürlichen Sprachverarbeitung besteht darin, Computer in die Lage zu versetzen, menschliche Sprache zu verstehen und zu erzeugen, und zwar in einer Weise, die dem Menschen ähnlich ist.

Das ist eine gewaltige Aufgabe, und es gibt viele Hürden. Diese Videovorlesung der University of Michigan erklärt sehr gut, warum NLP so schwierig ist.

In diesem Artikel werden wir die Word2Vec-Worteinbettungstechnik implementieren, die zur Erstellung von Wortvektoren mit der Gensim-Bibliothek von Python verwendet wird. Bevor wir jedoch direkt zur Programmierung übergehen, werden wir zunächst kurz einige der am häufigsten verwendeten Worteinbettungstechniken sowie deren Vor- und Nachteile erläutern.

Worteinbettungsansätze

Einer der Gründe, warum die Verarbeitung natürlicher Sprache ein schwer zu lösendes Problem ist, ist die Tatsache, dass Computer im Gegensatz zu Menschen nur Zahlen verstehen können. Wir müssen Wörter in einem numerischen Format darstellen, das für die Computer verständlich ist. Die Worteinbettung bezieht sich auf die numerische Darstellung von Wörtern.

Es gibt derzeit mehrere Ansätze zur Worteinbettung, die alle ihre Vor- und Nachteile haben. Wir werden hier drei davon besprechen:

  1. Wortbeutel
  2. TF-IDF Schema
  3. Word2Vec

Wortbeutel

Der Wortbeutel-Ansatz ist einer der einfachsten Ansätze zur Worteinbettung. Im Folgenden werden die Schritte zur Erzeugung von Worteinbettungen mit Hilfe des Bag-of-Words-Ansatzes beschrieben.

Anhand eines Beispiels werden wir uns die mit dem Bag-of-Words-Ansatz erzeugten Worteinbettungen ansehen. Nehmen wir an, Sie haben einen Korpus mit drei Sätzen.

  • S1 = I love rain
  • S2 = rain rain go away
  • S3 = I am away

Um die obigen Sätze mit Hilfe des Bag-of-Words-Ansatzes in ihre entsprechenden Worteinbettungen umzuwandeln, müssen wir die folgenden Schritte durchführen:

Beachten Sie, dass wir für S2 anstelle von „Regen“ im Wörterbuch eine 2 hinzugefügt haben; das liegt daran, dass S2 zweimal „Regen“ enthält.

Vor- und Nachteile der Wortsackmethode

Die Wortsackmethode hat sowohl Vor- als auch Nachteile. Der Hauptvorteil des Bag of Words-Ansatzes ist, dass man keinen sehr großen Korpus an Wörtern benötigt, um gute Ergebnisse zu erzielen. Sie sehen, dass wir ein sehr einfaches Bag-of-Words-Modell mit drei Sätzen erstellen. Rechnerisch ist ein Bag-of-Words-Modell nicht sehr komplex.

Ein großer Nachteil des Bag-of-Words-Ansatzes ist die Tatsache, dass wir riesige Vektoren mit leeren Stellen erstellen müssen, um eine Zahl darzustellen (dünn besetzte Matrix), was Speicher und Platz verbraucht. Im vorherigen Beispiel hatten wir nur 3 Sätze. Dennoch sehen Sie drei Nullen in jedem Vektor.

Stellen Sie sich einen Korpus mit Tausenden von Artikeln vor. In einem solchen Fall kann die Anzahl der eindeutigen Wörter in einem Wörterbuch Tausende betragen. Wenn ein Dokument 10 % der eindeutigen Wörter enthält, wird der entsprechende Einbettungsvektor immer noch 90 % Nullen enthalten.

Ein weiteres großes Problem mit dem Bag-of-Words-Ansatz ist die Tatsache, dass er keine Kontextinformationen enthält. Er kümmert sich nicht um die Reihenfolge, in der die Wörter in einem Satz erscheinen. So werden beispielsweise die Sätze „Die Flasche ist im Auto“ und „Das Auto ist in der Flasche“ gleich behandelt, obwohl es sich um völlig unterschiedliche Sätze handelt.

Eine Art von Bag-of-Words-Ansatz, die so genannten n-Gramme, kann dabei helfen, die Beziehung zwischen Wörtern zu erhalten. N-Gramm bezieht sich auf eine zusammenhängende Folge von n Wörtern. Zum Beispiel sind 2-Gramme für den Satz „Du bist nicht glücklich“, „Du bist“, „bist nicht“ und „nicht glücklich“. Obwohl der n-Gramm-Ansatz in der Lage ist, Beziehungen zwischen Wörtern zu erfassen, wächst die Größe der Merkmalsmenge bei zu vielen n-Grammen exponentiell an.

TF-IDF-Schema

Das TF-IDF-Schema ist eine Art von Bag-Words-Ansatz, bei dem anstelle von Nullen und Einsen im Einbettungsvektor fließende Zahlen hinzugefügt werden, die im Vergleich zu Nullen und Einsen mehr nützliche Informationen enthalten. Die Idee hinter dem TF-IDF-Schema ist die Tatsache, dass Wörter mit einer hohen Häufigkeit des Vorkommens in einem Dokument und einer geringeren Häufigkeit des Vorkommens in allen anderen Dokumenten für die Klassifizierung wichtiger sind.

TF-IDF ist ein Produkt aus zwei Werten: Term Frequency (TF) und Inverse Document Frequency (IDF).

Die Term Frequency gibt an, wie oft ein Wort in einem Dokument vorkommt, und kann wie folgt berechnet werden:

Term frequence = (Number of Occurences of a word)/(Total words in the document)

Betrachten wir beispielsweise den Satz S1 aus dem vorherigen Abschnitt, d.h. „I love rain“, so kommt jedes Wort in diesem Satz einmal vor und hat daher eine Häufigkeit von 1. Im Gegensatz dazu hat S2, d.h. „

IDF ist der Logarithmus der Gesamtzahl der Dokumente geteilt durch die Anzahl der Dokumente, in denen das Wort vorkommt, und kann wie folgt berechnet werden:

IDF(word) = Log((Total number of documents)/(Number of documents containing the word))

Der IDF-Wert für das Wort „rain“ beträgt beispielsweise 0,1760, da die Gesamtzahl der Dokumente 3 beträgt und „rain“ in 2 davon vorkommt, also ist log(3/2) 0,1760. Betrachtet man dagegen das Wort „Liebe“ im ersten Satz, so kommt es in einem der drei Dokumente vor, und sein IDF-Wert beträgt log(3), also 0,4771.

Vor- und Nachteile von TF-IDF

Trotz der Tatsache, dass TF-IDF eine Verbesserung gegenüber dem einfachen Bag-of-Words-Ansatz darstellt und bessere Ergebnisse für gängige NLP-Aufgaben liefert, bleiben die Vor- und Nachteile insgesamt die gleichen. Wir müssen immer noch eine riesige Sparse-Matrix erstellen, was auch viel mehr Berechnungen erfordert als der einfache Bag-of-Words-Ansatz.

Word2Vec

Der <a target=“_blank rel=“nofollow““ href=“https://en.wikipedia.org/wiki/Word2vec“>Word2Vec-Einbettungsansatz, der von Tomas Mikolov entwickelt wurde, gilt als Stand der Technik. Der Word2Vec-Ansatz verwendet Deep Learning und auf neuronalen Netzen basierende Techniken, um Wörter so in entsprechende Vektoren umzuwandeln, dass die semantisch ähnlichen Vektoren im N-dimensionalen Raum nahe beieinander liegen, wobei sich N auf die Dimensionen des Vektors bezieht.

Word2Vec liefert einige erstaunliche Ergebnisse. Die Fähigkeit von Word2Vec, semantische Beziehungen aufrechtzuerhalten, zeigt sich in einem klassischen Beispiel: Wenn man einen Vektor für das Wort „König“ hat und den Vektor, der durch das Wort „Mann“ repräsentiert wird, aus dem „König“ entfernt und „Frauen“ hinzufügt, erhält man einen Vektor, der dem „Königin“-Vektor nahe ist. Diese Beziehung wird üblicherweise wie folgt dargestellt:

King - Man + Women = Queen

Das Word2Vec-Modell gibt es in zwei Varianten: Skip-Gram-Modell und Continuous-Bag-of-Words-Modell (CBOW).

Beim Skip-Gram-Modell werden die Kontextwörter anhand des Basisworts vorhergesagt. Bei einem Satz wie „Ich liebe es, im Regen zu tanzen“ sagt das Skip-Gram-Modell beispielsweise „Liebe“ und „Tanz“ voraus, wenn das Wort „zu“ als Eingabe verwendet wird.

Das CBOW-Modell hingegen sagt „zu“ voraus, wenn die Kontextwörter „Liebe“ und „Tanz“ als Eingabe in das Modell eingegeben werden. Das Modell lernt diese Beziehungen mithilfe von tiefen neuronalen Netzen.

Vor- und Nachteile von Word2Vec

Word2Vec hat mehrere Vorteile gegenüber Bag of Words und IF-IDF-Schema. Word2Vec behält die semantische Bedeutung der verschiedenen Wörter in einem Dokument bei. Die Kontextinformationen gehen nicht verloren. Ein weiterer großer Vorteil des Word2Vec-Ansatzes ist, dass die Größe des Einbettungsvektors sehr klein ist. Jede Dimension im Einbettungsvektor enthält Informationen über einen Aspekt des Wortes. Im Gegensatz zu Bag of Words und TF-IDF-Ansätzen benötigen wir keine riesigen spärlichen Vektoren.

Hinweis: Die mathematischen Details der Funktionsweise von Word2Vec beinhalten eine Erklärung von neuronalen Netzen und Softmax-Wahrscheinlichkeit, die den Rahmen dieses Artikels sprengen würde. Wenn Sie die mathematischen Grundlagen von Word2Vec verstehen wollen, lesen Sie bitte diesen Artikel: https://arxiv.org/abs/1301.3781

Word2Vec in Python mit der Gensim-Bibliothek

In diesem Abschnitt werden wir das Word2Vec-Modell mit Hilfe der Gensim-Bibliothek von Python implementieren. Folgen Sie diesen Schritten:

Korpus erstellen

Wir haben bereits besprochen, dass wir für die Erstellung eines Word2Vec-Modells einen Korpus benötigen. In realen Anwendungen werden Word2Vec-Modelle mit Milliarden von Dokumenten erstellt. Das Word2Vec-Modell von Google zum Beispiel wird mit 3 Millionen Wörtern und Sätzen trainiert. Der Einfachheit halber werden wir jedoch ein Word2Vec-Modell mit einem einzigen Wikipedia-Artikel erstellen. Unser Modell wird nicht so gut sein wie das von Google. Dennoch ist es gut genug, um zu erklären, wie das Word2Vec-Modell mit der Gensim-Bibliothek implementiert werden kann.

Bevor wir Wikipedia-Artikel zusammenfassen können, müssen wir sie abrufen. Dazu werden wir einige Bibliotheken verwenden. Die erste Bibliothek, die wir herunterladen müssen, ist die Beautiful Soup-Bibliothek, ein sehr nützliches Python-Dienstprogramm für Web Scraping. Führen Sie den folgenden Befehl an der Eingabeaufforderung aus, um das Beautiful Soup-Dienstprogramm herunterzuladen.

$ pip install beautifulsoup4

Eine weitere wichtige Bibliothek, die wir zum Parsen von XML und HTML benötigen, ist die lxml-Bibliothek. Führen Sie den folgenden Befehl an der Eingabeaufforderung aus, um lxml herunterzuladen:

$ pip install lxml

Der Artikel, den wir scrapen wollen, ist der Wikipedia-Artikel über künstliche Intelligenz. Schreiben wir ein Python-Skript, um den Artikel aus Wikipedia zu lesen:

In dem obigen Skript laden wir zunächst den Wikipedia-Artikel mit der Methode urlopen der Klasse request der Bibliothek urllib herunter. Dann lesen wir den Inhalt des Artikels und parsen ihn mit einem Objekt der Klasse BeautifulSoup. Wikipedia speichert den Textinhalt des Artikels in p-Tags. Wir verwenden die find_all-Funktion des BeautifulSoup-Objekts, um alle Inhalte aus den Absatz-Tags des Artikels zu holen.

Schließlich fügen wir alle Absätze zusammen und speichern den gescrapten Artikel in der article_text-Variablen für die spätere Verwendung.

Vorverarbeitung

An dieser Stelle haben wir nun den Artikel importiert. Der nächste Schritt besteht darin, den Inhalt für das Word2Vec-Modell vorzuverarbeiten. Das folgende Skript verarbeitet den Text vor:

Im obigen Skript wird der gesamte Text in Kleinbuchstaben umgewandelt und anschließend werden alle Ziffern, Sonderzeichen und zusätzlichen Leerzeichen aus dem Text entfernt. Nach der Vorverarbeitung bleiben nur noch die Wörter übrig.

Das Word2Vec-Modell wird mit einer Sammlung von Wörtern trainiert. Zunächst müssen wir unseren Artikel in Sätze umwandeln. Wir verwenden das Dienstprogramm nltk.sent_tokenize, um unseren Artikel in Sätze umzuwandeln. Um Sätze in Wörter umzuwandeln, verwenden wir das Dienstprogramm nltk.word_tokenize. Als letzten Schritt der Vorverarbeitung entfernen wir alle Stoppwörter aus dem Text.

Nach der Ausführung des Skripts enthält das Objekt all_words die Liste aller Wörter im Artikel. Wir werden diese Liste verwenden, um unser Word2Vec-Modell mit der Gensim-Bibliothek zu erstellen.

Erstellen des Word2Vec-Modells

Mit Gensim ist es äußerst einfach, ein Word2Vec-Modell zu erstellen. Die Wortliste wird an die Word2VecKlasse des gensim.modelsPakets übergeben. Wir müssen den Wert für den Parameter min_count angeben. Ein Wert von 2 für min_count legt fest, dass nur die Wörter in das Word2Vec-Modell aufgenommen werden, die mindestens zweimal im Korpus vorkommen. Das folgende Skript erstellt das Word2Vec-Modell anhand des Wikipedia-Artikels, den wir ausgewertet haben.

from gensim.models import Word2Vecword2vec = Word2Vec(all_words, min_count=2)

Um das Wörterbuch der eindeutigen Wörter zu sehen, die mindestens zweimal im Korpus vorkommen, führen Sie das folgende Skript aus:

vocabulary = word2vec.wv.vocabprint(vocabulary)

Wenn das obige Skript ausgeführt wird, sehen Sie eine Liste aller eindeutigen Wörter, die mindestens zweimal vorkommen.

Modellanalyse

Im letzten Abschnitt haben wir unser Word2Vec-Modell erfolgreich erstellt. Jetzt ist es an der Zeit zu untersuchen, was wir erstellt haben.

Finden von Vektoren für ein Wort

Wir wissen, dass das Word2Vec-Modell Wörter in ihre entsprechenden Vektoren umwandelt. Schauen wir uns an, wie wir die Vektordarstellung eines bestimmten Wortes betrachten können.

v1 = word2vec.wv

Der Vektor v1 enthält die Vektordarstellung für das Wort „artificial“. Standardmäßig wird von Gensim Word2Vec ein hundertdimensionaler Vektor erzeugt. Dies ist ein viel, viel kleinerer Vektor im Vergleich zu dem, der durch Bag of Words erzeugt worden wäre. Wenn wir für die Einbettung des Artikels den Bag-of-Words-Ansatz verwenden, beträgt die Länge des Vektors für jedes Wort 1206, da es 1206 eindeutige Wörter mit einer Mindesthäufigkeit von 2 gibt. Wenn die Mindesthäufigkeit auf 1 gesetzt wird, nimmt die Größe des Bag-of-Words-Vektors weiter zu. Andererseits werden die mit Word2Vec erzeugten Vektoren nicht von der Größe des Vokabulars beeinflusst.

Finden ähnlicher Wörter

Wir haben bereits gesagt, dass die Kontextinformationen der Wörter bei der Verwendung von Word2Vec nicht verloren gehen. Wir können dies überprüfen, indem wir alle Wörter finden, die dem Wort „Intelligenz“ ähnlich sind.

Schauen Sie sich das folgende Skript an:

sim_words = word2vec.wv.most_similar('intelligence')

Wenn Sie die Variable sim_words auf der Konsole ausgeben, sehen Sie die Wörter, die „Intelligenz“ am ähnlichsten sind, wie unten gezeigt:

Aus der Ausgabe können Sie die Wörter, die „Intelligenz“ ähnlich sind, zusammen mit ihrem Ähnlichkeitsindex sehen. Das Wort „ai“ ist dem Modell zufolge das Wort, das dem Wort „Intelligenz“ am ähnlichsten ist, was auch Sinn macht. Auch Wörter wie „menschlich“ und „künstlich“ kommen häufig gemeinsam mit dem Wort „Intelligenz“ vor. Unser Modell hat diese Beziehungen erfolgreich mit nur einem einzigen Wikipedia-Artikel erfasst.

Schlussfolgerung

In diesem Artikel haben wir ein Word2Vec-Worteinbettungsmodell mit der Gensim-Bibliothek von Python implementiert. Dazu haben wir einen Wikipedia-Artikel gescrapt und unser Word2Vec-Modell mit dem Artikel als Korpus erstellt. Wir haben auch kurz die am häufigsten verwendeten Word-Embedding-Ansätze mit ihren Vor- und Nachteilen im Vergleich zu Word2Vec untersucht.

Ich würde Ihnen vorschlagen, ein eigenes Word2Vec-Modell mit Hilfe eines beliebigen Textkorpus zu erstellen und zu sehen, ob Sie bessere Ergebnisse als mit dem Bag-of-Words-Ansatz erzielen können.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.