Content-Gap-Analyse mit KNIME:

Vektor-Embeddings generieren und clustern (Teil zwei)

Rebecca Schwarz
Rebecca Schwarz

Rebecca Schwarz ist SEO-Consultant bei der get traction GmbH und verantwortet Projekte unterschiedlicher Produktsegmente (News, E-Commerce, B2B). Ihr Arbeitsalltag dreht sich um die Konzeption von SEO-Strategien und die Unterstützung von Kunden im redaktionellen SEO, wie Redaktionsworkshops und Entwicklung von Content-Strategien. Um größere Datenmengen zu verarbeiten und bei wiederkehrenden SEO-Tasks Zeit zu sparen, nutzt sie die Open-Source-Software KNIME und gibt hierzu auch regelmäßig Schulungen. Neben ihrer Rolle als Consultant teilt sie ihr Wissen als Speakerin auf bekannten Konferenzen.

Mehr von dieser Autorin

In diesem Artikel führt Rebecca Schwarz den KNIME-Workflow aus der letzten Ausgabe #93 wie angekündigt weiter.

Dort wurde beschrieben, wie Vektor-Embeddings von Seiteninhalten mithilfe des Screaming Frog generiert werden können. Anschließend wurden die Inhalte aufgrund dieser Embeddings in KNIME geclustert.

Um den Workflow nun zu ergänzen, soll jetzt sichtbar gemacht werden, um welche Themen es sich bei den gebildeten Clustern handelt. Dafür wird in den Workflow ein gewünschtes LLM (Large Language Model) angebunden bzw. über eine API angezapft. Im Workflow werden die Informationen der verschiedenen Cluster in einen Prompt eingebunden und an das LLM übergeben. Als Antwort gibt das LLM je ein Thema für jedes Cluster zurück. Das hilft, zu erkennen, wie eine KI die einzelnen Seiten eines Webauftritts thematisch einordnet, und lässt erkennen, ob der Content vom Website-Betreiber auch den richtigen Themenclustern zugeordnet wird.

Hinweise für KNIME-Anfänger

Die Software KNIME arbeitet mit sogenannten Knoten, die miteinander verbunden einen Workflow ergeben. Zu Beginn werden immer über einen READER-Knoten Daten in die Oberfläche eingelesen. In daran angebundenen Knoten werden die Daten entsprechend verändert, transformiert oder angereichert. Jeder Workflow endet normalerweise mit einem WRITER-Knoten, mit dem die Daten schlussendlich in eine Datei, zum Beispiel eine Excel-Datei, geschrieben werden. Anschließend kann mit dieser Datei dann im entsprechenden Programm ganz leicht weitergearbeitet werden.

Die größten Vorteile der Datensoftware im Allgemeinen sind, dass das Tool kostenfrei verwendbar ist und keine Programmierkenntnisse notwendig sind. Außerdem ist auch für ChatGPT die Software nicht unbekannt und kann bei Problemen mit der Konfiguration helfen.

Auf knime.com gibt es umfassende Anleitungen und Dokumentationen zur Einführung ins Tool. Passende SEO-Anwendungsfälle waren und sind außerdem Bestandteil vieler Ausgaben der Website Boosting seit Ausgabe 53 und unter einfach.st/alleknime online abrufbar.

Rückblick auf Teil eins: was bisher geschah

Bereits in der letzten Ausgabe wurde mit dem Workflow zur Erhebung von Content-Gaps begonnen. Damit alles in Teil zwei nachvollzogen werden kann, wird zunächst kurz zusammengefasst, was bisher vorliegt.

Folgende Schritte wurden bisher unternommen:

Zunächst erfolgte die Generierung der Vektor-Embeddings mithilfe des Screaming Frog für zwei Websites. Dieser Ablauf wurde für die eigene Website und einen direkten Konkurrenten durchgeführt. Als Nächstes wurden die beiden Datensätze in KNIME eingelesen.

