Re38:读论文 NeurJudge: A Circumstance-aware Neural Framework for Legal Judgment Prediction

诸神缄默不语-个人CSDN博文目录

本文是2021年SIGIR论文,官方下载地址:https://dl.acm.org/doi/10.1145/3404835.3462826
官方GitHub地址:yuelinan/NeurJudge: The code of “NeurJudge: A Circumstance-aware Neural Framework for Legal Judgment Prediction”(SIGIR2021))

本文也关注LJP任务。
本文关注事实描述文本中的circumstances of crime(事实描述文本中的不同部分),提出circumstance-aware legal judgment prediction framework (i.e., NeurJudge)模型。
用中间子任务的结果来将事实描述文本划分为不同circumstances,用以预测其他子任务。(罪名→法条→刑期)
解决易混淆的法条和罪名问题:将NeurJudge扩展为NeurJudge+:用标签嵌入,将标签(法条和罪名)的语义信息融入到事实描述文本中。(这个做法明显是参考LADAN的)

circumstance情节
事实描述文本可以分为ADC(定罪情节)和SEC(量刑情节)
SEC可以分为SSC(法定量刑情节)和DSC(酌定量刑情节)
在论文中对相应内容的具体介绍可以参考本博文第一节的内容

1. Circumstances和子任务顺序

在这里插入图片描述
ADC→verdicts(罪名和法条)
SEC(SSC+DSC)→刑期

在这里插入图片描述

2. NeurJudge

2.1 问题定义

在这里插入图片描述

2.2 模型

在这里插入图片描述

2.3 NeurJudge

用罪名分割事实描述文本为ADC和SEC
用ADC预测法条
用法条从SEC中识别出SSC和DSC,用以预测刑期

用全部文本预测罪名→预测ADC和SEC→用ADC预测法条→预测SSC和DSC→预测刑期

  1. Document Encoder:对事实/法条/罪名描述文本进行表征。GRU或BERT,代码里只给出了GRU版本的实现
    1. GRU:用预训练word2vec来作为词表征初始化
      在这里插入图片描述
    2. BERT
  2. Fact Separation:先选ADC,然后再选出由SSC和DSC构成的SEC
    1. Circumstances of Crime aware Fact Separation (CCFS)
    2. ADC与罪名定义相似,SSC与法条相似
    3. 用罪名分隔ADC和SEC
      1. 在事实描述文本得到的词表征 H d \mathbf{H}^d Hd上per-dimension mean-pooling
        在这里插入图片描述
      2. 用MLP在此表征上预测罪名
        在这里插入图片描述
        在这里插入图片描述
      3. 用事实描述文本得到的词表征和罪名表征分隔事实描述文本,此处参考资料1我还没看,方法叫是Vector Rejection
        用Document Encoder得到 H c ^ \mathbf{H}^{\hat{c}} Hc^ H d \mathbf{H}^d Hd
        计算二者词之间的relevance(用点积计算得到相似度)
        在这里插入图片描述
        对整个事实描述文本softmax是一种软化版的max,用来从罪名表征中抽取与事实描述文本最相关的词(软化版))
        在这里插入图片描述(上述两步在代码里都是作为attention操作)
        用事实描述在这个attention上做vector rejection,计算相似和不相似的部分(ADC/SEC)(ADC就是直接投影过去。SEC就是减掉投影,根据三角形法则,这个就是跟对面垂直的部分了)
        在这里插入图片描述
        KaTeX parse error: Unexpected end of input in a macro argument, expected '}' at position 5: \hat\̲m̲a̲t̲h̲b̲f̲{H}^{d^+}平均值池化,得到最终的ADC向量 f + \mathbf{f}^+ f+
        很直觉地容易想到,既然要算的是事实和标签之间的相关/不相关关系,为什么不直接用事实表征对标签表征做vector rejection呢,感觉是为了把标签表征投影到事实表征的空间,所以加了一环attention,抽取事实表征中与标签表征相关性更强的内容,作为投影环节?虽说我认为真实原因其实是之前的论文1就是这么干的所以就继续这么干。GDO中有类似的vector projection操作,但是显然GDO那边邻居标签本来就属于同一表征空间,所以不需要投影环节
    4. 用ADC经MLP预测法条在这里插入图片描述
    5. 类似罪名,得到 H a ^ \mathbf{H}^{\hat{a}} Ha^,用以将SEC向量KaTeX parse error: Unexpected end of input in a macro argument, expected '}' at position 5: \hat\̲m̲a̲t̲h̲b̲f̲{H}^{d^-}分割为SSC向量和DSC向量,分别做平均值池化得到SSC和DSC
      在这里插入图片描述
  3. 用SSC和DSC(concat起来)预测刑期:在这里插入图片描述
  4. 加权交叉熵损失函数:在这里插入图片描述
    Honestly其实就是把3个损失函数1:1:1加起来

2.4 NeurJudge+

增加了罪名和法条的标签相似图,用以实现GDO操作(类似LADAN2,但是LADAN的相似component是用权重矩阵训练出来的,NeurJudge的相似component是vector projection)

