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基于time模块求程序运行时间的方法

    要使用Python基于time模块求程序运行时间的方法,可以按照以下攻略进行: 第一步:导入time模块 在Python中使用time模块可以获取程序运行时间。要开始使用此模块,需要在程序中首先导入时间模块: import time 第二步:获取程序开始时间 在程序运行之前,需要先获取程序的开始时间,这样才能计算出程序运行的时间长度。可以调用time模块中的…

    python 2023年6月2日
    00
  • python编写爬虫小程序

    接下来我将为你详细讲解“Python编写爬虫小程序”的完整攻略。以下是步骤: 步骤1:确定需求和目标 首先,我们需要明确所要爬取的数据的来源和格式,并确定爬取目标的具体地址和标签。 例如,我们要爬取某个网站的商品信息,那么我们需要确认该网站的网址、商品数据的标签、存储的格式等。 步骤2:选型和安装相关工具 选择合适的爬虫框架,应用爬虫框架提供的API,可以大…

    python 2023年5月14日
    00
  • 前缀和非前缀命令在 python discord bot 上不能一起工作

    【问题标题】:Prefixed and non prefix commands are not working together on python discord bot前缀和非前缀命令在 python discord bot 上不能一起工作 【发布时间】:2023-04-04 20:40:02 【问题描述】: import asyncio import …

    Python开发 2023年4月6日
    00
  • Python实战项目用PyQt5制作漫画脸GUI界面

    首先,我们需要了解一些基础知识,比如PyQt5的使用以及Python语言的基础。接下来详细讲解“Python实战项目用PyQt5制作漫画脸GUI界面”的完整攻略: 1. 安装PyQt5 我们可以使用pip命令来安装PyQt5: pip install PyQt5 2. 创建Python脚本 在Python脚本中,我们需要导入一些PyQt5库。我们可以使用以下…

    python 2023年6月13日
    00
  • Python爬虫包 BeautifulSoup  递归抓取实例详解

    下面开始详细讲解“Python爬虫包 BeautifulSoup 递归抓取实例详解”。 1. 前言 为了更好的理解本文内容,你需要有一定的 Python 编程基础和 HTML 基础。如果你还不了解,可以先去了解一下。 在本文中,我们将使用 BeautifulSoup 这个 Python 爬虫包来实现递归抓取目标数据的功能。递归抓取的含义是:不断的按照某一规律…

    python 2023年5月14日
    00
  • 如何在 Python Redis 库中使用管道?

    如何在 Python Redis 库中使用管道? Redis 是一种高性能的键值存储数据库,支持多种数据结构和高级功能。其中,管道是 Redis 的一个重要功能,可以在次连接中执行多个命令,提高 Redis 的性能。在本文中,我们将介绍如何在 Python Redis 库中使用管道,包括创建管道、执行命令、提交管道等操作。 步骤1:连接 Redis 数据库 …

    python 2023年5月12日
    00
  • 类在python中似乎不是全局的

    【问题标题】:Class does not seem to be Global in python类在python中似乎不是全局的 【发布时间】:2023-04-04 04:06:01 【问题描述】: 我设置了一个类,它在一个 if 语句中接受并打印出变量。 class npc: #class for creating mooks def __init__(…

    Python开发 2023年4月6日
    00
  • python多线程实现代码(模拟银行服务操作流程)

    来看一下使用Python实现多线程的步骤。 步骤一:导入threading模块 在Python中,我们使用threading模块来实现多线程编程。导入该模块可以使用以下代码: import threading 步骤二:定义线程执行的函数 在多线程编程中,每个线程都需要执行一个函数。我们需要定义一个函数,用来封装线程的执行逻辑。例如,在本例中我们可以定义一个函…

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