命名实体识别之再调研

    技术2024-11-24  19

    最近比赛多得令人窒息,所以笔者也从中学到了不少的东西。为此,笔者想基于之前更新的命名实体识别的文章,再写一写最近看到的一些NER算法。

    笔者在这里就不对命名实体识别等基础知识进行赘述了,我们扣1直接开车。

    1. MRC实体分类+抽取

    输入格式:<CLS>某个分类的定义<SEP>文本段落<SEP>

    输出格式:该分类下的所有实体

    这种方式的关键在于数据构造这一块,相当于是把分类问题转化成了数据构造问题,我们只要找出对应类别的定义,与相应的文本进行拼接,然后正常完成NER任务即可。

    举个例子,假如我们要抽出一段话里面的朝代实体和人物实体。

    样例:“贼吕布在东汉末年认了三个爹,李白生于唐朝,朱元璋建立了明朝。”

    数据构造格式:<CLS>问题<SEP>文本<SEP>

    我们定义朝代问题:“请抽出这段话含有的朝代。”

    我们定义人物问题:“请抽出这段话含有的人物。”

    输入:

    <CLS>请抽出这段话含有的朝代。<SEP>贼吕布在东汉末年认了三个爹,李白生于唐朝,朱元璋建立了明朝<SEP>

    输出:东汉、唐朝、明朝

    <CLS>请抽出这段话含有的人物。<SEP>贼吕布在东汉末年认了三个爹,李白生于唐朝,朱元璋建立了明朝<SEP>

    输出:吕布、李白、朱元璋

    一般来说,“问题”就是这个类别的定义。总之我们构造的问题要描绘出该类别信息。

    模型结构:简单的BERT的阅读理解任务:BERT的最后一层向量分别下接dense层,生成start和end两条结果向量,两条向量的长度是输入BERT的max_len长度,使用argmax对两条向量分别进行二分类,1为是start/end,0为不是start/end,如图1所示。

    Loss如公式1所示下:

    图1 模型示意图

    预测结果配对:采用就近原则,对start和end位置进行配对,抽出实体,如图2所示。我们可以从图中看到,这种方式的配对可能会导致end位置超过一些start的位置,所以我们直接跳过这些start位置,并将这些位置赋值为“I”。

    图2 预测结果配对

    这个方法的缺点在于很难把控好对问题的定义且分类效果不佳。笔者的师弟跑了某个比赛的数据集,实验发现该方法能召回很多正确的实体,但是这些正确的实体并不属于当前我们问题所定义的类别。

    从结果来看,这种方法抽出的实体都是我们想要的,只是类别没分对而已。因此,我们可以将BERT+CRF模型的结果与该方法抽出的实体做个配对,将CRF的类别用在MRC的结果上,最后我们通过实验发现,分数确实上去了。

    2. 指针网络

    指针网络可以认为是第一种方法的进阶,它简化了我们定义问题的过程。我们直接在模型中多抽取几对(Start,End)向量,每一对向量代表一个类别即可,预测结果匹配也是按照就近原则。

    不过,指针网络相较于方法1多了个span loss,整体的loss如公式2所示。

    其中span loss的设计为了解决实体嵌套问题,但是由于它的时空复杂度比较高,且笔者的师弟在某个比赛的数据集测试发现并不是很有效,甚至伤害了模型性能,于是便删掉了span loss。

    虽说span loss在某个比赛数据集确实没啥用,但也不妨碍我们去了解它,它的原理也挺简单的,就是通过一个二维矩阵来记录真实实体在句子中的(Start,End)位置,比如某个实体在文本中的位置是1~3,那么它在二维矩阵的坐标(1,3)则标注为1,如图3所示。我们假设这个文本的max len为3,那么span 矩阵的大小则为3×3,我们可以看到span矩阵中的“0”会比1多,极大浪费了空间。当然了,这也是可以优化的,我们通过别的算法来储存矩阵,进而压缩空间复杂度,只是加上这个loss的效果不佳,因此,笔者也没对其进行过多的深究。

    图3 span矩阵

    最后,我们再看一下删掉span loss的模型结构,如图4所示。

    图4 指针网络

    3. Embedding大法好

    笔者在命名实体识别NER论文调研中也提到,这两年的NER算法思想主要集中在将词典信息融入训练过程,加强模型的整体泛化效果。我也知道中文BERT NER是基于char(字)级别的embedding,那么我们能不能将词(word)级别的embedding也融进BERT里面。

    答案是可以的,事实上预训练模型ZEN模型做的就是这个操作,笔者在平安产险的比赛中也用了ZEN模型搭配WWM预训练了一个ZEN_wwm模型。

    当然了,我们也可以把操作玩得更好一点,BERT fine-tune输入参数是有input mask这个玩意的,那么我们能不能通过修改attention score的公式,利用input mask对word embedding 与 char embedding融合之后的embedding进行加权呢?

    4.求个赞

    关注我的微信公众号【阿力阿哩哩】~不定期更新相关专业知识~

    喜欢就点个赞吧~

    Processed: 0.061, SQL: 9