zoukankan      html  css  js  c++  java
  • ChatterBot聊天机器人呢结构(五):ChatterBot对话流程

    原文地址:http://www.bugingcode.com/blog/ChatterBot_Dialogue_process.html

    创建机器人

    部署机器人的各种属性,根据前面的章节里聊天机器人的各种属性,对聊天机器人进行相应的配置,创建一个符合自己的机器人。

    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

    logic_adapters:用来设置所选择的算法,这里选择的是chatterbot.logic.BestMatch,也就是最匹配方式,从训练的对话中找到最相识的语句,根据对话,提供回答。

    trainer

    trainer:选择的是chatterbot.trainers.ListTrainer

    在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

    storage_adapter有几种可选的方案chatterbot.storage.SQLStorageAdapter,MongoDatabaseAdapter,存储之前训练的statement,把statement存储在数据库中,默认的数据库选择的是本地的sqlite3。

    训练机器人

    把语料准备好,就聊天机器人进行训练,语料的来源比较重要,像之前的小黄鸭语料的来源,主要是来源于众包,用户会交小黄鸭怎么去回答问题,语料是重要的一种选择,一个语料的质量决定了聊天机器人的可玩性。

    训练的过程,就是一个建立statement并存储的过程,代码在ListTrainer中都有详细的体现。

    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'
    ])
    

    产生答案

    聊天机器人主要的过程是产生答案的过程,而答案的选择最关键的就是算法的实现,之前有介绍过,可玩性比较高的聊天机器人必须拥有不同的算法,对不同的聊天内容给出不一样的答案,根据输入选择最合适的算法,产生最好的答案。在机器人对话中,最常见的问题是一些生活的问题,比如,天气,时间,笑话等,根据问题,选择最匹配的算法,给出精彩的答案。

    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/

    更多教程:阿猫学编程

  • 相关阅读:
    js去除空格
    Quartz定时任务学习(九)Quartz监听器
    Quartz定时任务学习(七)Cron 触发器
    数据挖掘之聚类算法K-Means总结
    SQL SERVER分区具体例子详解
    基于basys2驱动LCDQC12864B的verilog设计图片显示
    图像处理的多线程计算
    三维空间中的几种坐标系
    2017年要学习的三个CSS新特性
    Mesos 资源分配
  • 原文地址:https://www.cnblogs.com/bugingcode/p/8386375.html
Copyright © 2011-2022 走看看