当前位置:   article > 正文

文档级信息抽取1----NER_特定提取文章要点的数据集

特定提取文章要点的数据集

一个完整的信息抽取系统分为三部分:实体识别、关系链接、关系分类

第一步做我的实体识别数据集。

这里其实开源的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进行标签分类

  1. 2)自动标注
  2.         1)ocr对所有的img识别文字,得到text、bbox
  3.         2)把ocr的输出写入到txt里面(指定格式写入,每一行一个字和一个默认tagO,用空格隔开,每个句子间用换行隔开)
  4.         3)用标注好的数据训练CRF++模型
  5.         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、增加了金额字段、

  1. address<234个实体
  2. bank:<184个实体
  3. company:<238个实体
  4. name:<199个实体
  5. time<253个实体
  6. O:比例增大
  7. money:<300个实体
  8. tel: <250个实体
  9. cname: <47个实体
  10. 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%。

  1. 2022-03-31 19:19:17,810 - log/train2.log - INFO - evaluate:test
  2. 2022-03-31 19:19:18,630 - log/train2.log - INFO - processed 1373 tokens with 139 phrases; found: 143 phrases; correct: 132.
  3. 2022-03-31 19:19:18,630 - log/train2.log - INFO - accuracy: 97.38%; precision: 92.31%; recall: 94.96%; FB1: 93.62
  4. 2022-03-31 19:19:18,630 - log/train2.log - INFO - Cname: precision: 100.00%; recall: 100.00%; FB1: 100.00 6
  5. 2022-03-31 19:19:18,630 - log/train2.log - INFO - Tel: precision: 100.00%; recall: 100.00%; FB1: 100.00 15
  6. 2022-03-31 19:19:18,630 - log/train2.log - INFO - address: precision: 92.00%; recall: 93.88%; FB1: 92.93 50
  7. 2022-03-31 19:19:18,630 - log/train2.log - INFO - bank: precision: 95.65%; recall: 100.00%; FB1: 97.78 23
  8. 2022-03-31 19:19:18,630 - log/train2.log - INFO - company: precision: 80.00%; recall: 85.71%; FB1: 82.76 15
  9. 2022-03-31 19:19:18,630 - log/train2.log - INFO - money: precision: 100.00%; recall: 100.00%; FB1: 100.00 10
  10. 2022-03-31 19:19:18,630 - log/train2.log - INFO - name: precision: 77.78%; recall: 77.78%; FB1: 77.78 9
  11. 2022-03-31 19:19:18,630 - log/train2.log - INFO - tax: precision: 100.00%; recall: 100.00%; FB1: 100.00 6
  12. 2022-03-31 19:19:18,630 - log/train2.log - INFO - time: precision: 88.89%; recall: 100.00%; FB1: 94.12 9
  13. 2022-03-31 19:19:18,835 - log/train2.log - INFO - new best test f1 score:93.620
  14. 2022-03-31 19:19:25,302 - log/train2.log - INFO - evaluate:dev
  15. 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数据,做了训练,然后进一步做了预测,预测效果相比上一次好很多,结果信息设计敏感,不可公开,只能保存在草稿箱了。。。。。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/695090
推荐阅读
相关标签
  

闽ICP备14008679号