NLP.TM[29] | ner自动化打标方法
【NLP.TM】
本人有关自然语言处理和文本挖掘方面的学习和笔记,欢迎大家关注。
往期回顾:
命名实体识别是文本分类的升级版,文本分类是对一整段文本进行分类,而命名实体识别则是对整段文字里所有位置的词都进行分类,我们都能体会到人工打标文本分类的痛苦,对于命名实体识别,那就可谓是有过之而无不及了,而命名实体识别本身由于泛化能力的需求,需要的数据会比文本分类更多,所以还是要多思考用尽可能少的人工,来完成标注任务,以便我们学习模型。
这里给大家介绍一种方法-词典+最大逆向匹配。这个方法不是个新玩意,在机器学习出现之前的传统方法用的就是他,词典的越是完整,召回率就会越高,至于正类的准确率,一直处于一个较高的水平,所以用这个来制作标注样本。
具体流程
首先是词典挖掘,根据具体ner任务的需求,整理出一批比较完整的词典,例如要识别出文本中的食物,那就整理出一个比较完整的词典,例如里面有火锅、烤鱼、寿司。具体的挖掘方法嘛,根据业务会有不同,自己去整理吧。
有了词典就可以用算法进行打标了,举个例子吧,BIO模式标注,对于一句话,“宫保鸡丁和红烧牛肉哪个好吃”,词典里面已知有宫保鸡丁和红烧牛肉了,那么标注就是这么个流程。
首先看看第一轮遍历。
宫保鸡丁-和-红烧-牛肉-哪个-好吃
词典不存在,不标注。
和-红烧-牛肉-哪个-好吃
词典不存在,不标注。
红烧-牛肉-哪个-好吃
词典不存在,不标注。
牛肉-哪个-好吃
词典不存在,不标注。
哪个-好吃
词典不存在,不标注。
好吃
词典不存在,不标注,本次遍历只剩一个词,结束遍历,好吃标注为O。
以此类推,“哪个”也是标注为O了,然后来看再下一轮。
宫保鸡丁-和-红烧-牛肉
词典不存在,不标注。
和-红烧-牛肉
词典不存在,不标注。
红烧-牛肉
词典存在,标注“红烧-牛肉”->“Food_B-Food_I”。
从而就把这个红烧牛肉给标注出来了,最终的标注结果就是这样的:
宫保鸡丁-和-红烧-牛肉-哪个-好吃
Food_B-O-Food_B-Food_I-O-O
至少在这个case里面,我们能看到提槽完全正确。
代码?自己写一遍,目前我没有看到有包,这个数据结构就当做一个算法题自己写就好了,python的代码量不到50行吧。
注意点
没有包,自己写。
对词典的准确率和召回率要求很高,注意词典质量。
词典可靠的前提下,能做groud truth,但是还是不能保证全对,作为标注样本训练之前,先评估这种方法打标的准确性,足够高就可以哪来训模型了。
这个方法足够好,就直接用它就好了,模型还不可控,或者要重训。
最终训练后的准招指标可以参考不可全信,自己拿100个case自己人工评价一遍,有的时候不是你的模型错,而是标注有问题,设置你你会发现人工评估完了,发现模型还优于你的标注。
discussion
只要词典可靠,其实F1可以达到95%甚至以上的水平,可以说是非常靠谱了,甚至不输我们的各种模型,在我的角度看这个方法本身在线部分就是可用的,但是问题在于这种严格的规则会导致召回率不高,尤其是比较长的实体,例如历史事件、酒店等,很可能会有输错、简称之类的情况出现,词典是难以遍历的,所以模型在这里的介入更像是一个“捞召回”的策略,即使牺牲一些这里的准确率,也是可接受的,毕竟最终用户角度看的是整体的准招,用啥方法标出来的他完全不关心。
说人话,总结一下:
复杂度优于模型方法。
准招总体一般略逊色于模型。
开发难度远低于模型。