基线提升至96.45%:2022 司法杯犯罪事实实体识别+数据蒸馏+主动学习

Posted 汀、

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基线提升至96.45%:2022 司法杯犯罪事实实体识别+数据蒸馏+主动学习相关的知识,希望对你有一定的参考价值。

本项目给出本次法研杯详细的技术方案,从UIE-base开始到UIE数据蒸馏以及主动学习的建议,欢迎大家尝试,ps:主动学习标注需要自行实现,参考项目,楼主就不标注了。

项目链接:https://aistudio.baidu.com/aistudio/projectdetail/4911042?contributionType=1

0.法研杯 LAIC2022 司法人工智能挑战赛犯罪事实实体识别

0.1比赛简介

任务介绍

本赛道由中国司法大数据研究院承办。

犯罪事实实体识别是司法NLP应用中的一项核心基础任务,能为多种下游场景所复用,是案件特征提取、类案推荐等众多NLP任务的重要基础工具。本赛题要求选手使用模型抽取出犯罪事实中相关预定义实体。

与传统的实体抽取不同,犯罪事实中的实体具有领域性强、分布不均衡等特性。

官网:http://data.court.gov.cn/pages/laic.html

数据介绍

  • (1) 本赛题数据来源于危险驾驶罪的犯罪事实,分为有标注样本和无标注样本,供选手选择使用;
  • (2) 数据格式:训练集数据每一行表示为一个样本,context表示犯罪事实,entities表示实体对应的标签(label)及其位置信息(span);entities_text表示每个标签label对应的实体内容;
  • (3) 两条标注样本之间以换行符为分割;
  • (4) 训练集:有标注训练样本:200条(分初赛、复赛两次提供,数据集包括验证集,不再单独提供验证集,由选手自己切分);无标注样本10000条;
  • (5) 标注样本示例:
"datasetid": "2552", "id": "813087", "context": "经审理查明,2014年4月12日下午,被告人郑某某酒后驾驶二轮摩托车由永定县凤城镇往仙师乡方向行驶过程中,与郑某甲驾驶的小轿车相碰刮,造成交通事故。经福建南方司法鉴定中心司法鉴定,事发时被告人郑某某血样中检出乙醇,乙醇含量为193.27mg/100ml血。经永定县公安局交通管理大队责任认定,被告人郑某某及被害人郑某甲均负事故的同等责任。案发后,被告人郑某某与被害人郑某甲已达成民事赔偿协议并已履行,被告人郑某某的行为已得到被害人郑某甲的谅解。另查明,被告人郑某某的机动车驾驶证E证已于2014年2月6日到期,且未在合理期限内办理相应续期手续。", "entities": ["label": "11341", "span": ["25;27"], "label": "11339", "span": ["29;34"], "label": "11344", "span": ["54;57", "156;159", "183;186", "215;218"], "label": "11345", "span": ["60;63"], "label": "11342", "span": ["34;47"], "label": "11348", "span": ["164;168"]], "entities_text": "11341": ["酒后"], "11339": ["二轮摩托车"], "11344": ["郑某甲", "郑某甲", "郑某甲", "郑某甲"], "11345": ["小轿车"], "11342": ["由永定县凤城镇往仙师乡方向"], "11348": ["同等责任"]

评价方式:

F 1 = 2 ×  准确率  (  precision  ) ×  召回率  (  recall  )  准确率  (  precision  ) +  召回率  (  recall  ) F_1=\\frac2 \\times \\text 准确率 (\\text precision ) \\times \\text 召回率 (\\text recall )\\text 准确率 (\\text precision )+\\text 召回率 (\\text recall ) F1= 准确率 ( precision )+ 召回率 ( recall )2× 准确率 ( precision )× 召回率 ( recall )

其中:精确率(precision):识别出正确的实体数/识别出的实体数,召回率(recall):识别出正确的实体数 / 样本的实体数

相关要求及提交说明

初赛阶段采用上传预测答案的方式进行测评,复赛需上传模型,请选手严格按照以下说明规范提交:

1. 本赛题不允许通过增加额外有监督样本数量提升模型的预测效果。

