聊天机器人
ChatterBot
ChatterBot是一个基于Python的开源聊天机器人框架。ChatterBot支持中文,且可以在对话中实时改进。
一个未经训练的ChatterBot 实例开始时不知道如何通信。每次用户输入语句时,库都会保存他们输入的文本以及语句响应的文本。当ChatterBot收到更多输入时,它可以回复的响应数量以及与输入语句相关的每个响应的准确性都会增加。
程序通过搜索与输入匹配的最接近的匹配已知语句来选择最接近的匹配响应,然后从选择对该语句的已知响应中选择响应。
详细内容可查看其官方文档:https://chatterbot.readthedocs.io/en/stable/quickstart.html
安装ChatterBot
安装ChatterBot是很简单的:pip install chatterbot
基本概念
编辑距离(Levenshtein距离)
是指两个字符串之间, 由一个转成另一个所需要的最少编辑操作次数。允许的编辑操作包括:将一个字符替换成另一个字符、插入一个字符、删除一个字符。
适配器(Adapter)
一个好的聊天机器人框架应该具有清晰、模块化、耦合度低、部件可插拔与拓展的特点。作为一个好的聊天机器人,Chatterbot也是如此。为此Chatterbot使用了Adapter的概念。ChatterBot每个部分都设计了不同的“适配器”(Adapter),分为逻辑适配器和存储适配器。逻辑适配器确定ChatterBot如何选择对给定输入语句的响应的逻辑,包括:最佳匹配适配器、时间逻辑适配器、数学评估适配器、特定响应适配器。存储适配器提供了一个接口,允许ChatterBot连接到不同的存储技术,包括:SQL存储适配器、MongoDB存储适配器。
预处理器(Preprocessors)
预处理器可以修改聊天机器人在逻辑adaper处理语句之前收到的输入语句。ChatterBot内置了几个预处理器:clean_whitespace、unescape_html、convert_to_ascii。你也可以创建自己的预处理器。
过滤器(Filters)
过滤器是创建可以传递给ChatterBot存储适配器的查询的有效方法。过滤器将减少聊天机器人在选择响应时必须处理的语句数量。
流程图
最基本的流程图应该是这样的,首先获得输入的字符串(很多种方式:终端、API等),然后同时被各个逻辑Adapter进行处理,取置信度最高的Response返回。
有时候需要对输入进行预处理:
ChatterBot的使用
基础版本
# -*- coding: utf-8 -*- from chatterbot import ChatBot from chatterbot.trainers import ListTrainer # 构建ChatBot并指定Adapter bot = ChatBot( 'Default Response Example Bot', storage_adapter='chatterbot.storage.SQLStorageAdapter', logic_adapters=[ { 'import_path': 'chatterbot.logic.BestMatch', 'default_response':'嗯' } ] ) trainer=ListTrainer(bot) trainer.train([ '在吗?', '嗯', '在干嘛呢?', '吃饭', '咋这么晚才吃呢', '嗯', '明天出去玩吗', '有事', '我想去迪士尼', '哦', '晚安', '哦' ]) while True: print(bot.get_response(input("user:")))
运行结果:
需要解释一下上面的程序:
刚开始说明文件的编码方式,如果你需要用到中文,请务必写上。
然后import需要的模块。
通过ChatBot实例化一个聊天机器人,第一参数是聊天机器人的名字,storage_adapter指定存储适配器为SQL方式,logic_adapters指定逻辑适配器为最佳匹配方式,默认回复为”嗯”。
trainer=ListTrainer(bot)将以List集合作为训练数据训练聊天机器人,train方法开始训练。
Get_response()函数得到结果。
适配器的使用
from chatterbot import ChatBot bot = ChatBot( 'Math & Time Bot', logic_adapters=[ 'chatterbot.logic.MathematicalEvaluation', 'chatterbot.logic.TimeLogicAdapter' ] ) # Print an example of getting one math based response response = bot.get_response('What is 4 + 9?') print(response) # Print an example of getting one time based response response = bot.get_response('What time is it?') print(response)
运行结果:
使用自带语料库
# -*- coding: utf-8 -*- from chatterbot import ChatBot from chatterbot.trainers import ChatterBotCorpusTrainer chatbot = ChatBot("ChineseChatBot") trainer=ChatterBotCorpusTrainer(chatbot) # 使用中文语料库训练它 trainer.train("chatterbot.corpus.chinese") # 开始对话 while True: print(chatbot.get_response(input(">")))
运行结果:
分析:
这个语料库是自带的,回答的也不知道是什么玩意