Gensim - Vektor & Modell
Hier lernen wir die Kernkonzepte von Gensim kennen, wobei der Schwerpunkt auf dem Vektor und dem Modell liegt.
Was ist Vektor?
Was ist, wenn wir auf die latente Struktur in unserem Korpus schließen wollen? Dazu müssen wir die Dokumente so darstellen, dass wir sie mathematisch manipulieren können. Eine beliebte Art der Darstellung besteht darin, jedes Korpusdokument als Vektor von Merkmalen darzustellen. Deshalb können wir sagen, dass der Vektor eine mathematisch bequeme Darstellung eines Dokuments ist.
Um Ihnen ein Beispiel zu geben, stellen wir ein einzelnes Merkmal unseres oben verwendeten Korpus als QS-Paar dar -
Q - Wie oft kommt das Wort Hello im Dokument erscheinen?
A - Null (0).
Q - Wie viele Absätze enthält das Dokument?
A - Zwei (2)
Die Frage wird im Allgemeinen durch ihre Ganzzahl-ID dargestellt, daher besteht die Darstellung dieses Dokuments aus einer Reihe von Paaren wie (1, 0.0), (2, 2.0). Eine solche Vektordarstellung ist bekannt alsdenseVektor. Warumdense, weil es eine explizite Antwort auf alle oben geschriebenen Fragen enthält.
Die Darstellung kann einfach wie (0, 2) sein, wenn wir alle Fragen im Voraus kennen. Eine solche Reihenfolge der Antworten (natürlich, wenn die Fragen im Voraus bekannt sind) ist dievector für unser Dokument.
Eine andere beliebte Art der Darstellung ist die bag-of-word (BoW)Modell. Bei diesem Ansatz wird jedes Dokument im Wesentlichen durch einen Vektor dargestellt, der die Häufigkeit jedes Wortes im Wörterbuch enthält.
Nehmen wir als Beispiel an, wir haben ein Wörterbuch, das die Wörter ['Hallo', 'Wie', 'Sind', 'Du'] enthält. Ein Dokument, das aus der Zeichenfolge „Wie geht es Ihnen?“ Besteht, wird dann durch den Vektor [0, 2, 1, 1] dargestellt. Hier sind die Einträge des Vektors in der Reihenfolge des Auftretens von "Hallo", "Wie", "Sind" und "Sie".
Vektor versus Dokument
Aus der obigen Erklärung des Vektors wird die Unterscheidung zwischen einem Dokument und einem Vektor fast verstanden. Aber um es klarer zu machen,document ist Text und vectorist eine mathematisch bequeme Darstellung dieses Textes. Leider verwenden manchmal viele Menschen diese Begriffe synonym.
Nehmen wir zum Beispiel an, wir haben ein beliebiges Dokument A, anstatt zu sagen: "Der Vektor, der dem Dokument A entspricht", sagten sie "der Vektor A" oder "das Dokument A". Dies führt zu großer Mehrdeutigkeit. Eine weitere wichtige Sache, die hier zu beachten ist, ist, dass zwei verschiedene Dokumente dieselbe Vektordarstellung haben können.
Korpus in Vektorliste umwandeln
Bevor wir ein Implementierungsbeispiel für die Konvertierung des Korpus in die Liste der Vektoren nehmen, müssen wir jedem Wort im Korpus eine eindeutige Ganzzahl-ID zuordnen. Dazu erweitern wir das Beispiel aus dem obigen Kapitel.
Beispiel
from gensim import corpora
dictionary = corpora.Dictionary(processed_corpus)
print(dictionary)
Ausgabe
Dictionary(25 unique tokens: ['computer', 'opinion', 'response', 'survey', 'system']...)
Es zeigt, dass in unserem Korpus 25 verschiedene Token enthalten sind gensim.corpora.Dictionary.
Implementierungsbeispiel
Wir können das Wörterbuch verwenden, um Token-Dokumente wie folgt in diese 5-Diemsional-Vektoren umzuwandeln:
pprint.pprint(dictionary.token2id)
Ausgabe
{
'binary': 11,
'computer': 0,
'error': 7,
'generation': 12,
'graph': 16,
'intersection': 17,
'iv': 19,
'measurement': 8,
'minors': 20,
'opinion': 1,
'ordering': 21,
'paths': 18,
'perceived': 9,
'quasi': 22,
'random': 13,
'relation': 10,
'response': 2,
'survey': 3,
'system': 4,
'time': 5,
'trees': 14,
'unordered': 15,
'user': 6,
'well': 23,
'widths': 24
}
In ähnlicher Weise können wir die Bag-of-Word-Darstellung für ein Dokument wie folgt erstellen:
BoW_corpus = [dictionary.doc2bow(text) for text in processed_corpus]
pprint.pprint(BoW_corpus)
Ausgabe
[
[(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1)],
[(2, 1), (5, 1), (6, 1), (7, 1), (8, 1), (9, 1), (10, 1)],
[(11, 1), (12, 1), (13, 1), (14, 1), (15, 1)],
[(14, 1), (16, 1), (17, 1), (18, 1)],
[(14, 1), (16, 1), (19, 1), (20, 1), (21, 1), (22, 1), (23, 1), (24, 1)]
]
Was ist ein Modell?
Was passiert, wenn wir den Korpus vektorisiert haben? Jetzt können wir es mit Modellen transformieren. Das Modell kann auf einen Algorithmus bezogen werden, der zum Transformieren einer Dokumentdarstellung in eine andere verwendet wird.
Wie wir bereits besprochen haben, werden Dokumente in Gensim als Vektoren dargestellt, daher können wir sie zwar als Transformation zwischen zwei Vektorräumen modellieren. Es gibt immer eine Trainingsphase, in der Modelle die Details solcher Transformationen lernen. Das Modell liest den Trainingskorpus während der Trainingsphase.
Modell initialisieren
Lassen Sie uns initialisieren tf-idfModell. Dieses Modell transformiert Vektoren aus der BoW-Darstellung (Bag of Words) in einen anderen Vektorraum, in dem die Frequenzzählungen gemäß der relativen Seltenheit jedes Wortes im Korpus gewichtet werden.
Implementierungsbeispiel
Im folgenden Beispiel werden wir das initialisieren tf-idfModell. Wir werden es auf unserem Korpus trainieren und dann die Zeichenfolge "Baumdiagramm" transformieren.
Beispiel
from gensim import models
tfidf = models.TfidfModel(BoW_corpus)
words = "trees graph".lower().split()
print(tfidf[dictionary.doc2bow(words)])
Ausgabe
[(3, 0.4869354917707381), (4, 0.8734379353188121)]
Sobald wir das Modell erstellt haben, können wir den gesamten Korpus über tfidf transformieren und indizieren und die Ähnlichkeit unseres Abfragedokuments (wir geben das Abfragedokument 'Baumsystem' an) mit jedem Dokument im Korpus abfragen.
Beispiel
from gensim import similarities
index = similarities.SparseMatrixSimilarity(tfidf[BoW_corpus],num_features=5)
query_document = 'trees system'.split()
query_bow = dictionary.doc2bow(query_document)
simils = index[tfidf[query_bow]]
print(list(enumerate(simils)))
Ausgabe
[(0, 0.0), (1, 0.0), (2, 1.0), (3, 0.4869355), (4, 0.4869355)]
Aus der obigen Ausgabe geht hervor, dass Dokument 4 und Dokument 5 einen Ähnlichkeitswert von etwa 49% aufweisen.
Darüber hinaus können wir diese Ausgabe für eine bessere Lesbarkeit wie folgt sortieren:
Beispiel
for doc_number, score in sorted(enumerate(sims), key=lambda x: x[1], reverse=True):
print(doc_number, score)
Ausgabe
2 1.0
3 0.4869355
4 0.4869355
0 0.0
1 0.0