2. 只允许产出一个模型,复赛前需要打印模型结构进行验证。主模型不允许多个模型串行或者并行,比如bert+bert;主模型以外允许适当的结构串行,比如bert+crf。模型结构随压缩包提供。

3. 模型存储空间 ≤2.0G。

4. 法研基线模型请前往LAIC2022GitHub网站;请务必按照README中的相关说明组织文件,并制成ZIP压缩包上传。

赛程安排


1. 初赛阶段(2022921-20221209日)

释放初赛数据集,开放初赛排名榜。选手所提交答案的得分超过初赛基线模型分数,自动晋级复赛。

2. 复赛阶段(20221031-20221209日)

释放复赛数据集,开放复赛排名榜;选手于复赛结束前选择三个模型和所选模型对应的源代码等审查材料[]进入封测评审阶段。

3. 封测评审阶段(20221210-1225日)

模型将在封闭数据集上进行测试,获得模型的封测成绩。

4. 技术交流会(202212月下旬)

邀请成绩优异的选手进行模型分享,并和专家观众进行论证和讨论。

5. 发布成绩(202212月底)

公布最终成绩,参赛者的最终成绩为模型的封测成绩和复赛成绩按7:3加权取得的分数的最高分。

注:请提前准备,若未在规定时间内提交,视为放弃。

若选手所提供的源代码无法复现初复赛结果,或被判为成绩无效,最终解释权归中国司法大数据研究院所有。

结果预览:

模型PrecisionRecallF1
Base88.9695.3792.06
Base+全量93.86 (+4.9)99.2 (+3.83)96.45 (+4.39)
UIE Slim98.632 (+9.67)98.736 (+3.37)98.684(+6.62)

0.2 数据集预览:

无标注:

"fullText": "经审理查明,2016年6月4日0时57分许,被告人张伟饮酒后驾驶号跨界高尔夫牌小型轿车由北向南行驶至滨河东路南中环桥向西转匝道路段时,遇张某驾驶的无号牌东风-福龙马牌中型载货专项作业车逆向行驶后准备向南右转时横在滨河东路中间,二车发生相撞,造成同乘人曹某当场死亡、同乘人杨某经医院抢救无效死亡、张伟本人受伤及两车损坏的交通事故。经鉴定,从张伟送检的血样中检出乙醇成分,含量为140.97mg/100ml。从张某送检的血样中未检出乙醇成分,经交警部门依法认定,张伟、张某承担事故的同等责任,杨某、曹某无责任。2016年6月13日,张某所属的太原市高新技术产业开发区环境卫生管理中心向曹某、杨某家属进行了民事赔偿。被害人曹某的家属对被告人张伟的行为表示谅解。", "id": "dfe98005-0491-4015-94ff-a7f50185aa70"

有标注:

"id": "813046", "context": "经审理查明,2016年9月24日19时20分许,被告人陈某某酒后驾驶蒙L80783号比亚迪牌小型轿车由东向西行驶至内蒙古自治区鄂尔多斯市准格尔旗薛家湾镇鑫凯盛小区“金娃娃拉面馆”门前道路处时,与由西向东行驶至此处的驾驶人范某某驾驶的蒙ANB577号丰田牌小型越野客车相撞,造成两车不同程度受损的道路交通事故。被告人陈某某在该起事故中承担同等责任。经某政府1鉴定,被告人陈某某血液酒精含量检验结果为259.598mg/100ml,属醉酒状态。被告人陈某某明知他人报警而在现场等候。2016年9月29日被告人陈某某的妻子冯某某与驾驶人范某某就车损赔偿达成了私了协议书。", "entities": ["label": "11341", "span": ["30;32"], "label": "11339", "span": ["46;50"], "label": "11340", "span": ["50;56"], "label": "11342", "span": ["57;94"], "label": "11346", "span": ["97;106"], "label": "11344", "span": ["110;113", "265;268"], "label": "11345", "span": ["127;133"], "label": "11348", "span": ["168;172"], "label": "11350", "span": ["215;219"]], "entities_text": "11341": ["酒后"], "11339": ["小型轿车"], "11340": ["由东向西行驶"], "11342": ["内蒙古自治区鄂尔多斯市准格尔旗薛家湾镇鑫凯盛小区“金娃娃拉面馆”门前道路处"], "11346": ["由西向东行驶至此处"], "11344": ["范某某", "范某某"], "11345": ["小型越野客车"], "11348": ["同等责任"], "11350": ["醉酒状态"]

