\n\n\n\n Mein Python Fuzzy Matching für bessere Bot NLU - AI7Bot \n

Mein Python Fuzzy Matching für bessere Bot NLU

📖 12 min read2,389 wordsUpdated Mar 30, 2026

Hallo zusammen, hier ist Marcus von ai7bot.com. Es ist der 27. März 2026, und ich beschäftige mich in meinen eigenen Bot-Projekten derzeit mit etwas ziemlich Speziellem: Bots so zu gestalten, dass sie weniger wie… na ja, Bots wirken. Vielmehr sollen sie tatsächlich *verstehen*, was du sagst, selbst wenn deine Worte ein bisschen durcheinander sind. Vergiss für einen Moment die fancy, teuren NLU-Dienste. Ich spreche von etwas viel Grundnäherem und, offen gesagt, oft Übersehenem: Fuzzy Matching mit Python. Genauer gesagt, wie man es effektiv in seinen Telegram-Bots einsetzt, um Benutzereingaben zu verarbeiten, die nicht perfekt sauber sind.

Wir alle haben Bots gebaut, die einen präzisen Befehl oder ein bestimmtes Schlüsselwort erwarten. Und wenn der Nutzer „Kannst du mir bei der Einrichtung eines neuen Benutzers helfen?“ anstelle von „Benutzer einrichten“ eintippt, starrt der Bot einfach ins Leere. Oder noch schlimmer, er gibt eine allgemeine „Ich verstehe nicht“-Nachricht aus. Das ist eine schnelle Möglichkeit, Nutzer zu frustrieren und deinen Bot dumm erscheinen zu lassen. Ich habe das neulich persönlich erlebt, als ich einen kleinen internen Support-Bot für das Startup eines Freundes gebaut habe. Sie benötigten ihn, um häufig gestellte Fragen zu beantworten, aber das Team tippte ständig Variationen der Fragen ein. „Wie setze ich mein Passwort zurück?“ wurde zu „Passwort zurücksetzen Hilfe“ oder „Passwort vergessen“. Mein anfänglicher Bot versagte spektakulär.

Heute möchte ich darum gehen, wie du die fuzzywuzzy-Bibliothek von Python nutzen kannst, um eine Schicht menschlichen Verständnisses zu deinen Telegram-Bots hinzuzufügen, ohne eine vollwertige NLU-Engine zu benötigen. Es geht nicht um tiefes Lernen oder komplexe Linguistik; es dreht sich um praktische String-Vergleiche, die einen großen Unterschied in der Benutzererfahrung ausmachen.

Das Problem: Bots sind zu wörtlich

Mein erster Telegram-Bot für dieses Startup war ein einfacher Befehlshandler. Wenn jemand `/faq` eingab, würde es die FAQs auflisten. Wenn sie `/support` eingaben, würde es auf die Support-Seite verlinken. Für spezifische Fragen hatte ich Handler wie diesen:


@bot.message_handler(func=lambda message: message.text and "reset password" in message.text.lower())
def handle_reset_password(message):
 bot.reply_to(message, "Um dein Passwort zurückzusetzen, besuche unser Portal unter example.com/reset.")

Scheint in Ordnung, oder? Außer, wie ich schon erwähnt habe, tippen die Nutzer nicht immer „reset password“. Sie tippen „Ich muss mein Passwort zurücksetzen“, „Passwort vergessen“, „Hilfe zum Passwort“, „Wie bekomme ich ein neues Passwort?“ Mein Bot, das gute Stück, erkannte nur die exakte Phrase. Es war ein Usability-Albtraum. Mein Freund rief mich an, leicht genervt, und sagte: „Marcus, dein Bot versteht nur Roboter, keine Menschen!“ Er hatte einen Punkt.

Dieses strikte wörtliche Matching ist eine häufige Falle. Wir, als Entwickler, entwerfen oft für den idealen Eingang, aber Nutzer liefern ihn selten. Sie tippen umgangssprachlich, sie machen Tippfehler, sie verwenden Synonyme. Und unsere Bots müssen darauf vorbereitet sein.

