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, wir diese als Feedback ausgegeben.

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

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 nur Nutzer

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 wir öäü 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 der ersten Zeile unseres Codes geschehen. 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.

Jetze begrüßen wir unsere Nutzer und geben einen Hinweis, wir 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 Variablen „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 (sprich mindestens Python > 3) verwenden! Bei den alten Python2-Versionen wird der Anweisung input() anders gehandhabt. Bei Python3 wird die Eingabe als String verarbeitet.

Wir man in unsere Ablaufdiagramm sehen, 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 dir. Bis zum nächsten Mal")

Wir benötigen 2-mal die Anweisung nutzereingabe = "". Die erste initalisiert die Variabel „nutzereingabe“ und die zweite leer einen eventuell vorhandenen Inhalt (was in der ersten Runde noch nicht vorkommt.

Wenn wir unser Programm nun testen, können wir etwas eingeben und dieses wir 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 Programmauflauf. 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 dir. Bis zum nächsten Mal")

Wir haben nun den ersten Strang unseres Ablaufdiagramm 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 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 Stopwort 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", 
					  "hallo": "Auch 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 „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. Dass 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 dir. Bis zum nächsten Mal")

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