器→工具, 开源项目

使用 ChatterBot构建聊天机器人

钱魏Way · · 3,912 次浏览
!文章内容如有错误或排版问题,请提交反馈,非常感谢!

ChatterBot是一个基于机器学习的聊天机器人引擎,构建在 python 上,主要特点是可以自可以从已有的对话中进行学习。

安装调试最简单的聊天机器人

安装

pip install chatterbot

基本使用

# -*- coding: utf-8 -*-
from chatterbot import ChatBot
from chatterbot.trainers import ChatterBotCorpusTrainer

chatbot = ChatBot("myBot")
chatbot.set_trainer(ChatterBotCorpusTrainer)

# 使用英文语料库训练它
chatbot.train("chatterbot.corpus.english")

# 开始对话
while True:
    print(chatbot.get_response(input(">")))

默认情况下, ChatterBot 使用 JsonDatabaseAdapter 作为 storage adapter, 使用 ClosestMatchAdapter 作为 logic adapter, 使用 VariableInputTypeAdapter 作为 input adapter。

storage adapter

ChatterBot 创建之后,会建立一个类族适配器(adapter classes),在该适配器下该 ChatterBot 可以连接到不同类型的数据集。本文所采用的是 JsonDatabaseAdapter,该 Storage adapter 是以 json 格式存储数据的。注意:JsonDatabaseAdapter 并不适用于海量数据,如果数据集过大该方法的性能将受到很大局限。

创建 ChatterBot 的时候可以在入参中指定 JsonDatabaseAdapter,如下面的参数所示:

bot = ChatBot(
    "Norman"
    storage_adapter="chatterbot.adapters.storage.JsonDatabaseAdapter",
    database="./database.json"
)

其中的 database 参数是用以指定所创建的 chatbot 所使用数据集的位置。上述的定义吗,我们可以看出该 chatbot 所使用的数据集是 database.json,如果该 database.json 不存在的话,则会自动创建。注意:JsonDatabaseAdapter 是 ChatterBot 的默认 adapter,可以缺省。

输入和输出 adapters

在创建 ChatBot 的时候可以指定输入和输出终端 adapter。输入终端 adapter 用以读取终端的输入,输入终端 adapter 则是打印出 chatbot 的应答信息。

使用如下:

bot = ChatBot(
    "Norman"
    storage_adapter="chatterbot.adapters.storage.JsonDatabaseAdapter",
    input_adapter="chatterbot.adapters.input.TerminalAdapter",
    output_adapter="chatterbot.adapters.output.TerminalAdapter",
    database="./database.json"
)

Logic adapters

在新建 ChatBot 的时候可以指定 logic_adapters 的值,该参数是一序列的 logic adapter。在 ChatBot 中一个 logic adapter 就是一个类,这个类是用于接收输入的语句和反馈该输入的语句。

在 logic adapter 的使用数量上并不受限。下面的例子中可以看出,使用的是两个 logic adapter。其中 TimeLogicAdapter 是返回当前时间,MathematicalEvaluation adapter 则是用以计算问题的。

bot = ChatBot(
    "Norman"
    storage_adapter="chatterbot.adapters.storage.JsonDatabaseAdapter",
    input_adapter="chatterbot.adapters.input.TerminalAdapter",
    output_adapter="chatterbot.adapters.output.TerminalAdapter",
    logic_adapters=[
        "chatterbot.adapters.logic.MathematicalEvaluation",
        "chatterbot.adapters.logic.TimeLogicAdapter"
    ],
    database="./database.json"
)

创建自己的 adapters 参考默认使用的ClosestMatchAdapterVariableInputTypeAdapter。如果需要语音输入,则可以调用百度语音接口。

让机器人支持中文

Chatterbot 提供一个公用模块进行数据集的训练,目前该模块集成 7 种语种的训练,包括英语,葡萄牙语、西班牙语、法语、印尼语、意大利语和中文。训练集存放在\Lib\site-packages\chatterbot\corpus\data 目录下:

使用中文语料库进行训练(注意,这里只支持 Python3,否则会报编码错误),报错内容为:UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe4 in position 0: ordinal not in range(128)

# -*- coding: utf-8 -*-
from chatterbot import ChatBot
from chatterbot.trainers import ChatterBotCorpusTrainer

chatbot = ChatBot("myBot")
chatbot.set_trainer(ChatterBotCorpusTrainer)

# 使用英文语料库训练它
chatbot.train("chatterbot.corpus.chinese")

# 开始对话
while True:
    print(chatbot.get_response(input(">")))

ChatterBot 也支持训练数据集的子集,如只想要训练英文问候语和对话,则只要将该两个子集导入进行训练即可:

chatterbot.train(
    "chatterbot.corpus.english.greetings",
    "chatterbot.corpus.english.conversations"
)

里面虽然包含各种语言,但是训练集的数据非常的小,如需更好的表现,需要自己添加更多的数据。

手动训练机器人

ChatterBot内置 training class,也可以根据自己的需要自行创建,通过调用 train() 函数之前先调用 set_trainer() 来进行设置。使用方法如下:

# -*- coding: utf-8 -*-

from chatterbot import ChatBot
from chatterbot.trainers import ListTrainer


my_bot = ChatBot("Training demo")
my_bot.set_trainer(ListTrainer)
my_bot.train([
"嗳,渡边君,真喜欢我?",
"那还用说?",
"那么,可依得我两件事?",
"三件也依得",
])

# test
print(my_bot.get_response("真喜欢我?"))
print(my_bot.get_response("可依得我两件事?"))

训练好的数据,默认存在 ./database.db(参考jsondatabase.py), 不是 sqlite 数据库,实际是jsondb,对 json 做了封装(参考jsondb/db.py

只读模式

ChatterBot 是会对每个输入的语句进行学习的。如果想要使得你已经训练过的 bot 不再继续学习输入的语句,可以通过以下方式进行设置,在初始化的时候将 read_only 设置为 true。

chatbot = ChatBot("wwj test", read_only=True) // 否则 bot 会学习每个输入

最后一个问题,语料库可以从哪里来?

  • 电视电影字幕
  • 知识问答库

参考链接:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注