目录
规范输入
使用逻辑适配器
BestMatch适配器
设置响应阈值
使用停用词exclude_words
其他适配器
时间逻辑适配器
数学评估适配器
选择不同的比较算法
Jaccard相似度指数
Levenshtein距离算法
SentimentComparison
SynsetDistance
如何使用比较方法
设置逻辑适配器选择响应的方式
first_response
most_frequent_response
random_response
如何设置响应选择方法
语料方面
语料扩展
语料分类
规范输入
使用预处理器可以修改聊天机器人收到的输入语句。
chatbot = ChatBot('Demo',preprocessors=['chatterbot.preprocessors.clean_whitespace' #从语句文本中删除所有连续的空格字符。'chatterbot.preprocessors.unescape_html' #将转义的html字符转换为未转义的html字符。例如:“&lt; b&gt;” 变为“ <b>”。'chatterbot.preprocessors.convert_to_ascii' #将Unicode字符转换为ASCII字符等效项。例如:“påfédéral”成为“ pa Federal”。])
使用逻辑适配器
逻辑适配器确定ChatterBot如何选择对给定输入语句的响应的逻辑。
BestMatch适配器
逻辑适配器根据与输入语句最匹配的已知响应返回响应。使用函数将输入语句与已知语句进行比较。一旦找到与输入语句最接近的匹配项,它将使用另一个函数选择对该语句的已知响应之一。
设置响应阈值
from chatterbot import ChatBotfrom chatterbot.trainers import ListTrainerbot = ChatBot('Bot',storage_adapter='chatterbot.storage.SQLStorageAdapter',logic_adapters=[{'import_path': 'chatterbot.logic.BestMatch','default_response': '很抱歉,未能理解', #设置默认回复,当信度内无结果时'maximum_similarity_threshold': 0.90 #设置响应信度最低为0.9}])
使用停用词exclude_words
exclude_words参数允许设置单词列表,这将防止逻辑适配器返回具有包含任何这些单词的文本的语句。
你可以在语料中添加标记,这样机器人就不会使用问题来回复你的问题了,做标记的语料必须有一定的长度,这样标记本身对语料间的相似度影响就会小很多。
class bot:def __init__(self):self.my_bot = ChatBot("demo",excluded_words = ['Q:'], #停用词列表 防止逻辑适配器返回具有包含任何这些单词的文本的语句。必须与含有默认回答的适配器同时使用logic_adapters=[{'import_path': 'chatterbot.logic.BestMatch', #逻辑适配器根据与输入语句最匹配的已知响应返回响应。'default_response': '很抱歉,未能理解','maximum_similarity_threshold': 0.8,}])def train(self):trainer = ListTrainer(self.my_bot)trainer.train(["Q: How are you?","I am good.","Q: That is good to hear.","Thank you","Q: You are welcome."])
其他适配器
时间逻辑适配器
chatterbot.logic.
TimeLogicAdapter
(chatbot,** kwargs)
该TimeLogicAdapter
标识的语句,其中一个有关当前时间的问法。如果检测到匹配的问题,则返回包含当前时间的响应。
User: What time is it?Bot: The current time is 4:45PM.
数学评估适配器
chatterbot.logic.
MathematicalEvaluation
(chatbot,** kwargs)
MathematicalEvaluation逻辑适配器解析输入以确定用户是否在问一个需要完成数学运算的问题。如果是这样,则从输入中提取方程式并返回评估结果。
User: What is four plus four?Bot: (4 + 4) = 8
选择不同的比较算法
Jaccard相似度指数
parisons.JaccardSimilarity
根据Jaccard索引计算两个语句的相似度。
Jaccard索引由分子和分母组成。在分子中,我们计算集合之间共享的项目数。在分母中,我们计算两个集合中的项目总数。假设如果句子的50%或更多的标记相等,则将句子定义为相等。这是两个示例句子:
年轻的猫饿了。猫非常饿。
当我们解析这些句子以删除停用词时,我们得到以下两个集合:
{年轻,猫,饿} {猫,非常,饿}
在上面的示例中,我们的交集为{猫,饿},其数量为2。集合的并集是{年轻,猫,非常,饿},共有四个。因此,我们的Jaccard相似度指数是2除以4,即50%。鉴于上述相似性阈值,我们将其视为匹配项。
Levenshtein距离算法
parisons.LevenshteinDistance
根据每个语句的文本的Levenshtein距离比较两个语句。
例如,基于Levenshtein距离算法的陈述“邮局在哪里?”和“寻找邮局”之间有65%的相似度。
SentimentComparison
parisons.SentimentComparison
根据为每个语句计算的情感值的接近度,计算两个语句的相似度。
SynsetDistance
parisons.SynsetDistance
计算两个语句的相似度。这是基于每个句子中每个单词之间的总最大同义词集相似度。
该算法使用NLTK的wordnet功能,根据每个语句的每个标记之间的路径相似性来确定两个语句的相似性。这本质上是对同义词接近度的评估。
如何使用比较方法
from chatterbot import ChatBotfrom parisons import levenshtein_distancechatbot = ChatBot(# ...statement_comparison_function=levenshtein_distance #小写类名+下划线)
设置逻辑适配器选择响应的方式
first_response
根据相似度排序,返回列表中第一个响应,为默认的回答方式
chatterbot.response_selection.get_first_response(input_statement, response_list, storage=None)
most_frequent_response
根据语料的相应频率,返回最近使用最多的响应
chatterbot.response_selection.get_most_frequent_response(input_statement, response_list, storage=None)[source]
random_response
随机返回,如果你的语料由相同问题组成,可以试试这个
chatterbot.response_selection.get_random_response(input_statement, response_list, storage=None)
玩笑,"你当你穿越一个坏的错误和罐头沙,你得到了什么?"玩笑,"你当你穿越蚂蚁和一只兔子,你得到了什么?"玩笑,"你当你穿越一只猫和一只紫色的人,你会得到什么?"玩笑,"你当你穿越一只猫和一个杀手,你得到了什么?"玩笑,"你当你穿越一只猫和一只柠檬,你得到了什么?"玩笑,"你当你穿越一只猫和一只曲子,你得到了什么?"玩笑,"你当你穿越一只猫和一只带你会得到什么?"
如何设置响应选择方法
from chatterbot import ChatBotfrom chatterbot.response_selection import get_most_frequent_responsechatbot = ChatBot(# ...response_selection_method=get_most_frequent_response)
语料方面
语料扩展
可以将同一问题的不同形式指向同一条答案,尤其是那些你想经常看到的答案。
冠状病毒, 新型冠状病毒属于β属的新型冠状病毒,由于病毒包膜上有向四周伸出的突起,形如花冠而得名新型冠状病毒?, 新型冠状病毒属于β属的新型冠状病毒,由于病毒包膜上有向四周伸出的突起,形如花冠而得名什么是新型冠状病毒?, 新型冠状病毒属于β属的新型冠状病毒,由于病毒包膜上有向四周伸出的突起,形如花冠而得名
chatterbot的处理流程
首先chatterbot会对问题进行分词,分词工具为结巴分词库。
“请帮我解释下冠状病毒”的分词结果为:
{请,帮我,解释下,冠状,病毒}
对用地会去调用已经分好词的模型进行jaccard算法计算相似度。例如我们前面的扩展语料:
“冠状病毒”的分词结果为:
{冠状,病毒}
“新型冠状病毒?”的分词结果为:
{新型,冠状,病毒,?}
“什么是新型冠状病毒?”的分词结果为:
{什么,是,新型,冠状,病毒,?}
分别使用jaccard算法计算用户提出的问题与三条语料的相似度为:40%,28.57%,22.22%,显然在只保留了关键词的情况下,简短语料的匹配度更高,更准确。
语料分类
不同类型的问答语料可以交给不同的机器人训练,可以根据关键字判断问题类型,然后交给对应分类的机器人回答。
其他内容详见官网https://chatterbot.readthedocs.io/en/stable/logic/index.html