自然语言处理(NLP)是人工智能领域的一个重要分支,它使计算机系统能够理解和处理人类语言。NLP的主要应用之一是聊天机器人的开发。本文将探讨如何从零开始构建一个聊天机器人。
聊天机器人是能够与人类互动的计算机软件程序。随着机器学习,尤其是自然语言处理技术的进步,人们开始创建智能聊天机器人系统。在不同的网站上,可以看到不同类型的聊天机器人,例如航空公司网站上的机票预订聊天机器人,不同应用中的客户支持聊天机器人等。
在开始聊天机器人开发的编码部分之前,首先为聊天机器人创建一个虚拟环境。将使用名为“virtualenv”的Python库来创建虚拟环境。首先,需要安装virtualenv(在命令提示符中):
pip install virtualenv
接下来,可以创建一个名为my_env的虚拟环境。在VSCode或任何代码编辑器的终端中输入以下代码:
virtualenv my_env
然后,需要激活虚拟环境。在Windows PowerShell中激活:
my_env\Scripts\activate.ps1
在命令提示符中激活:
my_env\Scripts\activate.bat
虚拟环境已激活。
让看看intents_file.json文件。这个意图文件包含了用户可能询问的不同问题模式以及特定问题的可能输出和该类型问题的标签。
{
"intents": [
{"tag": "greetings", "patterns": ["Hello there", "Hey, How are you", "Hey", "Hi", "Hello", "Anybody", "Hey there"], "responses": ["Hello, I'm your helping bot", "Hey it's good to see you", "Hi there, how can I help you?"], "context": []},
{"tag": "thanks", "patterns": ["Thanks for your quick response", "Thank you for providing the valuable information", "Awesome, thanks for helping"], "responses": ["Happy to help you", "Thanks for reaching out to me", "It's My pleasure to help you"], "context": []},
{"tag": "no_answer", "patterns": [], "responses": ["Sorry, Could you repeat again", "provide me more info", "can't understand you"], "context": []},
{"tag": "support", "patterns": ["What help you can do?", "What are the helps you provide?", "How you could help me", "What support is offered by you"], "responses": ["ticket booking for airline", "I can help you to book flight tickets easily"], "context": []},
{"tag": "goodbye", "patterns": ["bye bye", "Nice to chat with you", "Bye", "See you later buddy", "Goodbye"], "responses": ["bye bye, thanks for reaching", "Have a nice day there", "See you later"], "context": []}
]
}
现在,让开始创建一个机器学习模型,该模型可以根据意图文件响应用户查询。将导入一些项目所需的库。
import numpy as np
import nltk
import json
import pickle
import re
import random
from keras.models import Sequential
from keras.layers import Dense, Activation, Dropout
from tensorflow.keras.optimizers import SGD
from nltk.stem import WordNetLemmatizer
需要下载一些nltk包来处理数据。
nltk.download('punkt')
nltk.download('wordnet')
加载JSON文件并读取它。同时,初始化一些列表以保存预处理和预处理数据。
tokenized_words=[]
classes = []
doc = []
ignoring_words = ['?', '!']
data_file = open('intents_file.json').read()
intents = json.loads(data_file)
加载了JSON文件。现在需要执行一些预处理,将遍历意图文件中的每个模式问题并对其进行标记化。这个标记化的文本以及标签存储为一个列表。tokenized_words包含意图文件中所有不同的标记化单词,使用nltk进行标记化。
for intent in intents['intents']:
for pattern in intent['patterns']:
w = nltk.word_tokenize(pattern) #tokenizing
tokenized_words.extend(w)
doc.append((w, intent['tag']))
if intent['tag'] not in classes:
classes.append(intent['tag'])
现在需要对数据进行词形还原,并需要移除问题标签和其他忽略的单词。
lemmatizer = WordNetLemmatizer()
lemmatized_words = [lemmatizer.lemmatize(words.lower()) for words in tokenized_words if w not in ignoring_words] #lemmatization
然后对唯一的词形还原单词和类别进行排序。
lemmatized_words = sorted(list(set(lemmatized_words)))
classes = sorted(list(set(classes)))
现在将词形还原的单词和类别保存到pickle文件中。
pickle.dump(lemmatized_words,open('lem_words.pkl','wb'))
pickle.dump(classes,open('classes.pkl','wb'))
现在可以创建神经网络模型。在Keras和TensorFlow库的帮助下,正在创建模型。让开始实现。
bot_model = Sequential()
bot_model.add(Dense(128, input_shape=(len(x_train[0]),), activation='relu'))
bot_model.add(Dropout(0.5))
bot_model.add(Dense(64, activation='relu'))
bot_model.add(Dropout(0.5))
bot_model.add(Dropout(0.25))
bot_model.add(Dense(len(y_train[0]), activation='softmax'))
已经创建了模型。接下来是使用随机梯度下降功能编译模型。
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
bot_model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
现在让拟合模型。
x_train = np.array(x_train)
y_train = np.array(y_train)
hist = bot_model.fit(x_train, y_train, epochs=200, batch_size=5, verbose=1)
创建了聊天机器人模型,所以可以保存这个模型以备将来使用。
bot_model.save('chatbot_model.h5', hist)
现在让在另一个Python文件中进行测试和创建实际聊天机器人。导入所需的库。
import pickle
import numpy as np
import json
from keras.models import load_model
import random
from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
接下来是加载在训练期间保存的模型和pickle文件。
intents_file = json.loads(open('intents.json').read())
lem_words = pickle.load(open('lem_words.pkl','rb'))
classes = pickle.load(open('classes.pkl','rb'))
bot_model = load_model('chatbot_model.h5')
创建一个函数,该函数接受用户输入作为参数,以执行一些预处理技术,如标记化和词干提取。
def cleaning(text):
words = nltk.word_tokenize(text)
words = [lemmatizer.lemmatize(word.lower()) for word in words]
return words
模型需要数值特征来预测类别,因此正在创建另一个函数,以创建预处理文本的词袋模型。
def bag_ow(text, words, show_details=True):
sentence_words = cleaning(text)
bag_of_words = [0]*len(words)
for s in sentence_words:
for i,w in enumerate(words):
if w == s:
bag_of_words[i] = 1
return (np.array(bag_of_words))
创建一个预测函数,用于预测用户询问的问题的类别或标签。
def class_prediction(sentence, model):
p = bag_ow(sentence, lem_words,show_details=False)
result = bot_model.predict(np.array([p]))[0]
ER_THRESHOLD = 0.30
f_results = [[i,r] for i,r in enumerate(result) if r > ER_THRESHOLD]
f_results.sort(key=lambda x: x[1], reverse=True)
intent_prob_list = []
for i in f_results:
intent_prob_list.append({"intent": pred_class[i[0]], "probability": str(i[1])})
return intent_prob_list
现在有了基于用户查询预测的类别或标签。正如在意图文件中看到的,每个标签都有多个响应,所以正在创建一个函数,从预测的标签中选择一个随机响应,并将其作为机器人响应发送。
def getbotResponse(ints, intents):
tag = ints[0]['intent']
intents_list = intents['intents']
for intent in intents_list:
if(intent['tag']== tag):
result = random.choice(intent['responses'])
break
return result
def bot_response(text):
ints = class_prediction(text, bot_model)
response = getbotResponse(ints, intents)
return response
为聊天机器人的工作创建了几个函数。让与聊天机器人交谈。
for i in range(3):
text = input("You : ")
print("Bot : ",bot_response(text))
输出:
You : hey
Bot : Hi there, how can I help you?
You : what help can you do
Bot : ticket booking for airline
You : bye
Bot : See you later