使用UER进行开庭公告命名实体识别-续1
接着上篇博客,这次我采用自己生成训练数据的方式来再次训练,自己生成的训练数据不会存在标注错误的问题,也可以尽可能的保证各种实体的类别尽可能的丰富。
生成训练数据
生成训练数据的程序是这里比较核心的模块,且考虑到公司的知识产权(因为是我在公司工作的时期开发的),就不做公开展示了。
不过这里可以大概的说下基本思想:
首先根据开庭公告非结构化文本的行文规律,总结出数十套模板,这里给出一套模板:
`长路漫漫,唯剑作伴`
上篇文章已经讲述了,如何使用UER进行NER任务微调训练,接下来咱就开始实战了,我这边要做的一个任务是司法文书的信息抽取,简单描述就是抽取出案号、案由、当事人、法院、法庭等信息,不过整体的任务还是比较复杂的,并且司法文书种类也比较多,有裁判文书这种长文本,也有开庭公告、法院公告这种短文本,我这边打算先从开庭公告的一些短文本作为切入点,先做一些尝试,看看效果。
我这边的一个实验计划暂定为:
使用GitHub项目:https://github.com/dbiir/UER-py
项目完整文档:https://github.com/dbiir/UER-py/wiki/%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B
预训练模型仓库:https://github.com/dbiir/UER-py/wiki/%E9%A2%84%E8%AE%AD%E7%BB%83%E6%A8%A1%E5%9E%8B%E4%BB%93%E5%BA%93
上篇文章是使用huggingface transformer中预训练好的命名实体识别模型来进行实体抽取,但是在实际任务中,一般需要根据自己的数据集再进行微调,所以就继续研究如何进行微调,最终定位到UER-py这个工具包,所以这里先研究下这个工具怎么用。
NLG
采样策略上篇文章中学习了NLG
的解码策略,主要包括greedy search、beam search,如果不太记得了可以再去温习一下,然后接下来我们来看看这些解码策略会存在哪些问题,是否还可以从其他角度来提高文本的生成效果。
这幅图展示了每个时间步,生成某个单词的可能性,我们发现beam search在每一步的概率值都是比较大的,但是如果是真实人类的话,其实是比较随机的(人说话的内容比较随机,富有多样性)。这主要是因为beam search本身就是在根据最大概率去生成句子,但是最大概率不等于最好,上篇文章中我们有提到
此外因为模型生成时,一定程度上依赖于已经生成的句子,所以一味的选取概率最大的,可能会使句子的生成陷入不断地重复循环中,所以针对beam search这些特点,为了可以生成更多样化的句子(引入一定的随机性)又不偏离主题,以下几种采样策略被研究者提出。
NLG
解码策略自然语言生成(Natural Language Generation,简称NLG
),是自然语言处理领域的一个重要分支,在文本摘要生成任务中,另一个重要的分支是自然语言理解(Natural Language Understanding,简称NLU
)。前面我们已经学习了seq2seq
模型结构,其主要分为Encoder和Decoder两大组件,其实正是对应了NLU
和NLG
两大分支,seq2seq
模型最后经过一个softmax
层,在每个时间步均得到一个词表大小的概率分布,如何利用这些概率分布得到最终的预测句子就是本节学习的解码策略。
上篇构建文本摘要baseline时,我们就有提到过解码方法,当时采用的Teacher forcing的技巧,使用了真实标签,避免前面的步骤预测出错被无限放大的问题,但是在实际预测时因为没有真实标签,往往实际预测效果不一定好,所以寻找可行的解码策略是一项重点工作。