Damit im Nachhinein zwischen den beiden Websites unterschieden werden kann, wurde jedem Datensatz eine weitere Spalte „Quelle“ hinzugefügt. Für die eigene Website wurde als Quelle der Wert „eigene Website“ und für die Konkurrenzseite wurde als Quelle der Wert „Wettbewerber“ vergeben. Anschließend wurden die Datensätze zusammengeführt, sodass aus den beiden Datensätzen ein gemeinsamer Datensatz wurde.

Des Weiteren wurden die Spalten der Vektor-Embeddings aufbereitet, damit eine Analyse der Cluster ermöglicht wird. Die Clusterung wurde mithilfe von k-Means, einem Algorithmus für die Clusterung, durchgeführt und schlussendlich so aufbereitet, dass erkennbar ist, welche URL zu welchem Cluster zugeordnet wurde.

Infobox am Rand

Keine Angst! Am Ende des Artikels gibt es einen Link zum fertigen KNIME-Workflow mit allen Konfigurationen, natürlich gemeinsam mit dem ersten Teil des Workflows.

Ergebnis von Teil eins

Als Ergebnis liegt aktuell ein Datensatz aller URLs vor. Zu jeder URL gibt es Einträge für Title, Meta Description, H1-Überschrift und das zugeordnete Cluster (Abbildung 1).

Im ersten Teil wurden an diesen Datensatz nun weitere Knoten angehängt, um die Daten genauer analysieren zu können, die Knoten GROUP BY und PIVOT.

Weiterarbeit am Workflow

Ziel der Weiterarbeit am Workflow ist es nun, herauszubekommen, um welches Thema es in jedem einzelnen Cluster geht, ohne das händisch und durch bloßes Nachdenken herauszufinden. Dazu müssen die Informationen so zusammengefasst werden, dass sie zeilenweise an ein LLM geschickt und geprüft werden können.

Benötigt wird für diesen Teil des Workflows:

  • Installation der KNIME-Umgebung ab Version 5
  • API-Key zu einem LLM (Gemini, Claude oder ChatGPT)

Zunächst wird dafür der Knoten GROUP BY konfiguriert (Abbildung 2).

Der Knoten GROUP BY funktioniert ähnlich wie das Excel-Äquivalent, der Pivot-Table. In der Konfiguration wird Folgendes angegeben:

  • Reiter „Groups“: die Spalte, nach der gruppiert werden soll hier: „Cluster“ (Abbildung 3, Ziffer 1)
  • Reiter „Manual Aggregation“: die Spalten, für die Informationen in der Gruppierung zur Verfügung gestellt werden sollen hier: Title, Meta Description, H1-Überschrift und URL (Abbildung 3, Ziffer 2)

Die Besonderheit bei der Aggregation der Daten im Reiter „Manual Aggregation“ ist, dass als Aggregationsmethode „Concatenate“ gewählt wird. Somit werden alle Werte einer Spalte hintereinandergeschrieben. Konkret: Pro Cluster werden alle Title hintereinandergeschrieben, die zu URLs gehören, die diesem Cluster zugeordnet sind. Besteht ein Cluster aus drei URLs, werden die drei zugehörigen Title dieses Clusters hintereinander in die Spalte „Title“ geschrieben.

Diese Methode wird für alle Angaben gewählt. Mit Bestätigung des Knotens und Rechtsklick auf „Execute“ ist das Datenset nun nach Clustern zusammengefasst und beinhaltet zusätzlich die verschiedenen Informationen über Title, Meta Description, H1-Überschrift und URL.

Erstellung des Prompts

Als Nächstes wird ein Prompt erstellt. Mit dessen Hilfe sollen alle Informationen je Cluster an ein LLM geschickt und ausgewertet werden. Damit das LLM das verarbeiten kann, werden die Informationen aus dem Datensatz mit einem Prompt verbunden.

Im Prompt wird Folgendes definiert:

  • Das LLM soll sich die mitgelieferten Informationen zu Title, Meta Description, H1-Überschrift und URL anschauen.
  • Es soll anhand der Gemeinsamkeiten ein Thema festlegen, das aus einem bis fünf Wörtern besteht.
  • Es soll keine Begründung liefern, sondern nur das Thema nennen.

Infobox am Rand

Der genaue Prompt ist im Workflow zu finden. Es ist jedoch sinnvoll, den Prompt mit Beispieldaten einmal im Frontend eines LLMs zu testen und zu untersuchen, ob das gewünschte Ziel erreicht wird.

Damit der Prompt nicht für jede Zeile neu geschrieben werden muss, wird mit Variablen gearbeitet. Über diese Variablen werden in den Prompt jeder Zeile die Informationen aus den entsprechenden Spalten eingefügt. Somit ist jeder Prompt individuell je Cluster.

Zur Verbindung der Variablen mit dem Prompt wird an den Knoten GROUP BY der Knoten STRING MANIPULATION angehängt (Abbildung 4).

In der Konfiguration des Knotens wird die Funktion „JOIN“ gewählt (Abbildung 5, Ziffer 1). Anschließend wird der Prompt eingegeben und mit den Variablen verknüpft (Abbildung 5, Ziffer 2). Die Variablen sind die Spaltennamen des Datensets und können mit Doppelklick auf Column List ausgewählt werden (Abbildung 5, Ziffer 3).

Ist der Prompt mit den Variablen verknüpft, wird im unteren Teil der Konfiguration noch die Spalte gewählt, in der der fertige Prompt an das Datenset angehängt werden soll. Für das Feld Append Column wird „Prompt“ gewählt (Abbildung 5, Ziffer 4).

Mit Ausführung des Knotens wird an jede Zeile ein individualisierter Prompt angehängt, der alle Informationen beinhaltet.

Box am RandTipp

Um zu prüfen, dass tatsächlich alle gewünschten Informationen mitgegeben wurden, kann einer der Prompts aus der Vorschau kopiert und in einen Texteditor wie NotePad eingefügt werden. So wird es übersichtlicher, da die Prompts mit allen Informationen sehr lang werden.

LLM für Prompt bereitstellen

Die Prompts sind nun bereit zur Abfrage an ein LLM. Damit das in KNIME direkt möglich ist, muss zunächst eine Verbindung zu einem LLM hergestellt werden. Im Workflow sind die Knoten zur Verbindung an drei unterschiedliche LLMs vorhanden, zu ChatGPT, Claude und Google Gemini. Es muss also nur einer der Knotensets verwendet werden (Abbildung 6).

Alle Knotensets sind gleich aufgebaut. Zunächst gibt es den Knoten CREDENTIALS CONFIGURATION, in dem der passende API-Key hinterlegt wird. In der Konfiguration wird der API-Key im Feld Password hinterlegt (Abbildung 7).

Anschließend erfolgt die Authentifizierung über einen AUTHENTICATOR-Knoten. Hier ist je die Einstellung „credentials“ zu wählen, um dem Knoten mitzugeben, wie der API-Key übergeben wird (Abbildung 8).

Im letzten Knoten des LLM-Sets muss noch das Modell ausgewählt werden, mit dem der Prompt abgefragt werden soll. Ist alles fertig ausgewählt, wird mit OK bestätigt. Nun kann mit Rechtsklick auf den letzten der drei Knoten und der Auswahl „EXECUTE“ das Set ausgeführt werden. Leuchtet die Ampel unterhalb der Knoten Grün, ist das LLM bereit, Prompts entgegenzunehmen.

Prompts an LLM schicken und abfragen

Nun werden die Prompts an das verbundene LLM geschickt. Zum Prompting wird der Knoten LLM PROMPTER verwendet. Dieser hat zwei Eingangsports. An den oberen Port wird das LLM-Knotenset angebunden. An den unteren Port wird der Knoten STRING MANIPULATION angebunden, in dem sich die fertigen Prompts befinden (Abbildung 9).

In

