In einer Welt voller digitaler Informationen gewinnen effiziente Suchmaschinen immer mehr an Bedeutung. Für viele Webentwickler, Blogger oder auch IT-Interessierte stellt sich die Frage, wie man eine eigene Suchmaschine aufbauen kann, die nicht auf externe Dienste angewiesen ist und seinen eigenen Content intelligent durchsucht. Die Antwort darauf liegt in modernen Techniken der natürlichen Sprachverarbeitung wie Word Embeddings und der Vektor-Ähnlichkeit. Mit vergleichsweise wenig Code und Ressourcen lässt sich so eine einfache, aber wirkungsvolle Suchmaschine von Grund auf selbst entwickeln. Im Folgenden erfahren Sie ausführlich, wie dieses Vorgehen aussehen könnte.
Der Kern einer solchen Suchmaschine ist die Fähigkeit, Wörter und Texte in einem mathematischen Raum darzustellen, in dem semantische Ähnlichkeiten messbar sind. Dazu verwendet man sogenannte Word Embeddings. Diese sind Vektoren, die Wörter in einem mehrdimensionalen Raum abbilden, sodass semantisch ähnliche Wörter nah beieinander liegen. Das populäre Word2Vec-Modell ist ein solches Verfahren zur Generierung dieser Wort-Einbettungen. Es wurde von Forschern bei Google entwickelt und ermöglicht es mit neuronalen Netzen, Wörter basierend auf ihrem Kontext darzustellen.
Der Clou: Statt Wörter nur als Buchstabenketten zu betrachten, werden sie durch Zahlenvektoren repräsentiert, die Bedeutungsäquivalenz abbilden können. Erste Schritte mit Word2Vec-Embeddings bestehen darin, eine umfangreiche Datenbasis zu laden. Diese besteht meist aus einem Nachschlagewerk von Wörtern und ihren zugehörigen 300-dimensionalen Vektoren. Für ein kleines Projekt können etwa die meistgenutzten 10.000 Wörter und deren Embeddings ausreichen.
Diese Daten liegen häufig in Form eines Python-Pickle-Files vor, das sich einfach einlesen lässt. Dabei gilt es rechtliche und sicherheitstechnische Aspekte zu beachten, weshalb man mit vertrauenswürdigen Quellen arbeiten sollte. Haben Sie die Embeddings geladen, können Sie beliebige Wörter in Vektoren umwandeln. Für die Suche ist es wichtig, auch ganze Textabschnitte zu verarbeiten. Dafür werden alle im Dokument enthaltenen Wörter einzeln eingebettet und ihre Vektoren addiert.
Dieses Summieren führt zu einem Vektor, der den gesamten Text repräsentiert, ohne dabei die Wortreihenfolge zu berücksichtigen. Zwar ist diese Methode einfach, hat sich aber in vielen Fällen als effektiv erwiesen. Problematiken entstehen, wenn Wörter unbekannt sind oder nicht im Embedding-Vokabular vorkommen. Diese werden in der Regel ignoriert, was die Robustheit des Systems erhöht. Zusätzlich sollten Texte vor der Einbettung bereinigt und normalisiert werden.
Das bedeutet, Groß- und Kleinschreibung wird vereinheitlicht, Sonderzeichen eliminiert und der gesamte Inhalt in eine rein alphabetische Form gebracht, um besser vergleichbare Ergebnisse zu erzielen. Die Ähnlichkeit zwischen einem Suchbegriff und Dokumenten wird durch die Berechnung der Cosinus-Ähnlichkeit zwischen den jeweiligen Vektoren bestimmt. Die Cosinus-Ähnlichkeit misst den Winkel zwischen zwei Vektoren im Raum und liefert einen Wert zwischen -1 und 1, der Aufschluss darüber gibt, wie ähnlich sich zwei Texte semantisch sind. Dabei ist gerade die Robustheit des Verfahrens entscheidend: Dokumente, die das gesuchte Thema unterschiedlich oft behandeln, jedoch sinngemäß ähnlich sind, bekommen dennoch eine hohe Bewertung. Der Vorteil gegenüber einfachen Distanzmaßen wie der euklidischen Entfernung liegt darin, dass nur die Richtung des Vektors relevant ist, nicht seine Länge.
Sind alle Blogposts oder Dokumente einmal entsprechend eingebettet, lässt sich eine Suchanfrage einfach verarbeiten. Der eingegebene Text wird genauso normalisiert und eingebettet wie alle Dokumente. Anschließend vergleicht man den Query-Vektor mit allen Dokumentvektoren per Cosinus-Ähnlichkeit und sortiert die Ergebnisse nach Relevanz. Die Top-Ergebnisse können dann ausgegeben werden. Ein kleines Python-Programm kann dazu eine sogenannte REPL-Schnittstelle (Read-Eval-Print Loop) bieten, in der Nutzer ihre Sucheingaben direkt eingeben und die Suchergebnisse live sehen können.
Für größere oder öffentlich zugängliche Anwendungen ist ein reiner Terminal-Interface jedoch nicht ideal. Daher empfiehlt es sich, eine webbasierte Oberfläche zu schaffen. Dabei spielt eine clevere Speicher- und Abfragelogik eine Rolle, damit Nutzer nicht die gesamte Datenbasis herunterladen müssen. Eine Möglichkeit besteht darin, die Embeddings auf mehrere Dateien aufzuteilen und mit sogenannten HTTP-Range Requests nur die benötigten Teile dynamisch zu laden. Besonders geschickt ist eine Trennung zwischen einem Index, der nur die Wortpositionen und -größen enthält, und den eigentlichen Vektordaten.
Mit JavaScript lässt sich dann direkt im Browser die Suchanfrage verarbeiten, indem Vektoren gezielt nachgeladen und verglichen werden, ohne eine große Datenmenge zu übertragen. Bei der Entwicklung einer eigenen Suchmaschine sollte man die Suchqualität regelmäßig evaluieren. Dazu bietet sich ein Test-Datensatz an, der aus Paaren von Dokumenten und passenden Suchbegriffen besteht. Man misst zum Beispiel, wie häufig das korrekte Dokument innerhalb der Top-k-Ergebnisse auftaucht. Dieses Verfahren nennt man Top-k-Accuracy.
Die Ergebnisse geben Einblicke, welche Anzahl von Suchbegriffen die besten Treffer liefert und wie zuverlässig die Methode funktioniert. Häufig zeigt sich, dass zusätzliche, relevante Suchbegriffe die Treffergenauigkeit steigern, allerdings mit abnehmendem Zugewinn – eine klassische Erscheinung als „diminishing returns“. Obwohl die Einbettung von Wörtern mittels Word2Vec oft sehr gute Resultate erzeugt, bleibt Raum für Verbesserungen. Eine Variante ist, die Wichtigkeit einzelner Wörter durch TF-IDF-Faktoren zu gewichten. Dabei reduziert man die Relevanz von häufig vorkommenden, wenig aussagekräftigen Wörtern und hebt singularere, spezifischere Begriffe hervor.
Dies führt zu einer noch gezielteren und präziseren Suche. Generell bieten moderne natürliche Sprachverarbeitungsmodelle und Information-Retrieval-Methoden zahlreiche Möglichkeiten, eine einfache Suchmaschine durch Erweiterungen zu optimieren. Zusammenfassend ist es mit relativ geringem Aufwand möglich, eine elementare Suchmaschine eigenständig zu bauen, die auf Wortvektoren und mathematischer Ähnlichkeit basiert. Im Vergleich zu klassischen Indizierungsverfahren oder Google-gestützten Lösungen ermöglicht dies mehr Flexibilität, Kontrolle und das Lernen tiefgreifender Konzepte der künstlichen Intelligenz. Gleichzeitig sind die zugrundeliegenden Algorithmen intuitiv genug, um als Lernerfahrung für Programmierer und Data Scientists zu dienen.
Wer also seine digitalen Inhalte gezielt durchsuchbar machen möchte und sich auf die Technik dahinter einlassen will, kann schon mit wenigen hundert Zeilen Code eine effektive Suchfunktion erstellen und so Nutzererfahrungen nachhaltig verbessern.