实体类型:

    '11339': '被告人交通工具',
    '11340': '被告人行驶情况',
    '11341': '被告人违规情况',
    '11342': '行为地点',
    '11343': '搭载人姓名',
    '11344': '其他事件参与人',
    '11345': '参与人交通工具',
    '11346': '参与人行驶情况',
    '11347': '参与人违规情况',
    '11348': '被告人责任认定',
    '11349': '参与人责任认定',
    '11350': '被告人行为总结',

1.baseline——模型训练预测(UIE model)

UIE模型使用情况参考下面链接,写的很详细了要考虑了工业部署情况方案

参考链接:

UIE Slim满足工业应用场景,解决推理部署耗时问题,提升效能!

PaddleNLP之UIE信息抽取小样本进阶(二)[含doccano详解]

Paddlenlp之UIE模型实战实体抽取任务【打车数据、快递单】

1.1 数据处理

#数据转化
import json

span='11339': '被告人交通工具',
    '11340': '被告人行驶情况',
    '11341': '被告人违规情况',
    '11342': '行为地点',
    '11343': '搭载人姓名',
    '11344': '其他事件参与人',
    '11345': '参与人交通工具',
    '11346': '参与人行驶情况',
    '11347': '参与人违规情况',
    '11348': '被告人责任认定',
    '11349': '参与人责任认定',
    '11350': '被告人行为总结',
    

def convert_record(source):
    target = 
    target["id"] = int(source["id"])
    target["text"] = source["context"]
    target["relations"] = []
    target["entities"] = []
    id = 0
    for item in source["entities"]:
        for i in range(len((item['span']))):
            tmp = 
            tmp['id'] = id        
            id = id + 1
            tmp['start_offset'] = int(item['span'][i].split(';')[0])
            tmp['end_offset'] = int(item['span'][i].split(';')[1])
            tmp['label'] = span[item['label']]
            target["entities"].append(tmp)
    return target


if __name__ == '__main__':
    train_file = 'data/train.json'
    json_data = []
    content_len=[]
    for line in open(train_file, 'r',encoding='utf-8'):
        json_data.append(json.loads(line))
        content_len.append(len(json.loads(line)["context"]))
    ff = open('data/train_new.txt', 'w')
    for item in json_data:
        target = convert_record(item)
        ff.write(json.dumps(target, ensure_ascii=False ) + '\\n')
    ff.close()
    print(content_len)

1.2 模型训练验证

#模型训练
!python finetune.py \\
    --train_path "./data/train.txt" \\
    --dev_path "./data/dev.txt" \\
    --save_dir "./checkpoint_base" \\
    --learning_rate 5e-6  \\
    --batch_size 32 \\
    --max_seq_len 512 \\
    --num_epochs 30 \\
    --model "uie-base" \\
    --seed 1000 \\
    --logging_steps 10 \\
    --valid_steps 100 \\
    --device "gpu"

训练结果预览:

