Bootstrap

第一次构建一个对话机器人流程解析(一)

1.问答机器人的组成

1.1 问答机器人的组成结构图

2. 问答机器人的组成-机器人的个人属性

所谓的机器人一般具备有个人的属性,这些属性固定,形成了机器人的个人偏好

在实现过程中,此处使用一个xml配置文件,配置了机器人的个人年龄、性别、职业等内容,同时包含常见有关于机器人属性的问答

服务初始化时,预加载这些属性作为准备;

线上推理时,一般会判断是否是有关于机器人属性的提问,从而进行回答 此处使用模板匹配,进行问题搜索,匹配成功则返回相关的答案

2.1 问答机器人代码实现

import xml.etree.ElementTree as et#python可读取xml工具
template = et.parse('data/robot_template.xml')#加载xml

class template():
    def __init__(self):
        self.template = et.parse(TEMPLATE_PATH)
        self.robot_info = self.load_robot_info()#加载个人属性
        self.temp = self.template.findall('temp')#加载问答样式

    def load_robot_info(self):
        rebot_info = self.template.find('robot_info')
        rebot_info_dict = {}
        for info in rebot_info:
            rebot_info_dict[info.tag] = info.text
        return rebot_info_dict

def search_answer(self, question):
        match_temp = None
        flag = None
        for temp in self.temps:
            qs = temp.find('question').findall('q')
            for q in qs:
                res = re.search(q.text,question)
                if res:
                    match_temp = temp
                    flag = True
                    break
            if flag:
                break
        if flag:
            a_s = choice([i.text for i in match_temp.find('answer').findall('a')])
            answer = a_s.format(**self.robot_info)
            return answer
        else:
            return None

3.  问答机器人的组成-基于语料的回答

机器人的对话学习过程中,一般有一些现成的语料,这些语料来源于日常生活的对话

在此处,基于余弦相似度,对用户的提问和已有语料的提问进行匹配,若匹配成功,则表明用户提问与现有语料中有高度相似的提问,从而返回该提问对应的回答

通过这种余弦相似度的匹配,可以构建一个简易的对话系统,但并不准确,且当语料很庞大时,这样的计算是很可怕的,而且准确率很差

在后续的学习过程中会使用更多的语料,通过深度学习模型来生成或者快速检索合适的答案进行回答

3.1 问答机器人的组成-基于语料的回答(预处理)

s1:文本清洗+切词+生成q,a列表

def load_seq_qa():
    q_list,a_list = [],[]
    with open(CORPUS_PATH,'r',encoding = 'utf-8') as f:
        for ind, i in enumerate(f):
            i = jieba.lcut(i.strip())
            if ind % 2 == 0:
                q_list.append(i)
            else:
                a_list.append(i)
    return q_list,a_list

s2:将所得词index化(为后续生成式问答服务)

def build_vocab():
    q,_ = load_seq_qa()
    word_dict = set([j for i in q for j in i])
    word_dict = dict(zip(word_dict,range(len(word_dict))))
    return word_dict

s3:将所得词embeding化

def build_word_embeding():
    q,_ = load_seq_qa()
    word_dict = build_vocab()
    word_embeding = {}
    for w in word_dict.keys():
        word_embeding[w] = []
    for ind,qs in enumerate(q):
        for w in qs:
            word_embeding[w].append(ind)
    return word_embeding

3.2 问答机器人的组成-基于语料的回答(构建)

;