Semantisch Suche mittels Python FastAPI

Im ersten Artikel bin ich bereits darauf eingegangen wie ihr eine REST-API in Python erstellen können. In diesem Artikel geht es darum, wie ihr diese für eine semantische Suche verwenden könnt. Was ist semantisch Suche? Bei der lexikalischen Suche werden eure Texte (z.B. Blog-Artikel auf eurer Website) nach den passenden Keywords durchsucht. Problem hierbei ist, dass Dokumente die nicht exakt die gleiche Schreibweise enthalten nicht gefunden werden. Such ihr z.B. nach öl-profit.de, so wird eine Seite die über ÖL Profit nicht gefunden, da die Schreibweise nicht identisch ist. Dieses Problem umgeht die semantisch Suche. Dabei werden Texte und Suchanfragen in einen Vektorraum abgebildet so dass ähnliche Wörter und Texte nah sind im Vektorraum. Auf die genaue Schreibweise kommt es dabei nicht mehr an, ebenfalls werden Synonyme und verwandte Begriffe dabei erkannt. Eine Suchanfrage wird dabei ebenfalls erst in so einen Vektor umgewandelt, bevor dann im Vektorraum nach passenden Dokumenten gesucht wird. Semantische Suche mittels Python Die semantische Suche ist in Python sehr einfach zu realisieren dank des sentence-transformers Projekts. Installiert dazu zuerst das Projekt:pip install sentence-transformersAnschließend könnt ihr eine sematische Suche wie folgt erzielen:from sentence_transformers import SentenceTransformer, util import torch embedder = SentenceTransformer('all-MiniLM-L6-v2') # Corpus with example sentences corpus = ['A man is eating food.', 'A man is eating a piece of bread.', 'The girl is carrying a baby.', 'A man is riding a horse.', 'A woman is playing violin.', 'Two men pushed carts through the woods.', 'A man is riding a white horse on an enclosed ground.', 'A monkey is playing drums.', 'A cheetah is running behind its prey.' ] corpus_embeddings = embedder.encode(corpus, convert_to_tensor=True) # Query sentences: queries = ['A man is eating pasta.', 'Someone in a gorilla costume is playing a set of drums.', 'A cheetah chases prey on across a field.'] # Find the closest 5 sentences of the corpus for each query sentence based on cosine similarity top_k = min(5, len(corpus)) for query in queries: query_embedding = embedder.encode(query, convert_to_tensor=True) # We use cosine-similarity and torch.topk to find the highest 5 scores cos_scores = util.os_sim(query_embedding, corpus_embeddings)[0] top_results = torch.topk(cos_scores, k=top_k) print("\n\n======================\n\n") print("Query:", query) print("\nTop 5 most similar sentences in corpus:") for score, idx in zip(top_results[0], top_results[1]): print(corpus[idx], "(Score: {:.4f})".format(score)) Semantische Suche als REST-API Abschließend können wir dies als REST-API mittels FastAPI verpacken.from typing import Optional from fastapi import FastAPI from sentence_transformers import SentenceTransformer, util import torch embedder = SentenceTransformer('all-MiniLM-L6-v2') # Corpus with example sentences corpus = ['A man is eating food.', 'A man is eating a piece of bread.', 'The girl is carrying a baby.', 'A man is riding a horse.', 'A woman is playing violin.', 'Two men pushed carts through the woods.', 'A man is riding a white horse on an enclosed ground.', 'A monkey is playing drums.', 'A cheetah is running behind its prey.' ] corpus_embeddings = embedder.encode(corpus, convert_to_tensor=True) app = FastAPI() @app.get("/suche/{query}") def read_item(query: str): query_embedding = embedder.encode(query, convert_to_tensor=True) cos_scores = util.pytorch_cos_sim(query_embedding, corpus_embeddings)[0] top_results = torch.topk(cos_scores, k=5) return top_resultsJede Suchanfrage wandeln wir zuerst den den Vektor um (query_embedding). Anschließend wird dieser Vektor mit allen Einträgen im Corpus verglichen und die top-5 Ergebnisse werden zurück geliefert. Fertig.

zum Artikel gehen

Einführung FastAPI

Hier ein etwas ungewöhnlicher Artikel für eine PHP-Website: Wie erstelle ich mittels Python eine REST-API? Zum Glück ist Python schnell gelernt, und dank FastAPI lassen sich innerhalb weniger Minuten diese Modelle in eine nette REST API verpacken und ande

zum Artikel gehen

Redundante Inhalte mittels semantischer Suche entdecken

Seid ihr Betreiber einer Online Community, z.B. von einem großen Forum, so passiert es schnell das Fragen mehrfach gestellt werden. Oft werden sogar immer die gleichen Fragen immer wieder gestellt. Hier ist es hilfreich, diese Fragen zuerst zu identifizie

zum Artikel gehen

Suche Datenblatt

Guten Abend in die Runde, ich bin auf der Suche nach einem Datenblatt für den Motor FSM 126 a1.076 E. Wir haben einen Kunden, der diesen Motor in seinen Fait 500 eingebaut hat und soll das ganze jetzt legal für den deutschen Straßenverkehr machen. Mittel

zum Artikel gehen

Python-Entwickler (m/w/d)

Als Werkstudierender, in Teil- oder Vollzeit Du kennst Dich bestens in der Programmierung mit Phyton aus? Du begeisterst Dich für aktuelle Trends und willst in einem anspruchsvollen Job Deine Expertise einbringen? Dann bewirb Dich jetzt und werde Teil

zum Artikel gehen

Softwareentwickler (m/w/d) für EGSE für Raumfahrtanwendungen

Verantwortlichkeiten: Mit Ihrem Fachwissen und Ihren Ideen sorgen Sie dafür, dass unsere neuen, hochwertigen Produkte die Anforderungen unserer Kunden erfüllen. Im Einzelnen sind Sie verantwortlich für: Definition, Planung und Entwicklung vielfältiger Ap

zum Artikel gehen