Python 实现简单智能聊天机器人

Python 实现简单智能聊天机器人攻略

介绍

智能聊天机器人是指能够理解人类语言并进行智能回复的计算机程序,是自然语言处理(NLP)和人工智能(AI)技术的应用之一。Python 作为一种流行的编程语言,在实现智能聊天机器人方面表现出色。

本攻略将介绍如何使用 Python 实现一个简单的智能聊天机器人。

步骤

  1. 安装所需的 Python packages。
pip install nltk
pip install numpy
pip install tensorflow
pip install tflearn
  1. 导入所需的 packages。
import nltk
from nltk.stem.lancaster import LancasterStemmer
import numpy as np
import tflearn
import tensorflow as tf
import random
import json
import pickle
  1. 准备数据

准备一份包含了智能聊天机器人可能会遇到的所有问题及对应回答的 JSON 文件,是实现智能聊天机器人的最重要的一步。

  1. 对数据进行预处理

使用NLTK(自然语言工具包)进行文本的预处理,去除无用词汇,将文本转换为词汇列表。在预处理之后,将列表转换成按照每个词的出现次数统计的向量。

stemmer = LancasterStemmer()

def tokenize(sentence):
    return nltk.word_tokenize(sentence)

def stem(word):
    return stemmer.stem(word.lower())

def bag_of_words(tokenized_sentence, words):
    sentence_words = [stem(word) for word in tokenized_sentence]
    bag = np.zeros(len(words), dtype=np.float32)
    for idx, w in enumerate(words):
        if w in sentence_words:
            bag[idx] = 1.0
    return bag
  1. 构建机器学习模型

在预处理完成的基础上,将数据集分成输入和输出,使用 TensorFlow 和 tflearn 库在数据集上训练模型,并使用 pickle 序列化保存模型。

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"]:
        tokenized_sentence = tokenize(pattern)
        docs_x.append(bag_of_words(tokenized_sentence, words))
        docs_y.append(intent["tag"])
    if intent["tag"] not in labels:
        labels.append(intent["tag"])

words = [stem(word) for word in words]
words = sorted(list(set(words)))

labels = sorted(labels)

training_data = []
output_data = []

out_empty = [0 for _ in range(len(labels))]

for idx, x in enumerate(docs_x):
    training_data.append(x)
    output_data.append(out_empty.copy())
    output_data[idx][labels.index(docs_y[idx])] = 1

training_data = np.array(training_data)
output_data = np.array(output_data)

tf.reset_default_graph()

net = tflearn.input_data(shape=[None, len(training_data[0])])
net = tflearn.fully_connected(net, 8)
net = tflearn.fully_connected(net, 8)
net = tflearn.fully_connected(net, len(output_data[0]), activation="softmax")
net = tflearn.regression(net)

model = tflearn.DNN(net)

model.fit(training_data, output_data, n_epoch=1000, batch_size=8, show_metric=True)
model.save("model.tflearn")

pickle.dump({"words": words, "labels": labels, "training_data": training_data, "output_data": output_data}, open("data.pickle", "wb"))
  1. 完整的聊天机器人代码样例
import nltk
from nltk.stem.lancaster import LancasterStemmer
import numpy as np
import tflearn
import tensorflow as tf
import random
import json
import pickle

stemmer = LancasterStemmer()

def tokenize(sentence):
    return nltk.word_tokenize(sentence)

def stem(word):
    return stemmer.stem(word.lower())

def bag_of_words(tokenized_sentence, words):
    sentence_words = [stem(word) for word in tokenized_sentence]
    bag = np.zeros(len(words), dtype=np.float32)
    for idx, w in enumerate(words):
        if w in sentence_words:
            bag[idx] = 1.0
    return bag

def chat():
    with open("intents.json") as file:
        data = json.load(file)

    with open("data.pickle", "rb") as f:
        words, labels, training_data, output_data = pickle.load(f)

    tf.reset_default_graph()

    net = tflearn.input_data(shape=[None, len(training_data[0])])
    net = tflearn.fully_connected(net, 8)
    net = tflearn.fully_connected(net, 8)
    net = tflearn.fully_connected(net, len(output_data[0]), activation="softmax")
    net = tflearn.regression(net)

    model = tflearn.DNN(net)

    model.load("model.tflearn")

    print("Let's chat! Enter 'quit' to exit")
    while True:
        user_input = input("You: ")
        if user_input.lower() == 'quit':
            break

        tokenized_input = tokenize(user_input)
        bag = bag_of_words(tokenized_input, words)

        results = model.predict([bag])[0]
        results_index = np.argmax(results)
        tag = labels[results_index]

        if results[results_index] > 0.7:
            for intent in data["intents"]:
                if intent["tag"] == tag:
                    response = random.choice(intent["responses"])
                    print("Bot: ", response)
        else:
            print("Bot: I'm not quite sure what you mean")

