聊天机器人构建学习笔记-1

背景

开源聊天机器人项目梳理

准备

预先安装一些需要的库,安装指令如下。
pip install fuzzywuzzy
pip install jsondatabase
pip install pymongo
http://api.mongodb.com/python/current/installation.html
pip install python-twitter
https://github.com/bear/python-twitter
pip install -U textblob
python -m textblob.download_corpora
pip install ntlk

安装和使用

安装

在上述准备工作做好之后,pip install chatterbot
就可以进行该项目的安装了。

基本使用

from chatterbot import ChatBot
from chatterbot.training.trainers import ChatterBotCorpusTrainer

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

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

# 开始对话 
print(chatbot.get_response("Hello, how are you today?"))
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参数是用以指定所创建的chat bot所使用数据集的位置。上述的定义,我们可以看出该chat bot所使用的数据集是database.json,如果该database.json不存在的话,则会自动创建。注意:JsonDatabaseAdapter是ChatterBot的默认adapter,可以缺省。

输入和输出adapters

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

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"
)

adapter的介绍,将在下次做一个独立的说明和介绍。

获取反馈

当采用一个循环的方式运行chat bot的时候,可以设定一个异常,当该异常被触发的时候,则跳出循环。以下是chat bot就是一个和输入终端的通信,当终端输入键盘输入ctrl-c or ctrl-d 便跳出循环。

from chatterbot import ChatBot


# Create a new instance of a ChatBot
bot = ChatBot("Terminal",
    storage_adapter="chatterbot.adapters.storage.JsonDatabaseAdapter",
    logic_adapters=[
        "chatterbot.adapters.logic.MathematicalEvaluation",
        "chatterbot.adapters.logic.TimeLogicAdapter",
        "chatterbot.adapters.logic.ClosestMatchAdapter"
    ],
    input_adapter="chatterbot.adapters.input.TerminalAdapter",
    output_adapter="chatterbot.adapters.output.TerminalAdapter",
    database="../database.db"
)

print("Type something to begin...")

# The following loop will execute each time the user enters input
while True:
    try:
        # We pass None to this method because the parameter
        # is not used by the TerminalAdapter
        bot_input = bot.get_response(None)

    # Press ctrl-c or ctrl-d on the keyboard to exit
    except (KeyboardInterrupt, EOFError, SystemExit):
        break

类似的例子可以参考:
http://chatterbot.readthedocs.io/en/stable/examples.html

数据集训练

Chatterbot提供一个公用模块进行数据集的训练,目前该模块集成7种语种的训练,包括英语,葡萄牙语、西班牙语、法语、印尼语、意大利语和中文。至于其他语种的数据训练,可以在 chatterbot/corpus 进行补充和添加。
训练模块的使用如下:

# Train based on the english corpus
chatbot.train("chatterbot.corpus.english")

# Train based on english greetings corpus
chatbot.train("chatterbot.corpus.english.greetings")

# Train based on the english conversations corpus
chatbot.train("chatterbot.corpus.english.conversations")

这里写图片描述

采用中文语料库

需要使用python3,否则会有unicode问题,所以在安装的时候主要要用pip3 install chatterbot
进行项目的安装。

from chatterbot import ChatBot
from chatterbot.training.trainers import ChatterBotCorpusTrainer
deepThought = ChatBot("deepThought")
deepThought.set_trainer(ChatterBotCorpusTrainer)
# 使用中文语料库训练它
deepThought.train("chatterbot.corpus.chinese")  # 语料库
print(deepThought.get_response("很高兴认识你"))
print(deepThought.get_response("嗨,最近如何?"))
print(deepThought.get_response("复杂优于晦涩")) #语出 The Zen of Python
print(deepThought.get_response("面对模棱两可,拒绝猜测的诱惑."))
# print(deepThought.get_response("生命、宇宙以及世间万物的终极答案是什么?"))

设置training class和基于list数据集的训练

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

from chatterbot.trainers import ListTrainer

chatterbot = ChatBot("Training Example")
chatterbot.set_trainer(ListTrainer)

chatterbot.train([
    "Hi there!",
    "Hello",
])

chatterbot.train([
    "Greetings!",
    "Hello",
])

也可以采用更长的训练对话:

chatterbot.train([
    "How are you?",
    "I am good.",
    "That is good to hear.",
    "Thank you",
    "You are welcome.",
])

基于语料数据的训练

ChatterBot自带语料数据集,只需指定所需要的语料数据集模块即可,训练方法如下:

from chatterbot.trainers import ChatterBotCorpusTrainer

chatterbot = ChatBot("Training Example")
chatterbot.set_trainer(ChatterBotCorpusTrainer)#指定语料数据集的training class

chatterbot.train(
    "chatterbot.corpus.english"#指定数据集
)

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

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

新建新的training class

