论文名称:Distinguish Confusing Law Articles for Legal Judgment Prediction
论文ACL官方下载地址:https://aclanthology.org/2020.acl-main.280/(这个网站上的视频不知道为啥打不开,我在papertalk上找到了讲解视频:https://papertalk.org/papertalks/6897)
ArXiv下载地址:https://arxiv.org/abs/2004.02557
官方GitHub项目:prometheusXN/LADAN: The source code of article “Distinguish Confusing Law Articles for Legal Judgment Prediction”, ACL 2020
这篇论文是2020年ACL论文,做的是CAIL数据集上的LJP任务,主要关注区分易混淆法条的问题。
本文提出的端到端模型LADAN (Law Article Distillation based Attention Network) 用相似法条的区别来attentively提取案例事实描述文本中的特征,解决了这一问题。
用法条及其之间的TFIDF相似性构建图,将易混淆法条聚类到社区中,用GNN模型(不是直接聚合,而是搞了个GDO (graph distillation operator) 算子)来学习整个社区的特征和社区法条之间的细微差异。每个案例学习宏观和微观两个特征,宏观特征用于预测社区(事实描述和法条间的相似性),微观特征是通过被选中社区的注意力向量attentively抽取出来的,用于区分社区内的法条。
文章目录
1. Background & Motivation
LJP任务图示:
LJP任务中,由于相似法条对应的案例很容易被误判,所以易混淆罪名很常见。
易混淆罪名示例:
以前解决这一问题的方法往往依赖领域知识(如Few-shot1定义discriminative attributes以作区分),这使其对不同法系的泛化能力变弱。
本文希望能提出自动抽取法条文本特征的模型来辅助LJP任务,如FLA2用对法条的注意力机制从事实描述中抽取特征。如下图a所示,其缺点在于独立学习每个法条的注意力向量,这样语义上相似的法条可能就会学到相似的注意力向量,这对易混淆罪名的预测很低效。
如果想要解决相似案例的问题,直觉想法是删除法条之间的重复内容,仅使用剩余的不同内容,来做注意力机制。但这样就会导致不相似法条出现相似的剩余内容,如上图所示。(除此以外还有个问题,就是这个过程不可微分,因此无法直接插入端到端神经网络)
信息传播GNN会出现过平滑问题,使节点表征靠近,这与我们所期待的区分相似GNN的目标正好相悖,因此本文提出distillation operation,蒸馏而非聚合,来抽取相似法条之间的可区分特征。
2. LADAN模型
案例事实描述文本表示为两部分:基础表征
v
f
b
\mathbf{v}^b_f
vfb(匹配法条社区,直接表征得到),可区分表征
v
f
d
\mathbf{v}^d_f
vfd(区分同社区法条,通过fact re-encoder module得到)。
两个表征concat起来后传入下游LJP任务(这一步可以用MTL,或者别的LJP模型,如TOPJUDFE/MPBFN等)。
获得基础表征:使用一种流行文本表征模型(如CNN或Bi-RNN)
获得可区分表征:用law distillation module将法条划分到社区中,然后抽取每个社区的distinction vector/distinguishable features
β
i
\beta_i
βi(先用GDO算出每个法条的表征,然后池化出每个社区的表征)。通过案例的基础表征预测出该案例所属的社区,用该社区的distinguishable feature(上图中的
β
c
^
\beta_{\hat{c}}
βc^)来attentively抽取案例的可区分表征(用fact re-encode module)。
2.1 law distillation module
- graph construction layer (GCL):划分法条到社区中
先构建法条的全连接图,边权是TF-IDF向量的余弦相似度→根据阈值 τ \tau τ移边
得到一个由disconnected subgraphs组成的图,每个subgraph是一个由易混淆法条构成的社区 - 在每个社区中,用graph distillation layer学习其distinction vector。
参考graph convolution operator (GCO),本文提出graph distillation operator (GDO),移除节点相似特征以学习distinction vector。
对法条 L i L_i Li,GDO用一个可训练权重矩阵 Ψ \Psi Ψ捕获其与图中邻居之间的相似信息,用矩阵 Φ \Phi Φ抽取其有效语义特征。每一层聚合 L i L_i Li及其邻居相似信息、然后从表征中删掉:
一个社区的distinction vector:
(MaP是max pooling,MiP是min pooling)
2.2 fact re-encoder module
- 预测案例属于哪个社区:
- 用对应社区的distinction vector
β
c
^
\beta_{\hat{c}}
βc^ 来attentively抽取案例的distinguishable features
参考HAN3,基于词-句两个级别的Bi-GRUs来attentively抽取distinguishable features
词级别:
句子级别:
2.3 预测和训练
得到了concat后的事实描述表征:
损失函数-多任务:
损失函数-预测法条属于的社区:
3. 实验
3.1 数据集
CAIL
预处理工作:
- 删除多法条和多罪名场景
- 仅保留超过100个案例样本的法条和罪名(在训练集和验证集中计算得到)
- 删除二审样本(在论文中没提,但在代码中有,后续直接使用LADAN预处理数据的论文会提及)
- 将刑期改为分类标签
3.2 baseline
细节略。
3.3 实验设置
细节略。
3.4 主实验结果
细节略。
3.5 实验分析
3.5.1 消融实验
3.5.2 案例分析
LADAN encoder的注意力可视化:
4. 代码复现
4.1 官方TensorFlow实现
环境配置可以参考官方GitHub项目中的issue:file not found · Issue #4 · prometheusXN/LADAN:
安装可以参考我之前写的博文:TensorFlow安装教程
操作步骤:
- 下载各种需要的数据(LADAN官方GitHub项目链接里都给了),law_processed文件夹放到training_code文件夹下面,别的几个文件在代码里直接改路径就行
- 首先预处理CAIL数据:tongji_3.py→make_Legal_basis_data.py(这两个好像都是直接用于small数据的,但是改成big好像差不太多)
- 然后运行训练代码(后面几篇后续研究中,LADAN的baseline用的是LADAN+MTL,所以我跑的是LADAN+MTL_small.py),运行命令是
python LADAN+MTL_small.py --gpu 0 --data_folder /data/cail_ladan/legal_basis_data_small
。我现在能正常运行small数据集上的代码,但是改成big数据集后就跑不了了,我也不知道为啥,TF1是我所不了解的领域。准备以后再看怎么解决这个问题吧
4.2 PyTorch复现
我需要写LJP主流方法用PyTorch实现的包,先把坑放在这里,以后写。