此时,聊天机器人已经构建完成,你可以运行 chat() 函数进行测试。

示例

以下是一个测试机器人的例子:

Let's chat! Enter 'quit' to exit
You: Hi there!
Bot: Hiya!

You: Can you help me with my order?
Bot: Of course, can you give me your order number?

You: Oh, I don't have it with me right now.
Bot: Sorry, I need your order number to help you.

You: Can you tell me about the return policy?
Bot: Our return policy is 30 days from the date of purchase. What item are you looking to return?

You: Thank you!
Bot: You're welcome!

如上例所示,智能聊天机器人可以理解并回答用户提出的关于订单、退货政策等问题,过程中表现出了不同程度的智能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python 实现简单智能聊天机器人 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • Python设计实现的计算器功能完整实例

    以下是关于“Python设计实现的计算器功能完整实例”的完整攻略: 简介 计算器是一种常用的工具,它可以进行基本的数学运算。在本教程中,我们将介绍如何使用Python实现一个简单的计算器,包括加、减、乘、除和求幂等基本运算。 计算器 Python实现 以下是使用Python实现计算器的代码: def add(x, y): return x + y def s…

    python 2023年5月14日
    00
  • Python整型运算之布尔型、标准整型、长整型操作示例

    Python整型运算之布尔型、标准整型、长整型操作示例 Python是一种强类型语言,支持多种数据类型,包括布尔型、标准整型和长整型。在本文中,我们将详细讲解Python中整型数据类型的操作示例,包括类型转换、算术运算、比较运算和逻辑运算等。 布尔型操作示例 布尔型是一种简单的整型数据类型,只有两个值:True和False。在Python中,我们可以使用bo…

    python 2023年5月14日
    00
  • 使用python绘制子图箱线图

    【问题标题】:Draw subplots boxplot using python使用python绘制子图箱线图 【发布时间】:2023-04-03 14:38:01 【问题描述】: 我想一起绘制两个平行的箱线图。为此,我在 python 中使用了 sub plots 函数,下面是我用于该过程的代码,但我无法从代码中得到很好的输出,因为它已经绘制了两个空图,…

    Python开发 2023年4月8日
    00
  • Python的加密模块md5、sha、crypt使用实例

    Python的加密模块md5、sha、crypt使用实例 本文将给出Python中三种加密模块:md5、sha、crypt 的使用实例,分别介绍各自的作用、使用方法和实例应用。 md5模块 md5模块是Python的一个常用的加密模块,主要用于数据校验、数字签名等场景。 md5加密模块常用于生成摘要值,可以将任意一种消息数据(不论大小)传输为一种长度固定的算…

    python 2023年6月3日
    00
  • python创建学生成绩管理系统

    下面是详细讲解“Python创建学生成绩管理系统”的完整攻略。 1. 确定需求和功能 在创建学生成绩管理系统前,需要先确定需求和功能。 基本需求:- 可以输入学生信息和成绩- 可以查看学生信息和成绩- 可以删除学生信息和成绩- 可以修改学生信息和成绩- 可以根据成绩进行排序 进阶需求:- 可以导出学生信息和成绩 2. 设计数据结构 本系统的数据结构是由学生信…

    python 2023年5月30日
    00
  • Python json模块常用方法小结

    下面就详细讲解一下“Python json模块常用方法小结”的攻略。 为什么需要json模块 在Python中,我们经常需要将Python对象序列化为JSON格式的字符串或将JSON字符串反序列化为Python对象。为了方便实现这个过程,Python提供了一个标准的json模块,它可以实现Python对象与JSON字符串之间的相互转换。 常用方法 json.…

    python 2023年6月3日
    00
  • 解决python3.5 正常安装 却不能直接使用Tkinter包的问题

    针对 Python3.5 正常安装却不能直接使用 Tkinter 包的问题,可以按照以下步骤进行解决: 问题分析 在 Python3.5 中,Tkinter 包已经默认安装,但在某些情况下可能无法正常使用,这是因为 Tkinter 包本身依赖于 Tcl/Tk 库,如果 Tcl/Tk 库没有正确安装或者环境变量没有配置好,Tkinter 包就无法直接使用。 解…

    python 2023年6月13日
    00
  • Python中使用Lambda函数的5种用法

    Python中使用Lambda函数的5种用法 Lambda函数也称为匿名函数,是一种函数式编程的技巧。Python中的Lambda函数可以用于快速定义简单的单行函数,其语法十分简洁,具有很强的实用性。 1. 简单的Lambda函数 在Python中,Lambda函数通常用于某些代码只需要一次使用的情况下。下面是一个非Lambda函数的示例: def squa…

    python 2023年6月5日
    00
合作推广
合作推广
分享本页
返回顶部