[2022-10-31 10:25:43,181] [    INFO] - global step 510, epoch: 8, loss: 0.00172, speed: 2.33 step/s
[2022-10-31 10:25:45,959] [    INFO] - global step 520, epoch: 8, loss: 0.00171, speed: 3.60 step/s
[2022-10-31 10:25:51,260] [    INFO] - global step 530, epoch: 9, loss: 0.00169, speed: 1.89 step/s
[2022-10-31 10:25:55,512] [    INFO] - global step 540, epoch: 9, loss: 0.00167, speed: 2.35 step/s
[2022-10-31 10:25:59,746] [    INFO] - global step 550, epoch: 9, loss: 0.00166, speed: 2.36 step/s
[2022-10-31 10:26:04,010] [    INFO] - global step 560, epoch: 9, loss: 0.00164, speed: 2.35 step/s
[2022-10-31 10:26:08,215] [    INFO] - global step 570, epoch: 9, loss: 0.00162, speed: 2.38 step/s
[2022-10-31 10:26:12,343] [    INFO] - global step 580, epoch: 9, loss: 0.00160, speed: 2.42 step/s
[2022-10-31 10:26:16,597] [    INFO] - global step 590, epoch: 10, loss: 0.00159, speed: 2.35 step/s
[2022-10-31 10:26:20,881] [    INFO] - global step 600, epoch: 10, loss: 0.00157, speed: 2.33 step/s
[2022-10-31 10:26:26,571] [    INFO] - Evaluation precision: 0.90678, recall: 0.89727, F1: 0.90200
[2022-10-31 10:26:26,571] [    INFO] - best F1 performence has been updated: 0.87898 --> 0.90200
best模型已保存

#模型评估
!python evaluate.py \\
    --model_path ./checkpoint_base/model_best \\
    --test_path ./data/dev.txt \\
    --batch_size 16 \\
    --max_seq_len 512
[2022-10-31 10:31:33,982] [    INFO] - -----------------------------
[2022-10-31 10:31:33,983] [    INFO] - Class Name: all_classes
[2022-10-31 10:31:33,983] [    INFO] - Evaluation Precision: 0.90678 | Recall: 0.89727 | F1: 0.90200
!python evaluate.py \\
    --model_path ./checkpoint_base/model_best \\
    --test_path ./data/dev.txt \\
    --debug
[2022-10-31 10:31:43,857] [    INFO] - -----------------------------
[2022-10-31 10:31:43,857] [    INFO] - Class Name: 被告人交通工具
[2022-10-31 10:31:43,857] [    INFO] - Evaluation Precision: 0.97500 | Recall: 0.95122 | F1: 0.96296
[2022-10-31 10:31:44,297] [    INFO] - -----------------------------
[2022-10-31 10:31:44,297] [    INFO] - Class Name: 行为地点
[2022-10-31 10:31:44,297] [    INFO] - Evaluation Precision: 1.00000 | Recall: 0.94872 | F1: 0.97368
[2022-10-31 10:31:44,780] [    INFO] - -----------------------------
[2022-10-31 10:31:44,781] [    INFO] - Class Name: 其他事件参与人
[2022-10-31 10:31:44,781] [    INFO] - Evaluation Precision: 0.90604 | Recall: 0.95745 | F1: 0.93103
[2022-10-31 10:31:44,898] [    INFO] - -----------------------------
[2022-10-31 10:31:44,898] [    INFO] - Class Name: 被告人行为总结
[2022-10-31 10:31:44,898] [    INFO] - Evaluation Precision: 1.00000 | Recall: 0.70000 | F1: 0.82353
[2022-10-31 10:31:45,324] [    INFO] - -----------------------------
[2022-10-31 10:31:45,324] [    INFO] - Class Name: 被告人责任认定
[2022-10-31 10:31:45,325] [    INFO] - Evaluation Precision: 0.89474 | Recall: 0.91892 | F1: 0.90667
[2022-10-31 10:31:45,775] [    INFO] - -----------------------------
[2022-10-31 10:31:45,775] [    INFO] - Class Name: 被告人违规情况
[2022-10-31 10:31:45,776] [    INFO] - Evaluation Precision: 0.90909 | Recall: 0.87719 | F1: 0.89286
[2022-10-31 10:31:46,124] [    INFO] - ---------------以上是关于基线提升至96.45%:2022 司法杯犯罪事实实体识别+数据蒸馏+主动学习的主要内容,如果未能解决你的问题,请参考以下文章

论文阅读2021中国法研杯司法考试数据集研究(CAIL2021)

论文阅读2021中国法研杯司法考试数据集研究(CAIL2021)

网络罪犯如何利用区块链技术

[蓝桥杯2022初赛] 质因数个数

司法实践中非法获取比特币行为的裁判路径

ICDE 2022稀疏模型训练框架HybridBackend,单位成本下训练吞吐提升至5倍