python
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Embedding, GlobalAveragePooling1D
import nltk
from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
import json
import pickle
import random
加载数据(假设你有一个intents.json文件)
with open('intents.json') as file:
data = json.load(file)
words = []
labels = []
docs_x = []
docs_y = []
预处理数据
for intent in data['intents']:
for pattern in intent['patterns']:
wrds = nltk.word_tokenize(pattern)
words.extend(wrds)
docs_x.append(wrds)
docs_y.append(intent[tag])
if intent['tag'] not in labels:
labels.append(intent['tag'])
words = [lemmatizer.lemmatize(w.lower()) for w in words if w != ?]
words = sorted(list(set(words)))
labels = sorted(labels)
创建训练数据
training = []
output = []
out_empty = [0 for _ in range(len(labels))]
for x, doc in enumerate(docs_x):
bag = []
wrds = [lemmatizer.lemmatize(w.lower()) for w in doc]
for w in words:
if w in wrds:
bag.append(1)
else:
bag.append(0)
使用模型进行预测
def bag_of_words(s, words):
bag = [0 for _ in range(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)
def chat():
print(Start talking with the bot! (type quit to stop))
while True:
inp = input(You: )
if inp.lower() == quit:
break
p = bag_of_words(inp, words)
res = model.predict(np.array([p]))[0]
ERROR_THRESHOLD = 0.25
results = [[i,r] for i,r in enumerate(res) if rERROR_THRESHOLD]
results.sort(key=lambda x: x[1], reverse=True)
return_list = []
for r in results:
return_list.append({intent: labels[r[0]], probability: str(r[1])})
tag = return_list[0]['intent']
for tg in data[intents]:
if tg['tag'] == tag:
responses = tg['responses']
print(random.choice(responses))
chat()
intents.json 文件示例
你需要一个`intents.json`文件来定义聊天机器人的意图和回应。以下是一个简单的例子:
json
{
intents: [
{
tag: greeting,
patterns: [Hi, Hey, Hello],
responses: [Hi there!, Hey, how are you?, Hello!]
},
{
tag: goodbye,
patterns: [Bye, See you later],
responses: [See you later!, Bye for now!]
}
]
}