知识图谱系列(三):基于医疗知识图谱实现简单的对话系统

之前我们已经构建了一个简单的医疗知识图谱,这次就来看看怎么利用这个知识图谱建一个简单的对话系统,构筑的流程还是参考之前的项目,以后我们再结合深度学习进行改进。

在这里插入图片描述
上图就反映了这个对话系统的分析思路,整体上接近一个基于规则的对话系统,首先我们需要对用户输入进行分类,其实就是分析用户输入涉及到的实体及问题类型,也就是Neo4j中的node、property、relationship,然后我们利用分析出的信息,转化成Neo4j的查询语句,最后再把查询的结果返回给用户,就完成了一次问答。

整体上涉及到三个模块,问题的分类、问题的解析以及回答的搜索,接下来我们一个个来看具体的实现。

对于问题的分类,就像之前说的有两个方面,一个是分析出问句中涉及到的node,另一个是分析出property或relationship,对于node,大致上就是采用Aho-Corasick算法,分析出问句中的每一个词是否出现在知识图谱中的node集合中,比如"胸痛怎么办"这句话中,胸痛就出现在了知识图谱的node集合中,所以就可以认为这句话涉及到的实体是"胸痛"。

对于property和relationship,分析的思路更简单,首先预设定一系列的问句疑问词,从而对问句的每个词进行对比分析,判断出问句的类型
知识图谱系列(三):基于医疗知识图谱实现简单的对话系统_第1张图片
然后,根据问句的类型和之前识别出来的实体,基于规则推断出property和relationship:

知识图谱系列(三):基于医疗知识图谱实现简单的对话系统_第2张图片
把问题转化为Neo4j的Cypher语句,其实也是预先写好Cypher语句的模板,根据实际的情况把之前分析得到的node、property、relationship填入Cypher语句中进行查询。

知识图谱系列(三):基于医疗知识图谱实现简单的对话系统_第3张图片
得到了Cypher语句,我们就能连接Neo4j数据库进行查询,得到结果之后,还需要对语句进行一点微调,这个过程也是加上预设定的语句:

知识图谱系列(三):基于医疗知识图谱实现简单的对话系统_第4张图片
以上就是这个基于知识图谱实现的对话系统的基本分析流程,可以看到整个系统基于大量的规则,根据不同的情况构造不同的回答,要想效果好,主要还是需要规则设计得好,比如问句疑问词的设计就要尽可能覆盖面广一点,使得不论用户以什么样的方式提问,在知识图谱有答案的情况下都能输出相应的回答。

这样的对话系统优点很明显,那就是不需要花时间训练,运行的速度很快,缺点也很明显,那就是不能有效分析任意的输入,输出也只能是预设定好的输出,灵活度太小,要想更进一步,终究要结合深度学习的模型进行分析,所以接下来我会继续研究怎么把深度学习应用到知识问答系统中。

KnowledgeGraphBeginner这个项目目的是从零开始实现基于知识图谱的对话系统,会随着这个系列的文章不断更新。

你可能感兴趣的:(知识图谱,对话系统,自然语言处理)