原文地址:http://www.bugingcode.com/blog/ChatterBot_Dialogue_process.htmlhtml
部署机器人的各类属性,根据前面的章节里聊天机器人的各类属性,对聊天机器人进行相应的配置,建立一个符合本身的机器人。python
bot = ChatBot( 'Default Response Example Bot', storage_adapter='chatterbot.storage.SQLStorageAdapter', logic_adapters=[ { 'import_path': 'chatterbot.logic.BestMatch' }, { 'import_path': 'chatterbot.logic.LowConfidenceAdapter', 'threshold': 0.65, 'default_response': 'I am sorry, but I do not understand.' } ], trainer='chatterbot.trainers.ListTrainer' )
logic_adapters:用来设置所选择的算法,这里选择的是chatterbot.logic.BestMatch,也就是最匹配方式,从训练的对话中找到最相识的语句,根据对话,提供回答。算法
trainer:选择的是chatterbot.trainers.ListTrainersql
在trainer中,决定选择哪一种构造方式来建立上下文的关系。数据库
def train(self, conversation): """ Train the chat bot based on the provided list of statements that represents a single conversation. """ previous_statement_text = None for conversation_count, text in enumerate(conversation): print_progress_bar("List Trainer", conversation_count + 1, len(conversation)) statement = self.get_or_create(text) if previous_statement_text: statement.add_response( Response(previous_statement_text) ) previous_statement_text = statement.text self.storage.update(statement)
在ListTrainer中,用上下句来构建一个statement ,statement至关于存储了一个上下对话的关系,在查找的时候,先找到最合适的上文,下文就是答案了。这就是一个训练的过程,训练的这一过程,主要是在构建statement,并把statement放到storage中。编程
storage_adapter有几种可选的方案chatterbot.storage.SQLStorageAdapter,MongoDatabaseAdapter,存储以前训练的statement,把statement存储在数据库中,默认的数据库选择的是本地的sqlite3。session
把语料准备好,就聊天机器人进行训练,语料的来源比较重要,像以前的小黄鸭语料的来源,主要是来源于众包,用户会交小黄鸭怎么去回答问题,语料是重要的一种选择,一个语料的质量决定了聊天机器人的可玩性。架构
训练的过程,就是一个创建statement并存储的过程,代码在ListTrainer中都有详细的体现。app
bot.train([ 'How can I help you?', 'I want to create a chat bot', 'Have you read the documentation?', 'No, I have not', 'This should help get you started: http://chatterbot.rtfd.org/en/latest/quickstart.html' ])
聊天机器人主要的过程是产生答案的过程,而答案的选择最关键的就是算法的实现,以前有介绍过,可玩性比较高的聊天机器人必须拥有不一样的算法,对不一样的聊天内容给出不同的答案,根据输入选择最合适的算法,产生最好的答案。在机器人对话中,最多见的问题是一些生活的问题,好比,天气,时间,笑话等,根据问题,选择最匹配的算法,给出精彩的答案。ide
response = bot.get_response('How do I make an omelette?')
get_response的过程
采用的是ChatBot的方法,一开始先获得输入,并对数据进行过滤,在根据输入数据选择算法,得出答案。
def get_response(self, input_item, session_id=None): """ Return the bot's response based on the input. :param input_item: An input value. :returns: A response to the input. :rtype: Statement """ if not session_id: session_id = str(self.default_session.uuid) input_statement = self.input.process_input_statement(input_item) # Preprocess the input statement for preprocessor in self.preprocessors: input_statement = preprocessor(self, input_statement) statement, response = self.generate_response(input_statement, session_id) # Learn that the user's input was a valid response to the chat bot's previous output previous_statement = self.conversation_sessions.get( session_id ).conversation.get_last_response_statement() self.learn_response(statement, previous_statement) self.conversation_sessions.update(session_id, (statement, response, )) # Process the response output with the output adapter return self.output.process_response(response, session_id)
算法是如何进行选择的呢? 在multi_adapter.py 算法选择中,遍历了全部咱们已经选择的算法,算法经过 can_process 进行选择,对输入生成的statement 进行匹配,并经过confidence来进行评分,而应该还能够进行扩展,经过不一样的得分,来选择算法,最佳匹配。
def process(self, statement): """ Returns the output of a selection of logic adapters for a given input statement. :param statement: The input statement to be processed. """ results = [] result = None max_confidence = -1 for adapter in self.get_adapters(): if adapter.can_process(statement): output = adapter.process(statement) if type(output) == tuple: warnings.warn( '{} returned two values when just a Statement object was expected. ' 'You should update your logic adapter to return just the Statement object. ' 'Make sure that statement.confidence is being set.'.format(adapter.class_name), DeprecationWarning ) output = output[1] results.append((output.confidence, output, )) self.logger.info( '{} selected "{}" as a response with a confidence of {}'.format( adapter.class_name, output.text, output.confidence ) ) if output.confidence > max_confidence: result = output max_confidence = output.confidence else: self.logger.info( 'Not processing the statement using {}'.format(adapter.class_name) ) # If multiple adapters agree on the same statement, # then that statement is more likely to be the correct response if len(results) >= 3: statements = [s[1] for s in results] count = Counter(statements) most_common = count.most_common() if most_common[0][1] > 1: result = most_common[0][0] max_confidence = self.get_greatest_confidence(result, results) result.confidence = max_confidence return result
ChatterBot的架构和流程基本清楚之后,就是对ChatterBot的扩展,一个好的ChatterBot聊天机器人,还有不少须要完成的地方,好比多轮对话,
我:天气如何?
机器人:你在位置在那里?
我:厦门
机器人:多云转晴,32摄氏度
转载请标明来之:http://www.bugingcode.com/
更多教程:阿猫学编程