Graph Construct Layer
认为HMN的树形结构对不同父标签下的子标签的关系有所忽略,因此将树扩建为图(charge/article similarly graph3
在这里插入图片描述

通过Document Encoder→平均值池化得到标签特征向量

Graph-based Label Embedding (GLE)

  1. Graph Decomposition Operation (GDO)
    在这里插入图片描述
  2. Label-to-Fact (L2F) attention(大概意思就是用GRU得到的罪名表征和special charge features代码里没写这是个啥,在代码里写的就是经GDO之后的罪名表征分别对事实描述做个attention,得到2个attention)
    concat 2个attention后得到charge label aware fact representation,和对应的法条表征
    在这里插入图片描述
  3. 将这两个向量结合到NeurJudge上,做预测:
    在这里插入图片描述

3. 实验

3.1 数据集

在这里插入图片描述

数据分析
在这里插入图片描述

3.2 主实验结果

在这里插入图片描述

3.3 Ablation Study

在这里插入图片描述

在这里插入图片描述

3.4 案例分析

在这里插入图片描述
在这里插入图片描述

4. 代码复现

我直接在我使用LADAN预处理后的数据上进行了复现。数据预处理的过程以后在LADAN那边笔记上补充。
原项目中使用的原始数据文件格式应该是类似原始数据的。就他文章里提及的处理方式好像在代码里都没有体现出来,不知道怎么处理的。
代码里没有给作者的word2vec模型和CAIL-big数据集上的图,可以跟作者要。
我的主要修改内容是代码顺序、数据加载和word2vec模型加载代码(这个作者代码里没给,如果实在不会写的话可以跟作者要),整体还是跟原代码相似的

代码里是直接给出了NeurJudge+的代码,如果要剖离图部分做NeurJudge也可以,但是这个我就不管了。

model.py:包含NeurJudge模型(别的代码文件巴拉巴拉的感觉挺容易看懂的,可以看我别的博客来增长知识。以后我有时间再补到这里吧)

  1. 词向量嵌入
  2. self.encoder_charge(GRU)对法条和罪名文本进行表征(法条文本就是原文,罪名文本则是罪名“定义”4),取输出在所有词上的平均值池化作为每个样本的最终表征
  3. self.graph_decomposition_operation()方法分别对罪名和法条进行2层GDO操作,得到新的表征
    在这里插入图片描述
    就是遍历2次,每次遍历所有标签,对每个标签的所有邻居进行遍历, O ( N 3 ) O(N^3) O(N3)以上了应该有,但是图挺小的所以还能行。计算标签与每个邻居之间的g
    向量之间先元素相乘(*),然后再求和(torch.sum(x,-1)),就是点积。
    被除数加上了1e-10,应该是为了防止出现全0的情况(向量元素是负数咋办小编也不知道)。
  4. self.encoder()(GRU)对案例文本进行表征
  5. L2F attention:罪名版
    在这里插入图片描述
    把法条表征(通过GRU和通过GDO的2种表征分别做一个)广播到每个案例batch一个new_charge_repeat = new_charge.unsqueeze(0).repeat(d_hidden.size(0),1,1),然后用Code_Wise_Attention对案例文本表征实现attention机制,分别得到两个表征
    (我还有个问题就是 W α W_\alpha Wα怎么不见了)
    把两个concat起来,用MLP预测罪名logits
  6. 得到预测罪名,用fact_separation():Vector Rejection
    对预测的罪名进行词向量嵌入,用以和案例文本表征实现Mask_Attention
    (一样,线性转换部分神秘消失……)
    在这里插入图片描述
    在代码里相比公式主要就是考虑了mask的问题,叠了2层mask(一个在softmax之前,一个在×V之前)
    然后计算g,和GDO那部分的写法差不多
    返回ADC和SEC表征
  7. L2F attention法条版
  8. 将案例文本表征、L2F attention法条得到的表征、ADC表征concat起来,过GRU,池化,过MLP,预测法条
  9. 然后用法条对SEC表征也来一个fact_separation(),略,得到SSC和DSC
  10. 将案例文本表征、SSC和DSC concat起来,过GRU,池化,过MLP,预测刑期

  1. Sentence Similarity Learning by Lexical Decomposition and Composition ↩︎ ↩︎

  2. 可参考我之前撰写的博文:Re27:读论文 LADAN Distinguish Confusing Law Articles for Legal Judgment Prediction ↩︎

  3. LADAN代码里给出的相似度阈值是TFIDF表征的余弦相似度大于0.3,NeurJudge里没给,作者说是word2vec表征的余弦相似度0.5。我自己用的是word2vec表征的平均值池化的余弦相似度,法条的阈值是0.95,罪名的阈值是0.85 ↩︎

  4. NeurJudge原项目中给出了罪名的定义、主体、主观方面、客体、客观方面的信息https://github.com/yuelinan/NeurJudge/blob/main/neurjudge/data/charge_details.json
    在这里插入图片描述
    代码中只给了文本表征时使用定义的代码,所以我自己写做图的代码时也只用了定义。 ↩︎

猜你喜欢

转载自blog.csdn.net/PolarisRisingWar/article/details/128243315