本项目是针对法条进行分类,数据来源是人工智能司法杯2018年的数据
http://cail.cipsc.org.cn:2018/
处理后的数据下载地址:https://webmail.alibaba-inc.com/alimail/openLinks/downloadMimeMetaDiskBigAttach?id=netdiskid%3Av001%3Afile%3ADzzzzzzNqZv%3Bwdz6AdzMl3nP2FDPctsSZS6L9xNA7nCG6ZMEvfm2C9VVNDTn%2F9EhmSwdsFLDK%2Fd%2FZm3kcn5KaOl%2FpAgtMb3HHjw%2B1N1pp4hwjwwhc1WpBMgi8MI23BF5pXl9UVzmPXslSF34nkWy7Vo%3D
- dataanlysis.ipynb分析了数据的分布,并解释了【max_seq_len】参数的设置
- 对label的特殊处理,将one-hot标签改成了单标签,即[0,0,0,1,0,....] = [3]
- text的预处理:
1)去停用词,包括符号、数字、非中文
2)数据中有很多时间对法条的分类无意义,所以做了删除,包括地点、人名也是的,可以做进一步的过滤
3)因为文本长度分布不均,针对小于max_seq_len的进行padding,大于max_seq_len的文本则选中从前面截断,保留尾部信息
4) 总共有202个标签,但是实际数据中只有197类有数据,并且分布不均,针对label较少的数据可以做一个数据增强【随机删除词语并拷贝】,减少样本的不均衡
-
python generate_word_embeddings.py 生成字典和词向量
前提:将配置文件(parameters.json)中的设置为true
说明:
1)字典的构建是融合了训练集和测试集的text,为了减少测试集中未登录词的出现
2)字典中有很多词在案例中出现的频率过低,并且无意义,所以过滤了【在案例中出现的次数】低于5的词语,将原本22万的词典缩小至6.6w
3) 过滤高频出现的5个词 -
python train.py
其中配置文件'parameters.json’配置模型相关参数含义如下:
"num_epochs": 训练epoch个数,
"batch_size": 数据批大小,
"num_filters": 卷积核个数,
"filter_sizes": CNN 卷积核kernel size,
"embedding_dim": 词向量维度,
"dropout_keep_prob": 0.5
"num_classes": 类别个数,
"max_seq_len": 最大句子长度,
“loadTokened“:是否加载已经分词索引化的数据,如果是第一次执行,设置为False
"use_embeddings":是否使用预训练的词向量,下载来源:https://ai.tencent.com/ailab/nlp/en/embedding.html -
训练结果:
因为该任务文本属于较长文本,考虑到序列模型的梯度消失问题,选择了CNN网络结构
1)对比了fastText和TextCNN, 训练结果分别为【40%】和【84%】
2)以TextCNN为主干网络,加载预训练的词向量,训练结果为【84.5%】,和不加embedding的效果差不多
3)进一步的优化想法是:
A. 从网络结构入手,可以考虑加上attention
B. 从embedding入手,针对法条分类的场景,可以在pretrain的语言模型基础上用BETR再fine-tune垂直领域的语言模型
1)label需要进行np.argmax()处理
2)python predict.py