Fuzzy Matching mit fuzzywuzzy

Hier kommen Bibliotheken wie fuzzywuzzy ins Spiel. Es ist eine Python-Bibliothek, die Levenshtein-Distanzberechnungen implementiert, die im Grunde messen, wie viele Änderungen du an einem String vornehmen musst, um zu einem anderen zu gelangen. Je niedriger die Zahl, desto ähnlicher sind sie. fuzzywuzzy gibt dir dann einen Score von 100.

Denke so darüber nach: „apple“ und „aple“ sind sehr nah beieinander. „apple“ und „banana“ sind es nicht. fuzzywuzzy kann dir sagen, *wie* nah.

Zuerst musst du es installieren:


pip install fuzzywuzzy python-Levenshtein

Du benötigst python-Levenshtein für eine bessere Leistung, da fuzzywuzzy es nutzt, wenn es verfügbar ist.

Grundlegende Konzepte des Fuzzy Matching

Es gibt ein paar grundlegende Funktionen, die du aus fuzzywuzzy.fuzz verwenden wirst:

  • fuzz.ratio(string1, string2): Berechnet ein einfaches Verhältnis der Ähnlichkeit.
  • fuzz.partial_ratio(string1, string2): Nützlich, wenn ein String viel länger ist als der andere, aber einen ähnlichen Teilstring enthält. Zum Beispiel „reset password“ und „Ich habe mein Passwort vergessen, kannst du mir helfen, es zurückzusetzen?“
  • fuzz.token_sort_ratio(string1, string2): Sortiert die Wörter in beiden Strings alphabetisch, bevor sie verglichen werden. Das hilft bei umsortierten Wörtern, wie „password reset“ vs. „reset password“.
  • fuzz.token_set_ratio(string1, string2): Ähnlich wie token_sort_ratio, behandelt jedoch doppelte Wörter und häufige Wörter besser. Oft die beste Wahl für umgangssprachliche Eingaben.

Sehen wir uns einige schnelle Beispiele im Python-Interpreter an:


from fuzzywuzzy import fuzz

# Einfaches Verhältnis
print(fuzz.ratio("reset password", "password reset")) # Ausgabe: 95
print(fuzz.ratio("reset password", "reset passwrd")) # Ausgabe: 94
print(fuzz.ratio("reset password", "forgot password")) # Ausgabe: 62

# Teilverhältnis (großartig für längere Sätze)
print(fuzz.partial_ratio("Ich muss mein Passwort zurücksetzen", "reset password")) # Ausgabe: 100

# Token-Sortier-Verhältnis (bewältigt die Wortreihenfolge)
print(fuzz.token_sort_ratio("reset password", "password reset")) # Ausgabe: 100

# Token-Set-Verhältnis (oft das Beste für umgangssprachliche Eingaben)
print(fuzz.token_set_ratio("Wie setze ich mein Passwort zurück?", "reset password help")) # Ausgabe: 90
print(fuzz.token_set_ratio("Wo ist die FAQ?", "FAQ link")) # Ausgabe: 67

Beachte, wie token_sort_ratio und token_set_ratio höhere Werte liefern, wenn Wörter umsortiert sind oder wenn eine Phrase eine Teilmenge der anderen ist, was genau das ist, was wir für Benutzereingaben benötigen.

Integration des Fuzzy Matchings in einen Telegram-Bot

Jetzt wird es praktisch. Wie setzen wir das in unseren Telegram-Bot um? Die Idee ist, eine Liste von „kanonischen“ oder erwarteten Phrasen für jede Aktion zu definieren. Wenn ein Benutzer dann eine Nachricht sendet, vergleichen wir sie mit all diesen kanonischen Phrasen und wählen diejenige mit dem höchsten Ähnlichkeitsscore aus, wenn dieser über einem bestimmten Schwellenwert liegt.

Hier ist ein vereinfachtes Beispiel, das die python-telegram-bot-Bibliothek verwendet (obwohl das Konzept für jeden Telegram-Bot-Framework gilt).

Schritt 1: Definiere deine Intent-Karte

