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多进程池进行并发…

    python-answer 2023年3月25日
    00
  • Python之Selenium自动化浏览器测试详解

    标题:Python之Selenium自动化浏览器测试详解 介绍 本篇文章将详细讲解如何使用Python和Selenium实现自动化浏览器测试。Selenium是一个流行的自动化测试工具,可以用于模拟用户在浏览器中的行为,例如点击、输入文本、滚动等等。我们将使用Python编写Selenium测试脚本,通过实例演示如何实现浏览器自动化测试。 环境搭建 Pyth…

    python 2023年5月19日
    00
  • 状态机的概念和在Python下使用状态机的教程

    状态机的概念 状态机(英文:Finite-state machine,缩写为FSM),又称有限状态自动机,简称状态自动机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。状态机是描述对象(通常为计算机程序、计算机内部操作或者电路)在其生命周期中所经历的状态转变以及引起状态转变的事件等的方法。 在实际编程中,状态机常被用于解决诸如流程控制、自动…

    python 2023年5月23日
    00
  • python Event事件、进程池与线程池、协程解析

    Python是一门多范式编程语言,支持面向对象、函数式,以及异步编程等多种编程风格。在Python中,事件、进程池、线程池、协程等技术都可以用来实现异步编程,提高程序的并发性能。 Python Event事件 什么是Python Event事件? Python Event事件是一种简单的同步原语,用于实现线程之间的通信,特别是在多线程程序中进行条件等待和通知…

    python 2023年5月19日
    00
  • PyHacker编写URL批量采集器

    标准的markdown格式文本如下: PyHacker编写URL批量采集器 1. 准备工作 安装python3 安装PyCharm或其他编辑器 安装requests模块,可在命令行中使用以下命令进行安装 pip install requests 2. 编写代码 在PyCharm中新建一个Python文件,命名为”crawler.py”,输入以下代码: imp…

    python 2023年6月3日
    00
  • python 函数进阶之闭包函数

    Python 函数进阶之闭包函数 什么是闭包函数? 一个能够访问自由变量(Free variable)的函数,通常是定义在某个函数内部的另一个函数 现代编程语言的基本概念之一——函数式编程(Functional Programming)中的重要概念 闭包函数的实现方式 Python 中的函数式编程,可以通过以下两种方式来实现闭包函数: 内部函数中,用 non…

    python 2023年6月5日
    00
  • Anaconda的新手使用注意事项

    Anaconda的新手使用注意事项 Anaconda是一款数据科学和机器学习的多功能开发环境,提供许多有用的工具来管理Python包、虚拟环境和依赖项等。在学习和使用Anaconda前,需要注意以下几点: 注意事项 1. 下载Anaconda版本的选择 Anaconda包含两种版本:Python 2和Python 3。为了方便起见,建议下载含有Python …

    python 2023年5月13日
    00
  • python机器学习sklearn实现识别数字

    Python机器学习sklearn实现识别数字 摘要 这篇文章将详细讲解如何使用Python和Sklearn库实现数字识别。我们将会使用一个数据集来训练模型,该数据集包含了数千张手写数字的图片。我们将首先对数据进行清洗和预处理,然后使用Sklearn中的SVM(支持向量机)算法来训练我们的模型。最后,我们将评估模型的准确性,并使用它来预测新的手写数字。 数据…

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