频道栏目
首页 > 资讯 > 其他 > 正文

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

16-08-24        来源:[db:作者]  
收藏   我要投稿

背景

开源聊天机器人项目梳理

准备

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

数据集训练

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会学习每个输入
未完,待续

相关TAG标签
上一篇:Python3连接MySQL数据库
下一篇:git使用教程
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站