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

news/2024/7/10 19:27:05 标签: 机器人, 聊天, 开源

背景

开源聊天机器人项目梳理

准备

预先安装一些需要的库,安装指令如下。
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


http://www.niftyadmin.cn/n/618195.html

相关文章

Linux 命令more和less的区别

more: 顾名思义显示更多less: 由于more不能后退,就取more的反义词less加上后退功能所以Linux里流传着这样一句话:"less is more".总结下more 和 less的区别:1. less可以按键盘上下方向键显示上下内容,more不能通过上下…

聊天机器人学习笔记-2-adapter

ChatterBot中的adapter介绍 ChatterBot中采用adapter模块以适用于不同类型的任务。该项目中使用到的adapter有4种,分别是storage adapters, input adapters, output adapters 和logic adapters。 storage adapters:提供连接不同存储系统( M…

Google 超分辨率技术 RAISR:模糊图片瞬间变清晰,运算速度快十倍

Google 超分辨率技术 RAISR:模糊图片瞬间变清晰,运算速度快十倍Everyday the web is used to share and store millions of pictures, enabling one to explore the world, research new topics of interest, or even share a vacation with friends and…

MySQL查询语句执行的过程

背景 介绍MySQL语句执行select的过程 过程概览 客户端发送一条查询给服务器;服务器先会检查查询缓存,如果命中了缓存,则立即返回存储在缓存中的结果。否则进入下一阶段;服务器端进行SQL解析、预处理,再由优化器生成…

python学习笔记-类的descriptor

descriptor应用背景 所谓描述器,是实现了描述符协议,即get, set, 和 delete方法的对象。 简单说,描述符就是可以重复使用的属性。 比如以下代码: f Foo() b f.bar f.bar c del f.bar 在解释器执行上述代码时,当…

H264语法分析之-slice

2.4片层句法 1片层句法(不分区) 句法CDescslice_layer_without_partitioning_rbsp(){ slice_header()2 slice_data() /* all categories of slice_data() syntax */2|3|4 rbsp_slice_trailing_bits()2 } 表6 2 片层A分区句法 句法CDescsl…

多进程编程学习笔记-1-进程基础

1.背景 在一个程序启动主进程后,可能需要再启动一个或多个进程来完成独立的多个任务。多进程编程的主要内容包括进程控制和进程间通信,在了解这些之前,需要先简单了解进程的结构。 2.Linux下进程的结构 Linux下一个进程在内存里有三部分的…

redmine 修改footer样式及内容

footer css所在文件:apps/redmine/htdocs/public/themes/classic/stylesheets/application.css 修改footer样式如下://#footer { background-color: #578bb8; border: 0; color: #fff;}//#footer a { color: #fff; font-weight: bold; }#footer { backgr…