Wie man in Python einen Chatbot erstellt
Posted on Fr 07 April 2023 in Artificial Intelligence, Chatbots, Python Basics • 4 min read
In dieser Anleitung werden wir Schritt für Schritt lernen, wie man in Python einen Chatbot erstellt. Wir werden verschiedene Konzepte wie Natural Language Processing (NLP) und Machine Learning (ML) verwenden, um eine interaktive Kommunikation zwischen den Benutzern und unserem Chatbot zu ermöglichen.
Schritt 1: Installation von Bibliotheken
Bevor wir mit der Programmierung beginnen, müssen wir sicherstellen, dass wir alle erforderlichen Bibliotheken installiert haben. In diesem Artikel werden wir folgende Bibliotheken verwenden:
-
NLTK: Diese Bibliothek wird verwendet, um Textdaten zu verarbeiten, insbesondere bei der Analyse von Texten.
-
Sklearn: Diese Bibliothek wird zum Trainieren unseres Chatbot-Modells verwendet.
-
Flask: Diese Bibliothek wird zum Erstellen einer Webanwendung verwendet, um unseren Bot der Außenwelt zugänglich zu machen.
Lassen Sie uns nun diese Bibliotheken installieren, indem wir den folgenden Befehl in der Eingabeaufforderung ausführen:
!pip install nltk flask scikit-learn
Schritt 2: Korpusdaten sammeln
Der erste Schritt bei der Erstellung eines Chatbots ist das Sammeln von relevanten Daten, die uns helfen, das Modell zu trainieren. Wir werden ein Korpus von Texten verwenden, die Frage-Antwort-Paare enthalten.
Ein Korpus ist eine Zusammenstellung von Texten, die von maschinellen Lernalgorithmen verwendet werden, um ein Modell zu trainieren. In unserem Fall benötigen wir ein Korpus von Dialogen, das von menschlichen Schreibenden verfasst wurde, um unser Modell auf die Sprache und die unterschiedlichen Schreibstile der Benutzer anzupassen.
Es gibt viele Korpora, die Sie aus dem Internet herunterladen oder sammeln können. Wir werden in diesem Artikel das Cornell Movie Dialog Corpus verwenden. Sie können es über diesen Link herunterladen und entpacken.
Schritt 3: Vorverarbeitung der Daten
Die Vorverarbeitung von Textdaten ist sehr wichtig, um unser Modell korrekt zu trainieren und eine präzise Interpretation der Benutzeranforderungen zu gewährleisten. Wir müssen die Rohdaten bereinigen, lemmatisieren und tokenisieren, bevor wir sie verwenden können.
Bereinigung
Das Entfernen von Sonderzeichen, Ziffern und anderen gelegentlich auftretenden Zeichen ist eine gängige Praxis bei der Vorverarbeitung von Textdaten. Wir werden die Daten von unerwünschten Zeichen bereinigen, einschließlich Interpunktion und HTML-Tags, damit wir nur die wichtigen Wörter beibehalten.
import re
def text_clean(text):
text = re.sub(r"-", " ", text)
text = re.sub(r"\d+", "", text)
text = text.lower()
text = re.sub(r"\s+", " ", text)
text = re.sub(r"[^a-zA-Z0-9\s]", "", text)
return text
Tokenisierung
Die Tokenisierung ist der Akt des Aufteilens eines Dokuments in einzelne Wörter oder Phrasen. Wir werden das NLTK-Tool zur Tokenisierung verwenden.
import nltk
nltk.download("punkt")
from nltk.tokenize import word_tokenize
def tokenize(text):
tokens = word_tokenize(text)
return tokens
Lemmatisierung
Die Lemmatisierung ist der Akt des Umwandeln eines Wortes in seine normalisierte Form. Wir werden das WordNetLemmatizer-Tool aus dem NLTK-Paket verwenden, das jedem Wort seine Grundform zuweist.
nltk.download("wordnet")
from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
def lemmatize(tokens):
lemmas = []
for word, tag in pos_tag(tokens):
tag = tag[0].lower()
tag = tag if tag in ["a", "r", "n", "v"] else None
if not tag:
lemma = word
else:
lemma = lemmatizer.lemmatize(word, tag)
lemmas.append(lemma)
return lemmas
Der vollständige Code für die Vorverarbeitung:
from nltk.tokenize import word_tokenize
from nltk import pos_tag
from nltk.stem import WordNetLemmatizer
import re
import nltk
nltk.download("punkt")
nltk.download("wordnet")
def text_clean(text):
text = re.sub(r"-", " ", text)
text = re.sub(r"\d+", "", text)
text = text.lower()
text = re.sub(r"\s+", " ", text)
text = re.sub(r"[^a-zA-Z0-9\s]", "", text)
return text
def tokenize(text):
tokens = word_tokenize(text)
return tokens
lemmatizer = WordNetLemmatizer()
def lemmatize(tokens):
lemmas = []
for word, tag in pos_tag(tokens):
tag = tag[0].lower()
tag = tag if tag in ["a", "r", "n", "v"] else None
if not tag:
lemma = word
else:
lemma = lemmatizer.lemmatize(word, tag)
lemmas.append(lemma)
return lemmas
Schritt 4: Datenbereitestellung und Modell-Training
Um unser Modell zu trainieren, müssen wir das Korpus, das wir im Schritt 2 gesammelt haben, vorbereiten. Wir müssen die Daten in Fragen-Antwort-Paare aufteilen und die Datenpunkte in zusammenhängenden Vektoren darstellen, die vom Modell verarbeitet werden können.
Fragen-Antwort-Paare
Wir müssen die Dialoge aus einer langen Liste von Zeilen in Frage-Antwort-Paare aufteilen. Dieser Schritt wird als Data Cleaning bezeichnet.
Datenpunkte konvertieren
Wir müssen aus den Informationen für jede Frage-Antwort-Kombination Vektoren als Eingabe für unser ML-Modell erstellen. Wir verwenden für jeden Token in jeder Frage ein Bag-of-Words-Modell. Um aus diesen Vektoren eine Matrix für ML-Algorithmen zu erstellen, werden wir das TfidfVectorizer-Modell aus dem Scikit-Learn-Paket verwenden.
Modelltraining
Wir werden ein ML-Modell trainieren, um die Antworten für die Anfragen vorherzusagen. Wir verwenden das Spacy-Paket, das auf Machine Learning und NLP spezialisiert ist und uns viel Arbeit bei der Entwicklung unserer Modelle abnimmt.
Der vollständige Code für die Datenbereitstellung und das Modelltraining
import numpy as np
import json
import string
import warnings
warnings.filterwarnings("ignore")
from nltk import pos_tag
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
import spacy
from spacy.lang.en.stop_words import STOP_WORDS
import requests
# Laden der Daten vom Korpus
data = open('movie_lines.txt', encoding='utf-8', errors='ignore').read().split('\n')
data = [text_clean(line) for line in data]
# Extrahieren der Frage-Antwort-Paare
pairs = []
for i in range(len(data)-1):
pairs.append(tokenize(data[i]) + tokenize(data[i+1]))
# Vektorisierung der Frage-Antwort-Paare
vectors = TfidfVectorizer(tokenizer=lemmatize, stop_words=set(list(string.punctuation) + list(STOP_WORDS)))
X = vectors.fit_transform(pairs)
# Definition des Modells
nlp = spacy.load("en_core_web_md")
def give_answer(text):
question_tokens = vectors.transform([text])
most_similar = (-1, None)
for i in range(len(X)):
sim = cosine_similarity(X[i], question_tokens)
if sim > most_similar[0]:
most_similar = (sim, i)
match = pairs[most_similar[1]]
match = [word for word in match if word not in set(list(string.punctuation) + list(STOP_WORDS))]
prediction = nlp(" ").join(match)
return prediction
Schritt 5: Erstellen der Webanwendung und Starten des Chatbots
Um unser Modell zugänglich zu machen und unseren Chatbot zu erstellen, müssen wir eine Webanwendung erstellen, die mithilfe von Flask erstellt wird.
Flask-App erstellen
Wir werden eine kleine Webanwendung erstellen, die auf Anfragen reagiert, die über die URL übergeben werden. Wir können den folgenden Code verwenden, um unsere Flask-App zu erstellen.
from flask import Flask, request
app = Flask(__name__)
@app.route('/')
def index():
return "Hello! I'm a chatbot."
@app.route('/chatbot', methods=['POST'])
def chatbot():
user_text = request.form['message']
answer = give_answer(user_text)
return answer
Starten der Anwendung
Wir können unseren Chatbot jetzt starten, indem wir die Anwendung ausführen und es von einer URL aus verfügbar machen.
app.run()
Schritt 6: Testen des Chatbots
Jetzt, da unser Chatbot bereit ist, können wir ihn testen, indem wir Anfragen an ihn senden und seine Reaktionen überprüfen.
Wir haben gesehen, wie man in dieser Anleitung Schritt für Schritt einen einfachen Chatbot mit Python entwickeln kann. Wichtig ist beim Entwickeln eines Chatbots immer, dass wir Wert auf eine saubere, zuvor durchdachte Datenbereitstellung legen und die Verarbeitung mittels Machine Learning modellieren. Viel Spaß beim Ausprobieren!