Anstatt „reset password“ hart im Nachrichtenshandler zu codieren, erstellen wir ein Wörterbuch, das einen „Intent“ (was der Benutzer tun möchte) einer Liste von Phrasen zuordnet, die es auslösen.


INTENT_PHRASES = {
 "reset_password": [
 "reset password",
 "mein Passwort vergessen",
 "wie setze ich das Passwort zurück",
 "Passwort ändern",
 "neues Passwort erhalten"
 ],
 "contact_support": [
 "Support kontaktieren",
 "mit einem Menschen sprechen",
 "Hilfe benötigen",
 "Support-Team",
 "technisches Problem"
 ],
 "view_faq": [
 "faq",
 "häufig gestellte Fragen",
 "allgemeine Fragen",
 "eine Frage stellen"
 ]
}

# Zuordnung von Intents zu Handler-Funktionen
INTENT_HANDLERS = {} # Wir werden das später ausfüllen

Schritt 2: Erstelle eine Fuzzy-Matching-Funktion

Diese Funktion wird die Nachricht des Benutzers annehmen und den besten passenden Intent und dessen Score zurückgeben.


from fuzzywuzzy import fuzz
from fuzzywuzzy import process

def get_best_intent(user_message, intent_map, threshold=70):
 best_match_intent = None
 best_score = 0

 # Alle möglichen Phrasen aus der Intent-Karte sammeln
 all_phrases = []
 for intent, phrases in intent_map.items():
 for phrase in phrases:
 all_phrases.append((phrase.lower(), intent)) # Phrase und deren Intent speichern

 # process.extractOne zur Effizienz verwenden
 # Es gibt (beste Übereinstimmung, Score, Index_in_choices_list) zurück
 # Wir passen es leicht an, da wir zurück zu unseren Intents mappen müssen
 
 # Lassen Sie uns zur Klarheit manuell iterieren oder process.extract mit einem benutzerdefinierten Schätzer verwenden
 # Zur Vereinfachung erstellen wir eine flache Liste aller „Trigger“-Phrasen
 # und mappen dann zurück zu dem Intent.

 flat_trigger_phrases = [phrase for sublist in intent_map.values() for phrase in sublist]

 # process.extractOne gibt (match_string, score) zurück
 # Dies vergleicht die user_message mit unserer flachen Liste der Trigger-Phrasen
 best_phrase_match, score = process.extractOne(
 user_message.lower(), 
 flat_trigger_phrases, 
 scorer=fuzz.token_set_ratio # Oft die beste für allgemeine Eingaben
 )

 if score >= threshold:
 # Jetzt, finde heraus, zu welchem Intent diese best_phrase_match gehört
 for intent_name, phrases_list in intent_map.items():
 if best_phrase_match in [p.lower() for p in phrases_list]:
 best_match_intent = intent_name
 best_score = score
 break # Intent gefunden, keine Notwendigkeit, andere Phrasen zu überprüfen
 
 return best_match_intent, best_score

Eine kurze Anmerkung zu process.extractOne: Es ist darauf ausgelegt, die beste Übereinstimmung für einen String innerhalb einer Liste von Möglichkeiten zu finden. Es ist effizienter, als alles selbst zu durchlaufen. Mein obiges Beispiel zeigt, wie man es verwendet, indem man eine flache Liste aller Trigger-Phrasen erstellt und dann die beste Übereinstimmung auf ihren ursprünglichen Intent zurückmappt.

Schritt 3: Implementiere den Nachrichtenhandler des Bots

Jetzt modifizieren wir den Hauptnachrichtenhandler deines Bots, um diese Logik zu verwenden.


import telebot # Assuming pyTelegramBotAPI
# from telegram.ext import Updater, MessageHandler, Filters # If using python-telegram-bot

# Initialize your bot (replace with your actual token)
bot = telebot.TeleBot("YOUR_TELEGRAM_BOT_TOKEN")

# Define handlers for each intent
def handle_reset_password_intent(message):
 bot.reply_to(message, "Kein Problem! Um Ihr Passwort zurückzusetzen, besuchen Sie bitte unser sicheres Portal unter example.com/reset. Wenn Sie weitere Unterstützung benötigen, wenden Sie sich bitte an den IT-Support.")

def handle_contact_support_intent(message):
 bot.reply_to(message, "Ich verstehe, dass Sie mit jemandem sprechen möchten. Sie können unser Support-Team per E-Mail unter [email protected] erreichen oder uns während der Geschäftszeiten unter 1-800-BOT-HELP anrufen.")

def handle_view_faq_intent(message):
 bot.reply_to(message, "Natürlich, hier sind unsere häufig gestellten Fragen: example.com/faq. Lassen Sie mich wissen, wenn Sie eine spezielle Frage haben!")

# Populate the INTENT_HANDLERS map
INTENT_HANDLERS = {
 "reset_password": handle_reset_password_intent,
 "contact_support": handle_contact_support_intent,
 "view_faq": handle_view_faq_intent
}

@bot.message_handler(func=lambda message: True) # Catch all messages
def handle_all_messages(message):
 user_text = message.text
 if not user_text:
 return

 best_intent, score = get_best_intent(user_text, INTENT_PHRASES, threshold=75) # Adjust threshold as needed

 if best_intent and best_intent in INTENT_HANDLERS:
 INTENT_HANDLERS[best_intent](message)
 else:
 bot.reply_to(message, "Ich bin mir nicht ganz sicher, ob ich das verstehe. Könnten Sie versuchen, es umzuformulieren oder eine andere Frage zu stellen? Sie können auch 'hilfe' eingeben für Optionen.")

bot.polling()

Was passiert hier? Wenn ein Benutzer eine Nachricht sendet, wird unsere handle_all_messages-Funktion sie abfangen. Sie übergibt dann den Nachrichtentext an get_best_intent. Wenn ein passender Intent gefunden wird (Score über 75 in diesem Fall), wird die entsprechende Handler-Funktion aufgerufen. Andernfalls gibt der Bot eine höfliche Rückfallnachricht.

Ich habe den Schwellenwert auf 75 gesetzt, nachdem ich einige Experimente durchgeführt habe. Zu niedrig, und der Bot könnte zu oft falsch interpretieren. Zu hoch, und es wird wieder zu starr. Dies ist ein Wert, den Sie für Ihren spezifischen Bot und dessen Benutzer anpassen möchten.

Ein praktisches Szenario: Der „Hilfe“-Befehl

Angenommen, ein Benutzer tippt „Ich benötige bitte Hilfe.“

  • user_message: „Ich benötige bitte Hilfe.“
  • get_best_intent überprüft gegen INTENT_PHRASES.
  • Es findet „Hilfe benötigen“ in contact_support, und fuzz.token_set_ratio("Ich benötige bitte Hilfe", "Hilfe benötigen") könnte einen Score von sagen wir 85 ergeben.
  • Da 85 > 75 (unser Schwellenwert), wird der Intent "contact_support" zurückgegeben.
  • Der Bot ruft dann handle_contact_support_intent(message) auf.

Dies ist eine viel bessere Möglichkeit, Variationen zu behandeln, als striktes String-Matching.

Erweiterte Überlegungen und Anpassungen

Schwellenwertanpassung

Dies ist entscheidend. Ein Schwellenwert von 70-80 ist oft ein guter Ausgangspunkt für token_set_ratio. Testen Sie ausführlich mit realen Benutzereingaben oder simulierten Variationen, um den idealen Punkt zu finden. Zu niedrig und Sie erhalten falsche Positive; zu hoch und Sie verlieren den Vorteil des unscharfen Abgleichs.

Umgang mit mehreren potenziellen Übereinstimmungen

Was ist, wenn zwei Intents ähnliche Scores haben? Zum Beispiel sind „Passwort zurücksetzen“ und „Passwort vergessen“ nahe beieinander. Möglicherweise möchten Sie einen Mechanismus zur Entscheidungsfindung einführen oder bei sehr nahen Scores den Benutzer um Klarstellung bitten:


"Haben Sie gemeint, Ihr Passwort zurückzusetzen oder den Support zu kontaktieren?"

fuzzywuzzy.process.extract (ohne das „Eins“) kann eine Liste der besten N Übereinstimmungen zurückgeben, die hier nützlich sein könnte.

Vorverarbeitung der Benutzereingabe

Bevor Sie den unscharfen Abgleich durchführen, sollten Sie einige grundlegende Vorverarbeitungen in Betracht ziehen:

  • In Kleinbuchstaben umwandeln: user_message.lower() (das machen wir bereits in den Beispielen).
  • Interpunktion entfernen: Verwenden Sie str.translate und string.punctuation.
  • Entfernen Sie gängige Stoppwörter (z.B. „ein“, „die“, „ist“), wenn sie für Ihre Intents keine Bedeutung haben. Seien Sie vorsichtig damit, da manchmal Stoppwörter wichtig für den Kontext sind.

Kombination mit exakten Übereinstimmungen

Für kritische Befehle möchten Sie möglicherweise zuerst eine exakte Übereinstimmungsprüfung durchführen. Wenn ein Benutzer beispielsweise `/admin` eingibt, möchten Sie das genau behandeln, bevor der unscharfe Abgleich versucht, es mit „neuen Benutzer hinzufügen“ zu verbinden, wegen „admi“.

Leistung

Für Bots mit einer sehr großen Anzahl von Intents oder Trigger-Phrasen kann das wiederholte Aufrufen von unscharfen Abgleichfunktionen langsam werden. Für die meisten kleinen bis mittelgroßen Bots (hunderte von Phrasen) ist fuzzywuzzy mit python-Levenshtein jedoch normalerweise schnell genug. Wenn Sie an Leistungseinschränkungen stoßen, sollten Sie sich nach fortgeschritteneren NLU-Lösungen oder der Vorindizierung Ihrer Phrasen umsehen.

Umsetzbare Erkenntnisse

  1. Verlassen Sie sich nicht ausschließlich auf exaktes String-Matching: Benutzer sind unordentlich. Ihr Bot muss nachsichtig sein.
  2. Verwenden Sie fuzzywuzzy (oder ähnliche Bibliotheken): Es ist eine schnelle, effektive Möglichkeit, Ihrem Bot eine Schicht „Verständnis“ hinzuzufügen, ohne vollwertige NLU zu verwenden.
  3. Priorisieren Sie fuzz.token_set_ratio: Für konversationelle Eingaben ist es oft die robusteste Wahl, da es Wortordnung und Teilmengen gut behandelt.
  4. Definieren Sie klare „kanonische“ Phrasen: Selbst bei unscharfem Abgleich ist es wichtig, Ihrem Bot gute Beispiele dessen zu geben, wonach er suchen soll.
  5. Stellen Sie Ihren Schwellenwert ein: Experimentieren Sie mit dem Ähnlichkeitsbewertungsschwellenwert (z.B. 70-85), um das richtige Gleichgewicht für die Toleranz Ihres Bots gegenüber Mehrdeutigkeiten zu finden.
  6. Implementieren Sie einen ansprechenden Rückfall: Haben Sie immer eine „Ich verstehe nicht“-Nachricht, die den Benutzer anleitet, was als Nächstes zu tun ist.

Das Hinzufügen von unscharfem Abgleich zu dem Support-Bot meines Freundes hat einen riesigen Unterschied gemacht. Die Beschwerden „Marcus, dein Bot versteht nur Roboter!“ hörten auf, und der Bot wurde tatsächlich ein nützliches Werkzeug für ihr Team. Es ist eine relativ einfache Technik, aber ihre Auswirkung auf die Benutzererfahrung ist enorm. Probieren Sie es in Ihrem nächsten Telegram-Bot-Projekt aus und lassen Sie mich in den Kommentaren wissen, wie es läuft!

🕒 Published:

💬
Written by Jake Chen

Bot developer who has built 50+ chatbots across Discord, Telegram, Slack, and WhatsApp. Specializes in conversational AI and NLP.

Learn more →
Browse Topics: Best Practices | Bot Building | Bot Development | Business | Operations
Scroll to Top