Visualizing Embeddings

Inhaltsverzeichnis

Visualisierung selbst trainierter Embeddings

Bitte beachten Sie, dass dieser Blogartikel auf unserem vorherigen Blogpost „Sentiment Analyse“ aufbaut. Sie erfahren in diesem Teil, wie wir die Ergebnisse aus der Sentiment Analyse verwenden, um sowohl ein Wort- als auch ein Kommentar-Embedding unserer selbst trainierten Modelle zu visualisieren. Zur Widerholung: Ein Embedding ist ein Mapping zwischen einer Kategorie, also einem Wort oder einem Kommentar, und einem Vektor der Länge 𝑥x (in unserem Fall, 𝑥=100x=100). Dabei ist nicht wichtig, welche Zahlen in einem einzelnen Vektor stehen. Man erhofft sich durch das Embedding, dass die Vektoren bei häufig zusammen verwendete Wörter / Kommentare nah beieinander im 𝑥x dimensionalen Raum liegen.

Wort-Embeddings

Um die Wort-Embeddings zu erhalten, müssen wir auf die Zwischenergebnisse des Wort-Embedding Zellenblocks unseres bereits trainierten Modells zugreifen. Da dieser Zellenblock jedoch ein Wort-Embedding für jedes Wort in jedem Kommentar zurückgibt und da sich viele Wörter in vielen Kommentaren wiederholen, würden wir viele Wort-Embeddings doppelt und dreifach berechnen. Deshalb erzeugen wir ein zusätzliches Hilfsmodell, welches lediglich die Embeddings für jedes einzigartige Wort erzeugt. Diesem Hilfsmodell übergeben wir zunächst die Gewichte, die der Wort-Embedding Zellenblock von unserem bereits trainiertem Modell selbst erlernt hat und danach werden wir die Wortindices aller einzigartigen Wörter in dieses Hilfsmodell einfüttern. Das Ergebnis für jeden Wortindex ist dann ein Embedding-Vektor der Länge 100.

Wort-Embeddings visualisieren

Danach werden wir unsere selbst erlernten Wort-Embeddings grafisch darstellen. Auf der Webseite https://projector.tensorflow.org/ kann man eine Embedding Datei mit den dazu gehörenden Metainformationen (Wort und Frequenz in unserem Fall) hochladen und grafisch darstellen lassen. Da die Webseite nur Tab-Separated-Values (TSV) Dateien akzeptiert, müssen wir unsere Embeddingvektoren in eine TSV Datei umwandeln und abspeichern. Daraufhin laden wir diese TSV Dateien hoch und betrachten dann das Ergebnis.

In dem unteren Codeblock laden wir zuerst das Tokenizer Object von unserem ersten Blogpost ein, welches wir z.B. für die Generation der Metadaten benötigen. Es folgen beide Modelle. Damit erzeugen wir die Wort-Embedding Dateien unserer Funktion create_word_embedding_files().

In [ ]:
# Reading in the tokenizer object from the first blog post
with open(os.path.join("results", "tokenizer.pickledump"), "rb") as f:
    tokenizer = pickle.load(f)

# Reading in the models from the first blogpost (optimal epochs of the naive model and the weighted model are 2 and 1 respectively)
naive_model = load_model(os.path.join("models", "naive_model", "weights.{:02d}.hdf5".format(2)), compile=False)
weighted_model = load_model(os.path.join("models", "0.1_0.9_model", "weights.{:02d}.hdf5".format(1)), compile=False)

# Creating word embeddings for the naive model and weighted model
create_word_embedding_files(tokenizer, model=naive_model, model_name="naive_model")
create_word_embedding_files(tokenizer, model=weighted_model, model_name="0.1_0.9_model")

Wort-Embeddings des naiven Modells

In [ ]:
### Abbildung 1
Image(os.path.join("images", "naive_model_word_embedding_1.png"), width=WIDTH, height=HEIGHT)
Out[ ]:
, breos
In [ ]:
### Abbildung 2
Image(os.path.join("images", "naive_model_word_embedding_2.png"), width=WIDTH, height=HEIGHT)
Out[ ]: