Python Tutorial
- jetzt Python programmieren lernen

Chatbot mit Python programmieren

Endlich sich mit dem eigenen programmierten Python-Programm unterhalten, sprich chatten. Das englische Wort „chatter“ bedeutet nichts anderes wie plaudern bzw. plappern. Chatbots mit Texteingabe durch den Nutzer und intelligenten (mehr oder weniger) Antworten haben eine lange Tradition. Bereits 1964 wurde Eliza von Joseph Weizenbaum programmiert.

Und genau so einen Chatbot wollen wir mit Python programmieren. Dazu brauchen wir die grundlegende Funktionsweise.

In diesem Kapitel werden dazu eingesetzt:

  • Listen
  • Dictionary
  • while-Schleifen
  • for-Schleifen
  • die Abfrage „in“

Funktionsweise Chatbot

Grundlegendes Ablaufdiagramm für Chatbot
Grundlegendes Ablaufdiagramm für Chatbot

Der Nutzer wird vom Chatbot begrüßt und gleich aufgeklärt, dass er die Unterhaltung mit „bye“ beenden kann. Dann wird auf die Nutzereingabe gewartet.

Liegt die Nutzereingabe vor, wird dir dieser Satz in Einzelteile (sprich Wörter) zerlegt.

Die einzelnen Wörter werden harmonisiert (Groß- und Kleinschreibung angeglichen).

Dann wird überprüft, ob Einzelwörter in der Datenbasis vorkommen, die als „passende“ Antwort vorliegen.

Wenn eine „passende“ Antwort vorliegt, wird diese als Feedback ausgegeben.

Liegt keine passende Antwort vor, wird eine zufällige Antwort vom Chatbot zurückgegeben, um das Gespräch aufrechtzuerhalten.

Es wird auf die nächste Nutzereingabe gewartet.

Diesen Ablauf werden wir nun Schritt für Schritt in Python programmieren. Dazu werden wir alle bisher gelernten Elemente von Python nutzen.

Schritt 1: Eingabe mit Schleife bis zu dem Beenden durch den Benutzer

Im ersten Schritt wollen wir nach der Begrüßung unsere Nutzer zur Eingabe eines Textes auffordern.

Bevor wir nun mit deutschen Texten arbeiten, in denen immer wieder Umlaute wie „öäü“ vorkommen können (egal ob bei der Eingabe oder bei der Ausgabe), sollten wir Python darauf vorbereiten. Wir speichern unsere Datei mit dem UTF-8 Encoding ab. Daher teilen wir das auch Python mit. Diese geschieht über:

# -*- coding: utf-8 -*-

Wichtig ist, dass dies in der ersten Zeile unseres Programm-Codes geschieht. Wer mehr darüber lesen will, kann einfach mal „Encoding Cookies Python“ in eine Suchmaschine eingeben

Es gibt noch weitere Codings, die hier nicht weiter aufgeführt werden.

Jetzt begrüßen wir unsere Nutzer und geben einen Hinweis, wie das Programm auch wieder beendet werden kann:

# -*- coding: utf-8 -*-
print("Willkommen beim Chatbot")
print("Worüber würden Sie gerne heute sprechen?")
print("Zum Beenden einfach 'bye' eintippen")
print("")

Wir wollen jetzt die Texteingabe des Nutzers erfassen. Diese wird in der Variable „nutzereingabe“ gespeichert und zur Kontrolle auf dem Bildschirm ausgegeben:

# -*- coding: utf-8 -*-
print("Willkommen beim Chatbot")
print("Worüber würden Sie gerne heute sprechen?")
print("Zum Beenden einfach 'bye' eintippen")
print("")
nutzereingabe = ""
nutzereingabe = input("Ihre Frage/Antwort: ")
print(nutzereingabe)

Sollte jetzt eine Fehlermeldung in Form eines „NameError“ kommen, dann bitte sicherstellen, dass wir auch eine aktuelle Python-Version (mindestens Python ab Version 3) verwenden! Bei den alten Python2-Versionen wird der Anweisung input() anders gehandhabt. Bei Python3 wird die Eingabe als String verarbeitet.

Wie man in unserem Ablaufdiagramm sieht, soll der Nutzer immer weitere Eingaben machen können, bis dieser die Eingabe „bye“ zum Beenden eintippt.

Also packen wir unsere Eingabe in eine while-Schleife:

# -*- coding: utf-8 -*-
print("Willkommen beim Chatbot")
print("Worüber würden Sie gerne heute sprechen?")
print("Zum Beenden einfach 'bye' eintippen")
print("")
nutzereingabe = ""
while nutzereingabe != "bye":
    nutzereingabe = ""
    nutzereingabe = input("Ihre Frage/Antwort: ")
    print(nutzereingabe)
print("Einen schönen Tag wünsche ich Dir. Bis zum nächsten Mal")

Wir benötigen 2-mal die Anweisung nutzereingabe = "". Die erste Anweisung initialisiert die Variabel „nutzereingabe“ und die zweite leert einen eventuell vorhandenen Inhalt, was im ersten Durchgang noch nicht vorkommt.

Wenn wir unser Programm nun testen, können wir etwas eingeben und dieses wird einfach wieder ausgegeben. Allerdings können wir auch nichts eingeben und einfach nur die Eingabe mit der Return-Taste leer übergeben. Das ist natürlich wenig hilfreich für den folgenden Programmablauf. Daher sollten wir noch sicherstellen, dass eine leere Eingabe nicht möglich ist und der Benutzer weiter gefragt wird. Also bauen wir in unsere while-Schleife eine zweite while-Schleife, die eine Eingabe sicherstellt.

# -*- coding: utf-8 -*-
print("Willkommen beim Chatbot")
print("Worüber würden Sie gerne heute sprechen?")
print("Zum beenden einfach 'bye' eintippen")
print("")
nutzereingabe = ""
while nutzereingabe != "bye":
    nutzereingabe = ""
    while nutzereingabe == "":
        nutzereingabe = input("Ihre Frage/Antwort: ")
    print(nutzereingabe)
print("Einen schönen Tag wünsche ich Dir. Bis zum nächsten Mal")

Wir haben nun den ersten Strang unseres Ablaufdiagramms erledigt.

Schritt 2: zufällige Antwort auf Nutzereingabe

Stürzen wir uns nun auf die Ausgabe einer zufälligen Antwort. Dazu benötigen wir eine Sammlung an Antworten, die irgendwie immer passen. Aus dieser können wir dann per Zufall später eine auswählen. Die Antwortsammlung speichern wir in einer Liste ab:

zufallsantworten=["Oh, wirklich", "Interessant ...", "Das kann man so sehen", "Ich verstehe ..."]

Da wir das random-Modul für eine zufällige Antwort benötigen, binden wir das am Anfang unseres Programms ein (wie auch unsere Liste mit den möglichen zufälligen Antworten).

# -*- coding: utf-8 -*-
import random
zufallsantworten=["Oh, wirklich", "Interessant ...", "Das kann man so sehen", "Ich verstehe ..."]
print("Willkommen beim Chatbot")

Über die Anweisung random.choice(zufallsantworten) erhalten wir eine zufällige Antwort. Diese können wir nun nach der Nutzereingabe ausgeben lassen:

# -*- coding: utf-8 -*-
import random
zufallsantworten=["Oh, wirklich", "Interessant ...", "Das kann man so sehen", "Ich verstehe ..."]
print("Willkommen beim Chatbot")
print("Worüber würden Sie gerne heute sprechen?")
print("Zum beenden einfach 'bye' eintippen")
print("")
nutzereingabe = ""
while nutzereingabe != "bye":
    nutzereingabe = ""
    while nutzereingabe == "":
        nutzereingabe = input("Ihre Frage/Antwort: ")
    print(random.choice(zufallsantworten))
print("Einen schönen Tag wünsche ich Dir. Bis zum nächsten Mal")
exit()

Schritt 3: passende Antworten auf Nutzereingabe

Die bisherige Unterhaltung mit nur zufälligen Antworten ist für den Nutzer eher merkwürdig. Daher wollen wir auf die Nutzereingabe möglichst eine passende Antwort liefern. Dazu erfassen wir über den Datentyp Dictionary eine Anzahl von passenden Antworten auf bestimmte Stoppwörter. Unser Dictionary enthält neben dem Stoppwort eine dafür vorgesehene Antwort (siehe mehr zu den Datentyp Dictionary im Kapitel https://www.python-lernen.de/python-dictionary.htm )

Hier eine kleine Auswahl – je größer, desto besser für die Unterhaltung. Unser Dictionary packen wir auch an den Anfang unseres Programms.

reaktionsantworten = {"hallo": "aber Hallo", 
					  "geht": "Was verstehst du darunter?", 
					  "essen": "Ich habe leider keinen Geschmackssinn :(" 
					  }

Jetzt müssen wir überprüfen, ob ein Stoppwort in der Nutzereingabe vorkommt. Um nicht Probleme mit Groß- und Kleinschreibung zu haben, setzen wir die Eingabe komplett in Kleinbuchstaben um

Und dann erstellen wir aus dieser Umsetzung eine Liste:

    nutzereingabe = nutzereingabe.lower()
    nutzerwoerter = nutzereingabe.split()

Diese Liste können wir Wort für Wort durchgehen und wenn ein Wort in den Stoppwörtern auftaucht, diese mögliche Antwort nutzen:

# -*- coding: utf-8 -*-
import random
zufallsantworten=["Oh, wirklich", "Interessant ...", "Das kann man so sehen", "Ich verstehe ..."]
reaktionsantworten = {"hallo": "aber Hallo", 
					  "geht": "Was verstehst du darunter?", 
					  "essen": "Ich habe leider keinen Geschmackssinn :(" 
					  }
print("Willkommen beim Chatbot")
print("Worüber würden Sie gerne heute sprechen?")
print("Zum beenden einfach 'bye' eintippen")
print("")
nutzereingabe = ""
while nutzereingabe != "bye":
    nutzereingabe = ""
    while nutzereingabe == "":
        nutzereingabe = input("Ihre Frage/Antwort: ")
    nutzereingabe = nutzereingabe.lower()
    nutzerwoerter = nutzereingabe.split()
#    print(nutzerwoerter)
    for einzelwoerter in nutzerwoerter:
        if einzelwoerter in reaktionsantworten:
            print(reaktionsantworten[einzelwoerter])

Wichtig ist hier die Anwendung von dem unscheinbaren Python-Befehl in. Wir überprüfen, ob Wörter aus unserer Liste „einzelwoerter“ innerhalb unseres Wörterbuches „reaktionsantworten“ als Keys vorkommen. Als Rückantwort erhalten wir ein „True“ wenn vorhanden bzw. ein „False“ wenn nicht vorhanden. Dies bewirkt die obige Anweisung:

        if einzelwoerter in reaktionsantworten:

Jetzt wird unsere „reaktionsantwort“ ausgegeben.

Wir müssen uns nur merken, dann eine „passende“ Antwort gefunden wurde. Ansonsten muss eine zufällige Antwort ausgewählt werden. Das speichern wir über „intelligenteAntworten = True“, die am Anfang auf „False“ gesetzt werden muss.

Diese können wir nun abfragen und dann unsere zufällige Antwort ausgeben:

# -*- coding: utf-8 -*-
import random

zufallsantworten=["Oh, wirklich", "Interessant ...", "Das kann man so sehen", "Ich verstehe ..."]

reaktionsantworten = {"hallo": "aber Hallo", 
					  "geht": "Was verstehst du darunter?", 
					  "essen": "Ich habe leider keinen Geschmackssinn :("
					  }
                      
print("Willkommen beim Chatbot")
print("Worüber würden Sie gerne heute sprechen?")
print("Zum beenden einfach 'bye' eintippen")
print("")

nutzereingabe = ""
while nutzereingabe != "bye":
    nutzereingabe = ""
    while nutzereingabe == "":
        nutzereingabe = input("Ihre Frage/Antwort: ")
        
    nutzereingabe = nutzereingabe.lower()
    nutzerwoerter = nutzereingabe.split()
    
    intelligenteAntworten = False
    for einzelwoerter in nutzerwoerter:
        if einzelwoerter in reaktionsantworten:
            print(reaktionsantworten[einzelwoerter])
            intelligenteAntworten = True
    if intelligenteAntworten == False:
        print(random.choice(zufallsantworten))
        
    print("")

print("Einen schönen Tag wünsche ich Dir. Bis zum nächsten Mal")

Das war ein sehr einfacher Chatbot in Python. Dieser kann natürlich noch ausgefeilt werden.

Weiterempfehlen • Social Bookmarks • Vielen Dank

Bitte unterstützen Sie dieses Projekt

Sie können dieses Projekt in verschiedenen Formen unterstützen - wir würden uns freuen und es würde uns für weitere Inhalte motivieren :).

Empfehlen Sie es weiter - wir freuen uns immer über Links und Facebook-Empfehlungen.

Das neue E-Book zum Kurs gibt es zum Kaufen.

Sie können uns auch eine Spende über PayPal zukommen lassen.

Bestellen Sie Bücher über folgenden Link bei Amazon:
Bücher über Python

Vielen Dank für Ihre Unterstützung