法律知识图谱问答

面向法律咨询领域的知识图谱构建

Posted by MeteorMan on December 12, 2019

基于法律咨询领域的问答对构建知识图谱

前沿介绍

​ 当前AI+法律领域愈加火热,其中法律智能咨询就是一个及其火热的应用方向。但据MeteorMan所接触的法律领域如包小黑法小飞小法问答等问答系统,无非Q-Q匹配模式、Q-A匹配模式或者全文检索模式。这三种模式对于速成一套智能问答系统是一个很好的方案,但却有两个明显弊端:调优人工成本高、模型拓展性差。而得益于知识图谱在知识建模以及知识推理的强大功能,将知识图谱应用于法律智能咨询领域成了业界刚需。本文将详细介绍MeteorMan是如何针对现有大规模的问答知识库进行面向法律咨询领域的知识图谱构建工作。

法律问答知识库准备

​ 首先,你手上应有一套法律领域的问答对数据集,内容如下表所示:

question answer
收养的概念 收养是指将他人子女作为本人的子女抚养的行为。
养子女的定义 养子女是指公民合法收养的得不到父母抚养的子女。

上述知识库可从网上爬取相关语料,比如:华律网咨询问题

而本文中MeteorMan将主要以法律中的婚姻家庭领域知识点为处理对象。

知识抽取

​ 如果研究过知识图谱的同学应该都了解,知识图谱构成的三要素:实体、关系、属性,以<subject, relation, object>这种三元组形式存储于图数据库中。

​ 但是对于上述的法律问答知识库我们要怎么表示成这种三元组的形式呢?一种方案是将选取question中的实体作为‘subject’,问题中的对应意图作为‘relation’,将answer整体作为‘object’,但经MeteorMan尝试之后,这样也仅仅是针对问答知识库转换了一种表示而已,并不能生成我们想象中的那种高大上的图谱表示。因此MeteorMan从0开始,针对婚姻家庭领域的问题知识点设计schema、关系模式,将其分成7大实体簇、18种关系逻辑(包括实体具备属性)。

实体簇示例如下表所示:

实体簇类型 实体例子
婚姻实体簇 婚姻、假离婚
家事实体簇 亲属、意定监护
继承实体簇 遗嘱继承、继承法
场景实体簇 可撤销婚姻、包办婚姻
情景实体簇 离婚后、协议离婚时
要素实体簇 一方当事人死亡、婚内赠与
目标实体簇 管辖法院、特别规定

关系逻辑示例如下表所示:

关系类型 问题例子
查处罚 实施家暴的一方是否会被判刑
查定义 收养的概念
查法院认定标准 法院认定父母对子女构成遗弃的标准
查范围 代位继承的范围
查方式 婚内出轨如何挽回
查管辖法院 诉讼离婚的管辖法院
查流程 收养孩子办理户口的流程
查情况 婚姻存续期间能否分割夫妻共同财产
查申请 涉及家庭暴力的离婚案件能否申请法律援助
查时效 诉讼离婚一般需要多长时间
查适用法律 涉外继承适用的法律
查条件 结婚的条件
查影响 先提出离婚对财产分割的影响
查证据 微信聊天记录能否作为出轨的证据
查注意事项 协议离婚的注意事项

实体(仅限婚姻、家事、继承三种类型实体)具备属性示例:

属性 问句例子
场景属性 场景属性为财产分割的问句:夫妻复婚后又离婚,财产分割的起算时间
情景属性 情景属性为离婚时的问句:一方家暴,离婚时财产如何分配
要素属性 要素属性为一方家暴的问句:一方家暴,离婚时财产如何分配

构建图谱

​ 通过以上Schema设计,MeteorMan即可将所用法律问答知识库改造成图谱所需要的形式,如下表的例子所示:

问题 三元组
收养的概念 <收养,查定义,概念>
收养关系的解除方式 <收养关系,查方式,接触方式>

​ 将现有知识库数据重新构建之后,MeteorMan以Neo4j图数据库来存储相关数据,并通过py2neo来将数据写入到数据库中。

在这里列出写入Neo4j的关键代码:

neo4j数据库连接

from py2neo import Graph, Node
graph = Graph(
	    host = '127.0.0.1',
    	http_port = '7474',
    	user = 'neo4j',
    	password = 'neo4j'
	)

建立各实体簇的实体节点

def create_node(label, nodes):
    Note:
    @parameter label:实体簇类型标识
    @parameter nodes:该类型实体簇的所有实体
    for node_name in nodes:
        node = Node(label, name = node_name)
        graph.create(node)
    return

创建实体关联边

def create_relationship(start_node, end_node, edges, rel_type, rel_name):
    Note:
    @parameter start_node:subject所在的实体簇类型
    @parameter end_node:object所在的实体簇类型
    @parameter edges:由subjectobject组成的列表[[sub1, obj1], [sub2, obj2], ...]
    @parameter rel_type:关系类型
    @parameter rel_name:关系名称
    count = 0
    set_edges = []
    for edge in edges:
        set_edges.append('###'.join(edge))
    all_len = len(set(set_edges))
    for edge in set(set_edges):
        edge = edge.split('###')
        p = edge[0] 
        q = edge[1] 
        query = "match(p:%s),(q:%s) where p.name='%s' and q.name='%s' create 				(p)-[rel:%s{name:'%s'}]->(q)"%(start_node, end_node, p, q, 						rel_type, rel_name)
        try:
            graph.run(query)
            count += 1
            print(rel_type, count, all_len)
        except Exception as e:
            print(e)
     return

图谱生成

​ 通过以上封装好的函数即可将自己构造好的数据写入到neo4j图数据库中,MeteorMan写入后的效果如下图所示:

查方式示例图

查方式图谱可视化

查情况示例图

查情况图谱可视化

要素属性示意图

要素属性图谱可视化

结语

​ MeteorMan在本文中探讨了当前面向法律咨询的知识图谱的一种可行的构建方案,仅供参考。但图谱构建出来只是第一步,接下来还需要针对图谱定制问答系统,该步骤将会在后面陆续更新,敬请期待。若有疑问欢迎探讨,本博客的评论系统由Disques提供,若要评论请先开启翻墙服务,并去Disques注册登录,然后刷新该页面即可。