对于特定的数据,可以自建trainer进行数据集的训练。选择自建的情形,一般是数据集的格式是无法直接被ChatterBot所接收的。新建training class的时候,要在chatterbot/training/trainers.py中进行添加和补充。如该文件当前存在的
ListTrainer = ListDeprecationHelper(NewListTrainer)
ChatterBotCorpusTrainer = CorpusDeprecationHelper(NewChatterBotCorpusTrainer)
即是表示上述所介绍的两种trainer。

ChatterBot中的语料

语料数据集位于安装文件Lib\site-packages\chatterbot\corpus中。从该目录下data文件存储着语料数据集。至于语料数据集的拓展,可以通过chatterbot/corpus/data的说明进行学习。

原理

一个未经训练的ChatterBot机器人,并没有与用户交谈所需的知识。每当用户输入一句话,机器人将存下它,同时也存下答复的句子。 随着机器人接受的输入的增加,它能够回答的问题的数量和准确度都会相应提升。程序是如何响应用户输入的呢?首先从已知句子中匹配出与用户输入最相近的句子(如何衡量相近?),之后找到最有可能的回复,那么如何得出最有可能的回复呢?由所有和机器交流过的人们,对这个输入问题(匹配过的)的各个回答的频率决定。

过程梳理

1:创建chat bot
from chatterbot import ChatBot
chatbot = ChatBot(“Ron Obvious”)
ChatBot()的参数只是chatbot 的一个名字,所以是可以任意取的。
2:训练
目前的训练是以一种对话模式进行的,虽然该步骤不是必要的,但是为了确保更高的准确性,还是值得做的。
训练代码如下:

from chatterbot.trainers import ListTrainer

conversation = [
    "Hello",
    "Hi there!",
    "How are you doing?",
    "I'm doing great.",
    "That is good to hear",
    "Thank you.",
    "You're welcome."
]
chatbot.set_trainer(ListTrainer)
chatbot.train(conversation)

3:进行对话
在训练之后的可以直接根据输入获取对话回应。

response = chatbot.get_response("Good morning!")
print(response)

4:只读模式
ChatterBot是会对每个输入的语句进行学习的。如果想要使得你已经训练过的bot不再继续学习输入的语句,可以通过以下方式进行设置,在初始化的时候将read_only设置为true。
chatbot = ChatBot(“wwjtest”, read_only=True) //否则bot会学习每个输入
未完,待续

参考地址:
http://chatterbot.readthedocs.io/en/stable/

文档

例子可以从examples获取。
此外,还有一个基于ChatterBot的项目Django project using ChatterBot.可以参考学习。
终于看完了,来喝杯茶醒醒神吧
这里喝茶
项目地址:
https://github.com/gunthercox/ChatterBot

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
# 说明 该库是对目前市面上已有的开源中文聊天语料的搜集和系统化整理工作 该库搜集了包含 - chatterbot - 豆瓣多轮 - PTT八卦语料 - 青云语料 - 电视剧对白语料 - 贴吧论坛回帖语料 - 微博语料 - 小黄鸡语料 共8个公开闲聊常用语料和短信,白鹭时代问答等语料。 并对8个常见语料的数据进行了统一化规整和处理,达到直接可以粗略使用的目的。 **使用该项目,即可对所有的聊天语料进行一次性的处理和统一下载,不需要到处自己去搜集下载和分别处理各种不同的格式。* # 环境 python3 # 处理过程 将各个来源的语料按照其原格式进行提取,提取后进行繁体字转换,然后统一变成一轮一轮的对话。 # 使用方法 将解压后的raw_chat_corpus文件夹放到当前目录下 目录结构为 ``` raw_chat_corpus -- language -- process_pipelines -- raw_chat_corpus ---- chatterbot-1k ---- douban-multiturn-100w ---- .... -- main.py -- ... ``` 执行命令即可 ```bash python main.py ``` 或者 ```bash python3 main.py ``` # 生成结果 每个来源的语料分别生成一个独立的*.tsv文件,都放在新生成的clean_chat_corpus文件夹下。 生成结果格式为 tsv格式,每行是一个样本,先是query,再是answer ``` query \t answer ``` # 结果的使用 这个就根据每个人不同的情况自主使用即可 个人对于聊天机器人方向实践也不是很多,以下一篇之前写的知乎专栏供参考 **《从产品完整性的角度浅谈chatbot》** 文章粗略讲解了如下一些方面,介绍了聊天机器人在实际产品化过程中可能遇到的问题和解决办法。 1. chatbot自身人格的设置 1. 产品上线需要考虑的敏感词处理 1. 文本检索模型的使用 1. 文本生成模型的使用 1. 回答打分机制 1. 万能回答的使用策略 1. 多媒体消息的处理 1. 产品模型部署的问题 # 版权说明 本项目为非商业项目,为纯搜集和汇总资料,如有侵权,请在issue下留言。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值