本文是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→预测刑期
- Document Encoder:对事实/法条/罪名描述文本进行表征。GRU或BERT,代码里只给出了GRU版本的实现
- GRU:用预训练word2vec来作为词表征初始化
- BERT
- GRU:用预训练word2vec来作为词表征初始化
- Fact Separation:先选ADC,然后再选出由SSC和DSC构成的SEC
- Circumstances of Crime aware Fact Separation (CCFS)
- ADC与罪名定义相似,SSC与法条相似
- 用罪名分隔ADC和SEC
- 在事实描述文本得到的词表征
H
d
\mathbf{H}^d
Hd上per-dimension mean-pooling
- 用MLP在此表征上预测罪名
- 用事实描述文本得到的词表征和罪名表征分隔事实描述文本,此处参考资料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那边邻居标签本来就属于同一表征空间,所以不需要投影环节
- 在事实描述文本得到的词表征
H
d
\mathbf{H}^d
Hd上per-dimension mean-pooling
- 用ADC经MLP预测法条
- 类似罪名,得到
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
- 用SSC和DSC(concat起来)预测刑期:
- 加权交叉熵损失函数:
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)
- Graph Decomposition Operation (GDO)
- Label-to-Fact (L2F) attention(大概意思就是用GRU得到的罪名表征和special charge features代码里没写这是个啥,在代码里写的就是经GDO之后的罪名表征分别对事实描述做个attention,得到2个attention)
concat 2个attention后得到charge label aware fact representation,和对应的法条表征
- 将这两个向量结合到NeurJudge上,做预测:
3. 实验
3.1 数据集
数据分析
3.2 主实验结果
3.3 Ablation Study
3.4 案例分析
4. 代码复现
我直接在我使用LADAN预处理后的数据上进行了复现。数据预处理的过程以后在LADAN那边笔记上补充。
原项目中使用的原始数据文件格式应该是类似原始数据的。就他文章里提及的处理方式好像在代码里都没有体现出来,不知道怎么处理的。
代码里没有给作者的word2vec模型和CAIL-big数据集上的图,可以跟作者要。
我的主要修改内容是代码顺序、数据加载和word2vec模型加载代码(这个作者代码里没给,如果实在不会写的话可以跟作者要),整体还是跟原代码相似的
代码里是直接给出了NeurJudge+的代码,如果要剖离图部分做NeurJudge也可以,但是这个我就不管了。
model.py:包含NeurJudge模型(别的代码文件巴拉巴拉的感觉挺容易看懂的,可以看我别的博客来增长知识。以后我有时间再补到这里吧)
- 词向量嵌入
- 用
self.encoder_charge
(GRU)对法条和罪名文本进行表征(法条文本就是原文,罪名文本则是罪名“定义”4),取输出在所有词上的平均值池化作为每个样本的最终表征 self.graph_decomposition_operation()
方法分别对罪名和法条进行2层GDO操作,得到新的表征
就是遍历2次,每次遍历所有标签,对每个标签的所有邻居进行遍历, O ( N 3 ) O(N^3) O(N3)以上了应该有,但是图挺小的所以还能行。计算标签与每个邻居之间的g
向量之间先元素相乘(*
),然后再求和(torch.sum(x,-1)
),就是点积。
被除数加上了1e-10
,应该是为了防止出现全0的情况(向量元素是负数咋办小编也不知道)。self.encoder()
(GRU)对案例文本进行表征- 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 - 得到预测罪名,用
fact_separation()
:Vector Rejection
对预测的罪名进行词向量嵌入,用以和案例文本表征实现Mask_Attention
(一样,线性转换部分神秘消失……)
在代码里相比公式主要就是考虑了mask的问题,叠了2层mask(一个在softmax之前,一个在×V之前)
然后计算g
,和GDO那部分的写法差不多
返回ADC和SEC表征 - L2F attention法条版
- 将案例文本表征、L2F attention法条得到的表征、ADC表征concat起来,过GRU,池化,过MLP,预测法条
- 然后用法条对SEC表征也来一个
fact_separation()
,略,得到SSC和DSC - 将案例文本表征、SSC和DSC concat起来,过GRU,池化,过MLP,预测刑期
5. 其他参考资料
Sentence Similarity Learning by Lexical Decomposition and Composition ↩︎ ↩︎
可参考我之前撰写的博文:Re27:读论文 LADAN Distinguish Confusing Law Articles for Legal Judgment Prediction ↩︎
LADAN代码里给出的相似度阈值是TFIDF表征的余弦相似度大于0.3,NeurJudge里没给,作者说是word2vec表征的余弦相似度0.5。我自己用的是word2vec表征的平均值池化的余弦相似度,法条的阈值是0.95,罪名的阈值是0.85 ↩︎
NeurJudge原项目中给出了罪名的定义、主体、主观方面、客体、客观方面的信息https://github.com/yuelinan/NeurJudge/blob/main/neurjudge/data/charge_details.json
代码中只给了文本表征时使用定义的代码,所以我自己写做图的代码时也只用了定义。 ↩︎