在Python中使用TensorFlow部署一个聊天机器人
在这篇文章中,你将学习如何使用Tensorflow部署一个聊天机器人。聊天机器人基本上是一个机器人(一个程序),它可以像人类一样谈论和回答各种问题。我们将使用一些Python模块来做到这一点。
本文分为两部分:
首先,我们将训练聊天机器人模型,然后在第二部分,我们将学习如何让它工作并对用户的各种输入做出反应。
需要的模块:
- random – 该模块用于生成聊天机器人的随机响应。
- json – 从json文件中读取
- pickle – 将数据保存到文件中
- tensorflow – 用于训练神经网络。它是一个开源的机器学习库。
- numpy – 它是一个用于处理数组的Python库。
- nltk – 它是建立Python程序以处理人类语言数据的一个领先平台。
训练聊天机器人模型
我们要做的第一件事是训练聊天机器人模型。为了做到这一点,我们要创建一个名为 “intense.json “的文件,在其中写下所有的意图、标签和我们的聊天机器人要回应的词语或短语。
第1步:创建一个 “intense.json”:
这里我们只添加了三个标签,只是为了展示它是如何工作的。你可以添加很多的标签!
第2步:创建一个 “training.py”:
下一步是训练我们的模型。我们将使用一个叫做WordNetLemmatizer()的类,它将给出聊天机器人可以识别的词的词根。例如,对于hunting、hunter、hunts和hunted,WordNetLemmatizer()类的lemmatize功能将给出 “hunt”,因为它是词根。
- 创建一个WordNetLemmatizer()类对象。
- 从 “intense.json “文件中读取内容并将其存储到变量 “intents “中。接下来,初始化空列表来存储内容。
- 接下来,我们有一个叫做word_tokenize(para)的函数。它接收一个句子作为参数,然后返回一个包含该句子所有单词的字符串的列表。在这里,我们对模式进行标记,然后将它们追加到一个列表’words’中。因此,最后,这个列表’words’将拥有’pattern’列表中的所有单词。
- 在文档中,我们以元组的形式拥有所有的模式和它们的标签。
- 现在,使用列表理解,我们将修改上面创建的列表 “单词”,并存储单词的 “词根”,或简单地说,词根。
- 使用pickle模块的dump()函数,将 “词 “和 “类 “的数据转储到同名的二进制文件中。
第3步:现在我们需要将我们的数据分类为0和1,因为神经网络的工作对象是数值,而不是字符串或其他东西。
- 创建一个名为training的空列表,我们将在其中存储用于训练的数据。同时创建一个output_empty列表,它将存储与intense.json中的类一样多的0。
- 接下来,我们将创建一个袋子,用来存储0和1。(0,如果该词不在模式中,1,如果该词在模式中)。为了做到这一点,我们将遍历文档列表,如果它不在模式中,就将1追加到’袋’中,否则就是0。
- 现在将这个训练集进行洗牌,使其成为一个numpy数组。
- 将由1和0组成的训练集分成两部分,即train_x和train_y。
第四步:我们已经来到了聊天机器人模型的模型构建部分。在这里,我们将部署一个顺序模型,我们将在上面准备的数据集上训练它。
- Add()。该函数用于在神经网络中添加层。
- Dropout()。该函数用于避免过度拟合
输出:
创建一个main.py来运行聊天工具
我们已经完成了模型的训练,现在我们需要创建主文件,使聊天机器人模型工作并对我们的输入做出反应。
第1步:要开始,请导入以下模块。
第2步:初始化下列类和文件内容。
第3步:我们将在这里定义3个函数。
clean_up_sentences(sentence) – 这个函数将从我们要输入的句子中分离出单词。
bagw(sentence):这个函数将把1追加到一个列表变量’bag’中,如果这个词包含在我们的输入中,并且也出现在先前创建的单词列表中。
- 首先,我们将使用上面定义的函数从输入中分离出 “根 “字,然后在下一行,初始化一个名为bag的列表变量,该变量将包含与单词列表长度相同数量的0。
- 使用嵌套的for循环,我们将检查输入的单词是否也在单词列表中。如果是,我们就把1加到袋子里,否则就保持0。
- 返回一个列表变量bag的numpy数组,现在包含1和0。
predict_class(sentence):该函数将预测用户输入的句子的类别。
- 使用上面定义的函数初始化一个变量bow,它将包含一个0和1的NumPy数组。使用predict()函数,我们将根据用户的输入来预测结果。
- 初始化一个变量ERROR_THRESHOLD,如果数值大于ERROR_THRESHOLD,则从’res’中追加,然后用排序函数进行排序。
- 使用列表变量return_list,存储intense.json文件中的标签或类。
get_response(intents_list, intents_json):该函数将从用户输入的句子/单词所属的类别中随机打印一个响应。
- 首先,我们初始化一些必要的变量,如标签、list_of_intents和结果。
- 如果标签与list_of_intents中的标签相匹配,则使用随机模块的choice()方法,在一个名为result的变量中存储一个随机响应。
- 返回结果。
第4步:最后,我们将初始化一个无限的while循环,提示用户输入并打印出聊天机器人的回应。
main.py的内容如下: