请扮演一个高级程序员用py写一个可以自动学习的聊天AI
当然,我可以帮你写一个基于Python的自动学习聊天AI。我们将使用自然语言处理库NLTK和人工智能库TensorFlow来实现这个功能。
首先,我们需要安装所需的库。你可以在命令行中使用以下命令来安装它们:
pip install nltk tensorflow
接下来,我们需要下载一些语料库和模型来进行自然语言处理和机器学习。在Python交互式环境中,运行以下代码:
import nltk
nltk.download('punkt')
nltk.download('wordnet')
接下来,让我们开始编写代码。创建一个名为"chatbot.py"的文件,并将以下代码写入其中:
import nltk
from nltk.stem import WordNetLemmatizer
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras.optimizers import SGD
import random
import json
# 加载训练数据
with open('intents.json') as file:
data = json.load(file)
# 预处理数据
lemmatizer = WordNetLemmatizer()
words = []
tags = []
xy = []
for intent in data['intents']:
for pattern in intent['patterns']:
# 分词
w = nltk.word_tokenize(pattern)
words.extend(w)
xy.append((w, intent['tag']))
if intent['tag'] not in tags:
tags.append(intent['tag'])
words = [lemmatizer.lemmatize(w.lower()) for w in words if w not in '?']
words = sorted(list(set(words)))
tags = sorted(tags)
# 训练数据准备
training = []
output_empty = [0] * len(tags)
for (pattern_sentence, tag) in xy:
bag = []
pattern_words = [lemmatizer.lemmatize(word.lower()) for word in pattern_sentence]
for w in words:
bag.append(1) if w in pattern_words else bag.append(0)
output_row = list(output_empty)
output_row[tags.index(tag)] = 1
training.append([bag, output_row])
random.shuffle(training)
training = np.array(training)
train_x = list(training[:, 0])
train_y = list(training[:, 1])
# 构建模型
model = Sequential()
model.add(Dense(128, input_shape=(len(train_x[0]),), activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(len(train_y[0]), activation='softmax'))
# 编译并训练模型
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
hist = model.fit(np.array(train_x), np.array(train_y), epochs=200, batch_size=5, verbose=1)
# 保存模型
model.save('chatbot_model.h5', hist)
print("模型已保存")
在同一目录下,创建一个名为"intents.json"的文件,并将以下内容写入其中:
{
"intents": [
{
"tag": "greeting",
"patterns": ["Hi", "Hello", "Hey", "How are you", "What's up"],
"responses": ["Hello!", "Hi!", "Hey!", "Hi there!"]
},
{
"tag": "goodbye",
"patterns": ["Bye", "Goodbye", "See you later"],
"responses": ["Goodbye!", "See you later!", "Take care!"]
},
{
"tag": "name",
"patterns": ["What's your name?", "Who are you?"],
"responses": ["I'm a chatbot.", "You can call me Chatbot.", "My name is Chatbot."]
}
]
}
现在,运行"chatbot.py"文件,它将训练一个基于给定数据的聊天AI模型,并将其保存为"chatbot_model.h5"。
你可以使用以下代码与训练好的模型进行交互:
import nltk
from nltk.stem import WordNetLemmatizer
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import load_model
# 加载预训练模型
model = load_model('chatbot_model.h5')
# 加载数据预处理所需的工具
lemmatizer = WordNetLemmatizer()
words = []
classes = []
documents = []
ignore_letters = ['!', '?', ',', '.']
# 加载训练数据
import json
with open('intents.json') as file:
intents = json.load(file)
# 预处理数据
for intent in intents['intents']:
for pattern in intent['patterns']:
word_list = nltk.word_tokenize(pattern)
words.extend(word_list)
documents.append((word_list, intent['tag']))
if intent['tag'] not in classes:
classes.append(intent['tag'])
words = [lemmatizer.lemmatize(word.lower()) for word in words if word not in ignore_letters]
words = sorted(list(set(words)))
classes = sorted(list(set(classes)))
# 生成 Bag of Words
def bag_of_words(s, words):
bag = [0] * len(words)
s_words = nltk.word_tokenize(s)
s_words = [lemmatizer.lemmatize(word.lower()) for word in s_words]
for se in s_words:
for i, w in enumerate(words):
if w == se:
bag[i] = 1
return np.array(bag)
# 交互
while True:
inp = input("You: ")
if inp.lower() == "quit":
break
results = model.predict(np.array([bag_of_words(inp, words)]))[0]
results_index = np.argmax(results)
tag = classes[results_index]
if results[results_index] > 0.7:
for intent in intents['intents']:
if intent['tag'] == tag:
print(random.choice(intent['responses']))
else:
print("I didn't get that, try again.")
运行以上代码后,你可以与聊天AI进行交互。它将根据你的输入给出相应的回答。当你输入"quit"时,程序将退出。
这只是一个简单的示例,你可以根据自己的需求和数据来扩展和完善这个聊天AI。希望对你有所帮助
原文地址: https://www.cveoy.top/t/topic/h7xA 著作权归作者所有。请勿转载和采集!