1.可以实现用户输入文字进行自然语言对话,具有多轮对话和基本的 UI 界面
2.该系统使用了自然语言处理(NLP)技术和基础知识库来帮助系统理解用户的请求,并提供有意义和准确的回答。
#首先,我们需要安装必要的库,并导入所需的模块。
```python
import nltk
import random
import string
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
import tkinter as tk
from tkinter import *
```
#然后,我们定义一个基本的 UI 界面,用于用户输入和对话历史记录的显示。
```python
class ChatInterface(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.master = master
self.initial_ui()
def initial_ui(self):
self.master.title("AI Chatbot")
self.grid()
self.chat_log = Text(self.master, bd=0, bg="white", height="8", width="50", font="Arial", wrap="word")
self.chat_log.config(state=DISABLED)
self.scrollbar = Scrollbar(self.master, command=self.chat_log.yview, cursor="heart")
self.chat_log['yscrollcommand'] = self.scrollbar.set
self.user_input = Text(self.master, bd=0, bg="white", width="29", font="Arial")
self.user_input.bind("<Return>", self.send_text)
self.send_button = Button(self.master, font="Arial", text="Send", width="12", height=5,
bd=0, bg="#008CBA", activebackground="#00BFFF", fg='#ffffff',
command=self.send_text)
self.scrollbar.grid(row=0, column=1, sticky='ns')
self.chat_log.grid(row=0, column=0, sticky="nsew", padx=2, pady=2)
self.user_input.grid(row=1, column=0, padx=2, pady=2, sticky='we')
self.send_button.grid(row=1, column=1, padx=2, pady=2, sticky='e')
```
#接下来,我们定义一个对话管理器,用于处理用户输入的文本,理解用户的意图,并根据需要返回适当的回答。
```python
class Chatbot:
def __init__(self):
self.greetings = ["hello", "hi", "hey", "howdy"]
self.goodbyes = ["bye", "goodbye"]
self.thanks = ["thank", "thanks"]
self.knowledge_base = open('knowledge.txt', 'r').read().lower()
self.sent_tokens = nltk.sent_tokenize(self.knowledge_base)
self.word_tokens = nltk.word_tokenize(self.knowledge_base)
self.remove_punct_dict = dict((ord(punct), None) for punct in string.punctuation)
def chatbot_response(self, user_input):
response = ''
self.sent_tokens.append(user_input)
TfidfVec = TfidfVectorizer(tokenizer=self.normalize, stop_words='english')
tfidf = TfidfVec.fit_transform(self.sent_tokens)
vals = cosine_similarity(tfidf[-1], tfidf)
idx = vals.argsort()[0][-2]
flat = vals.flatten()
flat.sort()
score = flat[-2]
if score == 0:
response = response + "I apologize, I don't understand."
return response
else:
response = response + self.sent_tokens[idx]
return response
def normalize(self, text):
return nltk.word_tokenize(text.lower().translate(self.remove_punct_dict))
```
#接下来,我们创建一个函数,该函数将读取用户输入的文本,使用 Chatbot 类处理该文本,并将回答输入到 UI 界面中。
```python
def get_input_output(chatbot, chat_log, input_text):
chat_log.config(state=NORMAL)
chat_log.insert(END, "You: " + input_text + '\n\n')
chat_log.config(foreground="#442265", font=("Verdana", 12))
if input_text.lower() in chatbot.goodbyes:
chat_log.insert(END, "AI Chatbot: Bye! Goodbye and have a great day ahead!\n\n")
chat_log.config(state=DISABLED)
return
if input_text.lower() in chatbot.thanks:
chat_log.insert(END, "AI Chatbot: You're very welcome!\n\n")
chat_log.config(state=DISABLED)
return
if input_text.lower() in chatbot.greetings:
chat_log.insert(END, "AI Chatbot: Hello!\n\n")
chat_log.config(state=DISABLED)
return
response = chatbot.chatbot_response(input_text)
chat_log.insert(END, "AI Chatbot: " + response + '\n\n')
chat_log.config(state=DISABLED)
```
#最后,我们实例化 Chatbot 类,并将 chat_interface 显示出来。
```python
chatbot = Chatbot()
root = Tk()
app = ChatInterface(master=root)
app.mainloop()
```
在运行代码之前,请确保之前的所有步骤都已正确配置和安装,并在 working directory 中创建 knowledge.txt 文件,该文件包含一些简单的问答对,用于测试对话系统。