1.问答机器人的组成
1.1 问答机器人的组成结构图
2. 问答机器人的组成-机器人的个人属性
所谓的机器人一般具备有个人的属性,这些属性固定,形成了机器人的个人偏好
在实现过程中,此处使用一个xml配置文件,配置了机器人的个人年龄、性别、职业等内容,同时包含常见有关于机器人属性的问答
服务初始化时,预加载这些属性作为准备;
线上推理时,一般会判断是否是有关于机器人属性的提问,从而进行回答 此处使用模板匹配,进行问题搜索,匹配成功则返回相关的答案
2.1 问答机器人代码实现
import xml.etree.ElementTree as et#python可读取xml工具
template = et.parse('data/robot_template.xml')#加载xmlclass 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.textreturn rebot_info_dictdef search_answer(self, question):match_temp = Noneflag = Nonefor temp in self.temps:qs = temp.find('question').findall('q')for q in qs:res = re.search(q.text,question)if res:match_temp = tempflag = Truebreakif flag:breakif flag:a_s = choice([i.text for i in match_temp.find('answer').findall('a')])answer = a_s.format(**self.robot_info)return answerelse: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