In der Konfiguration des Knotens LLM PROMPTER sind nur zwei Einstellungen vorzunehmen. Zum einen wird ausgewählt, in welcher Spalte sich der Prompt befindet, der an das LLM geschickt werden soll. Dies ist hier die Spalte „Prompt“. Zum anderen muss definiert werden, wie die neue Spalte heißen soll, in der die Antwort für den Prompt zurückgegeben wird. Diese Spalte wird hier „Response“ genannt (Abbildung 10).

Mit Ausführung des Knotens werden nun alle Prompts nacheinander an das LLM geschickt, abgefragt und die Antwort wird in die neu definierte Spalte geschrieben (Abbildung 11).

Aufbereitung der Daten

Wie immer werden die Daten am Ende noch etwas verschönert und lesbarer gemacht. Dazu wird hier ein Knoten COLUMN FILTER angefügt, um nur noch die relevanten Spalten im Datenset zu haben. Zusätzlich werden mit einem Knoten COLUMN RENAMER die Spalten umbenannt, die noch nicht klar interpretierbar sind. So wird die Spalte „Response“ zu „Themencluster“ umbenannt.

Anreicherung der Daten

Durch die Gruppierung des Datensets zu Beginn sind Informationen über die Quellen (eigene Website oder Wettbewerber) weggefallen. Außerdem fehlt nun auch die Information über die Mengengerüste der URLs je Quelle. Deshalb wird das aufbereitete Datenset nun noch mit diesen Informationen angereichert.

Der Trick dabei ist, dass auf Knoten aus dem Workflow zurückgegriffen wird, die zuvor diese Informationen beinhalteten. Wie in „Zurück in die Zukunft“ wird nun ein Schritt zurück zum Ausgangspunkt von Teil zwei des Workflows gegangen. Neben der Konfiguration des Knotens GROUP BY wurde in Abbildung 4 auch ein PIVOT-Knoten an das Datenset angehängt. Auf diesen Knoten wird nun zurückgegriffen.

Mithilfe des PIVOT-Knotens wird erreicht, dass Informationen, die in Zeilen standen, zu Spalten werden.

Vorher: Es gibt die Spalte „Quelle“, die für jede URL angibt, ob es sich um die eigene Website oder um die Website des Wettbewerbers handelt (Abbildung 12).

Nachher: Das Datenset ist umsortiert und die Information „eigene Website“ und „Wettbewerber“ ist eine Spalte geworden und zeigt die Anzahl der zugeordneten URLs je Cluster (Abbildung 12).

Die vollständige Konfiguration ist ausführlich in Teil eins des Artikels beschrieben.

Die Information über die Mengengerüste je Quelle sollen nun an das fertige Datenset angefügt werden. Dazu ist der sogenannte JOINER-Knoten (Abbildung 13, Ziffer 3) notwendig, das Äquivalent zu SVERWEIS() in Excel. In diesem werden Informationen aus dem PIVOT-Knoten (Abbildung 13, Ziffer 1) mit dem letzten Knoten COLUMN RENAMER (Abbildung 13, Ziffer 2) vereint.

Bei der Konfiguration im JOINER-Knoten wird als Referenzspalte „Cluster“ gewählt und mit der Methode „Matching rows“ vereint (Abbildung 14).

Mit Ausführung des Knotens ergibt sich ein angereichertes Datenset, das zeigt, in welchen Clustern sich wie viele URLs der eigenen Website befinden. Vor allem bei Clustern, in denen wenige oder keine eigenen URLs vorkommen, gibt es folglich Bedarf für eine Prüfung des Clusterthemas (Abbildung 15).

In diesem Workflow wurde exemplarisch gezeigt, wie eine Content-Gap-Analyse aussehen könnte, um neue Themen für die eigene Website zu finden. Wieder einmal zeigt sich dabei, wie vielseitig KNIME für Anwendungsfälle in der Suchmaschinenoptimierung ist. Viel Spaß beim Experimentieren. Der fertige Workflow ist wie immer im KNIME-Hub unter einfach.st/knime86 verfügbar und per Drag-and-drop in die eigene KNIME-Oberfläche einlesbar.

Bei Fragen und Anmerkungen zum Workflow kann gerne ein Austausch via E-Mail oder LinkedIn stattfinden.