开源聊天机器人项目梳理
预先安装一些需要的库,安装指令如下。
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?"))
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,可以缺省。
在创建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"
)
在新建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("生命、宇宙以及世间万物的终极答案是什么?"))
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"
)
对于特定的数据,可以自建trainer进行数据集的训练。选择自建的情形,一般是数据集的格式是无法直接被ChatterBot所接收的。新建training class的时候,要在chatterbot/training/trainers.py中进行添加和补充。如该文件当前存在的
ListTrainer = ListDeprecationHelper(NewListTrainer)
ChatterBotCorpusTrainer = CorpusDeprecationHelper(NewChatterBotCorpusTrainer)
即是表示上述所介绍的两种trainer。
语料数据集位于安装文件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