Chatterbot 是基于pyhton实现的一个简单的聊天机器人,它需要大量对话语料来支撑它的运行。当用户给它一个输入时,它会在所有的语料库中寻找和这句话最相似的一句话,然后返回语料库中的下一句。chatterbot_corpus 是 Chatterbot 自带的语料库。本篇就先简单的写下chatterbot的安装使用。
一、安装
我们把chatterbot和示例的语料库一起安装下,这里使用pip的方式进行安装:
pip install chatterbot chatterbot_corpus
这样安装完后,还不能用,还需要安装spacy语言包才可以使用,不然直接用会报如下的错误:
File “/opt/miniconda3/lib/python3.7/site-packages/spacy/util.py”, line 139, in load_model
raise IOError(Errors.E050.format(name=name))
OSError: [E050] Can’t find model ‘en’. It doesn’t seem to be a shortcut link, a Python package or a valid path to a data directory.
解决方法是安装语言包,具体可以参考链接:https://spacy.io/usage/models ,对应的安装指令为:
python -m spacy download en_core_web_sm
python -m spacy download zh_core_web_sm
或
python -m spacy download en
python -m spacy download zh //该条不一定能成功
二、训练
在使用前,需要先指定语料库进行训练,训练结果会存到数据库里,这里默认的是sqlite库,也支持mongodb等库。
from chatterbot import ChatBot
from chatterbot.trainers import ChatterBotCorpusTrainer
# Create a new instance of a ChatBot
bot = ChatBot(
'mybot',
storage_adapter='chatterbot.storage.SQLStorageAdapter',
database_uri='sqlite:///database.db'
)
trainer = ChatterBotCorpusTrainer(bot)
trainer.train("chatterbot.corpus.chinese")
trainer.train("chatterbot.corpus.english")
这是创建一个聊天机器人,名字叫 mybot(你也可以改成自己起的名字),使用 Sqlite中的数据,建议使用mongodb数据。
这句代码里面有一个单词 adapter,官方翻译为“适配器”。其实它更准确的含义是“组件”。创建 Chatbot 时还有很多 xxx_adapter 这样的参数,可以为机器人开启各种各样的功能。不过有一点要注意,有些功能可能只对于英语进行了适配,对其他语言支持并不好。
上在使用的就是chatterbot_corpus包默认安装的语料库内容,其对应的地址为:/lib/python3.7/site-packages/chatterbot_corpus/data/chinese(english)下,执行上面的训练输出如下:
训练完成后,训练的内容会保存在上面配置的数据库里。后面使用的时候就可以直接调用数据库执行。
三、使用
使用上面训练好的数据库里的内容,可以使用如下的代码进行测试:
from chatterbot import ChatBot
from chatterbot.trainers import ChatterBotCorpusTrainer
# Create a new instance of a ChatBot
bot = ChatBot(
'Terminal',
storage_adapter='chatterbot.storage.SQLStorageAdapter',
database_uri='sqlite:///database.db'
)
trainer = ChatterBotCorpusTrainer(bot)
print('Type something to begin...')
def r(s):return bot.get_response(s).text
# The following loop will execute each time the user enters input
while True:
try:
i = input('>>> ').strip()
if i != 'exit':
print(r(i))
# Press ctrl-c or ctrl-d on the keyboard to exit
except (KeyboardInterrupt, EOFError, SystemExit):
break
我这里使用小黄鸡语料库训练后的对话结果如下: