赞
踩
一个完整的信息抽取系统分为三部分:实体识别、关系链接、关系分类
第一步做我的实体识别数据集。
这里其实开源的NER数据集和模型都很多了。
走了很多弯路,其实直接做NER任务就行,不过也学习了很多东西
1)labelimg 手工标注工具,标注后的anno文件是xml,里面包含的字段:
filename
size
每个Object的 label和bbox
2)将labelimg的xml文件转换成coco数据格式,coco数据格式包含的字段:
filename
type
anno 里面包括该img的所有的Object
每个Object字段包括:
area 区域面积、
iscrowd
bbox coco标注中的bbox信息给的是(x,y,w,h)
category_id 所属类别id
id 因为有多个对象,对象编号
segmentation 对象的边界点,每个点的xy坐标
category 类别对应的编号
3)根据转换后的coco格式的anno和图片,提取每个图像中object对应的文本,填入anno的text字段
这样太费劲了,纯手工就是不行
1)paddleocr识别图片中文字
ocr的识别结果是text、bbox、score,
我们需要对text和bbox进行标签分类
- 2)自动标注
- 1)ocr对所有的img识别文字,得到text、bbox
- 2)把ocr的输出写入到txt里面(指定格式写入,每一行一个字和一个默认tagO,用空格隔开,每个句子间用换行隔开)
- 3)用标注好的数据训练CRF++模型
- 4)用训练好的模型自动标注数据
用CRF++训练模型:CRF训练参考https://www.jianshu.com/p/12f2cdd86679
训练:
在chinses文件夹打开cmd ,训练模型: crf_learn template confusion_crf.data model >> train_info 训练信息保存在train_info_file中
参数调整:
-a CRF-L2 or CRF-L1 规范化算法选择。默认是CRF-L2。一般来说L2算法效果要比L1算法稍微好一点
-c float 设置CRF的超参。c越大,CRF拟合训练数据的程度越高,可以通过交叉验证等方法寻找较优的参数
-f NUM 设置特征的cut-off threshold,训练数据中至少NUM次出现的特征
-p NUM NUM是线程数量,如果电脑有多个CPU,那么那么可以通过多线程提升训练速度
用训练好的model预测标签:crf_test -m model predict.data >> output.txt 有两个参数-v和-n都是显示一些信息的,-v可以显示预测标签的概率值,-n可以显示不同可能序列的概率值,对于准确率,召回率,运行效率,没有影响
iter:迭代次数。当迭代次数达到maxiter时,迭代终止
terr:标记错误率
serr:句子错误率
obj:当前对象的值。当这个值收敛到一个确定值的时候,训练完成
diff:与上一个对象值之间的相对差。当此值低于eta时,训练完成
模板构建:
Unigram模板是比较常用的模板,这类模板提取的信息较为全面,组成的模板数量也比较多;
Bigram模板比较简单,一般是当前词和前面一个词的自动组合生成的Bigram特征集合;
都会有:
状态特征函数 sl(yi,x,i) 和转移特征函数 tk(yi-1,yi,x,i) 。其中 yi是标签, x是观测序列, i是当前节点位置。每个函数还有一个权值
%x[row,col],即是特征函数的参数 x
每一行模板生成一组状态特征函数,数量是L*N 个,L是标签状态数。N是此行模板在训练集上展开后的唯一样本数
so sad,每个公开的语料,包含的字段都没有覆盖我的数据,所以在单独使用某一个公开数据训练完模型后,再去标注我的数据,效果不好
解决办法:
搜集各个语料,尽量组装到字段涵盖我需要的
NLP中的NER数据集集锦https://blog.csdn.net/qq_33331424/article/details/109184802
人民网数据有DATE、PERSON、ORG字段
CLUENER2020数据集中的 address、book、company、name、这写我们可以用,抽取该数据集的一部分
BosonNLP NER有company_name、location、org_name、person_name、time
我抽取了CLUENER2020和BosonNLP
遗留问题:
对于预测结果:真实为真的都预测为真,但真实为假的预测为真,模型预测的FP特别多,
可能原因:O标签太少,训练数据分布不均衡:nlp序列标注任务如何处理类别极度不平衡问题? - 知乎 https://www.zhihu.com/question/340333687
金额字段、合同名称字段、税率字段这些还未丰富到数据集中。
对上次的数据集中的company、name、time、address、bank做了进一步的清洗、添加了差不多比例的O、增加了金额字段、
- address:<234个实体
- bank:<184个实体
- company:<238个实体
- name:<199个实体
- time:<253个实体
- O:比例增大
- money:<300个实体
- tel: <250个实体
- cname: <47个实体
- tax:<100个实体
经过上一步的训练数据清洗,再次用CRF++预测序列标签,模型过拟合的现象有改善,但FP仍旧有,我又适当的降低了company和类别,发现问题还在
因为我用BERT的中文模型的预训练做embed嘛,然后拿去LSTM-CRF中,不同的batch 某些字段准确率和召回率甚至为0! 我发现我的数据集类别还是非常不均衡
解决:我把我的数据集中的字段穿插到一个比较均衡的数据集中,再做训练
原数据集中有:'O', 'I-ORG', 'I-LOC', 'B-LOC', 'I-PER', 'B-ORG', 'B-PER', '[CLS]', '[SEP]'
ORG包含了company,所以我们只需要字词基础上修改一部分ORG为company实体即可,
LOC包含了address,所以我们只需要字词基础上修改一部分LOC为address实体即可,
PER==name,不需要添加
我需要添加time、money、tel、bank、cname、tax
因为我用的是IOBES标注,所以需要把整体的IOB标注转成IOBES标注
然后我同样拿了ocr识别出的文字做了预测,并对预测结果做了简单展示吧:
一个示例合同文档图片抽取后的文字:(由于数据具有敏感性,不公开了)
标注结果1:
标注结果2:
这些部分只能在我的草稿箱保存了。这里指给出我目前的一个训练结果,最好是f1=93%。
- 2022-03-31 19:19:17,810 - log/train2.log - INFO - evaluate:test
- 2022-03-31 19:19:18,630 - log/train2.log - INFO - processed 1373 tokens with 139 phrases; found: 143 phrases; correct: 132.
-
- 2022-03-31 19:19:18,630 - log/train2.log - INFO - accuracy: 97.38%; precision: 92.31%; recall: 94.96%; FB1: 93.62
-
- 2022-03-31 19:19:18,630 - log/train2.log - INFO - Cname: precision: 100.00%; recall: 100.00%; FB1: 100.00 6
-
- 2022-03-31 19:19:18,630 - log/train2.log - INFO - Tel: precision: 100.00%; recall: 100.00%; FB1: 100.00 15
-
- 2022-03-31 19:19:18,630 - log/train2.log - INFO - address: precision: 92.00%; recall: 93.88%; FB1: 92.93 50
-
- 2022-03-31 19:19:18,630 - log/train2.log - INFO - bank: precision: 95.65%; recall: 100.00%; FB1: 97.78 23
-
- 2022-03-31 19:19:18,630 - log/train2.log - INFO - company: precision: 80.00%; recall: 85.71%; FB1: 82.76 15
-
- 2022-03-31 19:19:18,630 - log/train2.log - INFO - money: precision: 100.00%; recall: 100.00%; FB1: 100.00 10
-
- 2022-03-31 19:19:18,630 - log/train2.log - INFO - name: precision: 77.78%; recall: 77.78%; FB1: 77.78 9
-
- 2022-03-31 19:19:18,630 - log/train2.log - INFO - tax: precision: 100.00%; recall: 100.00%; FB1: 100.00 6
-
- 2022-03-31 19:19:18,630 - log/train2.log - INFO - time: precision: 88.89%; recall: 100.00%; FB1: 94.12 9
-
- 2022-03-31 19:19:18,835 - log/train2.log - INFO - new best test f1 score:93.620
- 2022-03-31 19:19:25,302 - log/train2.log - INFO - evaluate:dev
- 2022-03-31 19:19:45,222 - log/train2.log - INFO - processed 19317 tokens with 3764 phrases; found: 3929 phrases; correct: 3181.
问题:name/tel/tax字段的标注效果并不好
在经过NER自动标注后,对数据其实还要进一步清洗和手工标注,才能得到一份好的训练数据,在这个过程中,可以边标注数据,边做关系抽取了,目前还在清洗我的数据,之后再演示一下新的标注结果吧!
经过再一周的数据清洗和完善,拿基本上完善的train数据和没有上下文的dev、test数据,做了训练,然后进一步做了预测,预测效果相比上一次好很多,结果信息设计敏感,不可公开,只能保存在草稿箱了。。。。。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。