赞
踩
点击上方“AI遇见机器学习”,选择“星标”公众号
重磅干货,第一时间送
这次我们来总结一下最近几年,在工业界比较流行的NER任务解决方案。首先可以回顾一下,什么是NER任务呢?一句话来解释,就是给文本打标签,打什么标签呢?打一些实体的标签,可以参考我之前的文章,复习一下NER的知识。
在工业界中的场景,NER任务的挑战性很大,主要原因如下所示:
新增实体数量庞大,且在不断变化:这点对于模型的挑战性很大,比方说今天需要学习到的实体,可能需要识别到更多的实体,模型不会在短时间内重新训练完毕的。举例来说,“海底捞的火锅真好吃”,今天的实体库里只有“海底捞”,明天实体库里新增了“火锅”,模型也需要识别出来。数量庞大是毋庸置疑的,工业界的实体库一般都在百万、千万左右。
领域相关性强,并且会存在一个实体对应多个领域的情况:搜索中的实体识别与业务供给高度相关,需要融入业务的知识。这个也就是歧义,很好理解。举例来说,“海底捞”即是饭店的名称,也是一种食物的名称,那对应两种实体,两种领域,这种时候就需要业务的知识来判别。
针对于上述存在的问题,工业界的解决方案是 实体词典+模型预测的解决方案,为什么需要实体词典呢?实际上这部分可以理解成为复杂的业务规则,一般来说,我们利用实体的最大长度匹配来粗略的匹配到实体,如果“海底捞的火锅”在食物领域的实体库中,那么我们会把“海底捞的火锅”整个视为食物实体。
我们来想一想,词典库匹配能够带来什么好处?
快:输出不需要经过模型,输出会很快。
方便修改:可以很方便的融入业务规则等等,方便我们之后随时改动。
那模型是用来解决什么问题?
歧义:在模型大量训练之后,就可以融入部分常识信息,就可以解决。
OOV问题:在之前的文章我们介绍过OOD问题,也即Out Of Domain,OOV的含义是Out Of Vocabulary,本质上的意思一样,就是实体库并不包含这个实体,这点在实际中太常见了。举个例子来说,实体“海底捞”根本不在我的实体库里,我还需要模型能够预测出“海底捞”是一个商店名字。
评估指标是什么?
严格评估指标:这里能够体现出的是精确度,召回率,还有F-score,对于F-score来说,要比Precision和Recall带来的结果更加的综合。
宽松评估指标:将实体识别评估细化到边界识别和分类,只要其中一项识别正确则认为识别正确。比如,识别出的实体分类正确,问题边界与真实实体有重合;分类错误,但边界识别正确,这种我们也当做正确的。
对于深度学习模型来讲,如何大幅度提升模型的效率?
更多的特征:在NER任务当中,我们应该集中精力在embedding层下功夫:
比如char、bigram、词典特征,还有更多业务相关的特征。
在垂直领域,最好能根据业务当中的文本,大规模预训练/微调一个预训练模型也是一个不错的结果。
更加准确的数据:
优质的模版:可以通过简单的最大长度匹配算法来从文本中挖掘出对应的模版,通过出现的频率筛选出高频的模版,“海底捞的火锅真好吃”也会挖掘成为模版“{商店}的{食物}真好吃”,然后再进行随机的实体填充,就能够形成大批量样本。例如实体库总共百万,那么我挖掘出的模版至少有1000个,将会形成很大很大的数据。
优质的线上数据:从模版当中挖掘出的结果,和实际当中的样本分布是严重不符合的,因为我们只考虑了头部的几种模版,而中华文化博大精深,我们肯定不能使用这5000个模版来覆盖到所有。所以需要建立一套,线上优质数据的回流,可以考虑根据文本出现的频率,之前NER的结果进行打分,不断地去优化模型。
更“准确”的模型:这部分可以多参考学术上,五花八门的模型都有,但是在线上的提升,往往并没有特征增加带来的多,可能写了半天模型之后,也只有百分之一到百分之二的提升左右。
融入知识的NER任务
针对于普通的字模型NER任务,融入知识的方式肯定是会提升不少的效果,为什么这么讲?根本原因还是实体库的数量太大了,大到模型根本来不及学那么多,而知识融入的方式,为线上的修改,特征的增加,带来了不可磨灭的好效果。但是如果直接把实体/词典嵌入到模型中,可以意想之中,是非常困难的,为什么这么讲?请看下述关于海底捞实体的例子:
海 | 底 | 捞 | 的 | 火 | 锅 | 真 | 好 | 吃 |
海洋 | 底部 | 捞货 | 的时候 | 火上烧 | 锅底 | 真的 | 好的 | 吃什么 |
海底 | 底层 | 捞一下 | 的方式 | 火焰 | 锅具 | 真好 | 好利来 | 吃饭 |
海流 | 底薪 | 捞不着 | 的东西 | 火焰山 | 锅炉 | 真坑啊 | 好啊 | 吃哦 |
海飞丝 | 底部 | 捞出来 | 的结果 | 火炉火 | 锅巴 | 真是 | 好叭 | 吃了 |
海燕 | 底下 | 捞我 | 的呢 | 火热 | 锅盖 | 真没有 | 好了 | 吃烧烤 |
海边 | 底了 | 捞呢 | 。。。 | 。。。 | 锅里 | 真不 | 好吧 | 吃东西 |
表1:按照字来做实体匹配
假设上述是根据线上的实例,然后从实体库里面找出以“海底捞的火锅真好吃”为首字的实体,可以看出噪声很大,例如,对于海这个字,实际上我们并不想引入海洋这个词,所以我们需要降低这批文本的噪声。
工业界的做法,会先判断实体的边界,然后再融入知识。举例来说,会识别出“海底捞”,“火锅”这两个词是实体边界。何为实体边界?说白了是不区分实体的具体类型,只知道这个是实体,就可以了。然后再进行词典的匹配,那么上述的表格就会变成以下:
海底捞 | 的 | 火锅 | 真好吃 |
海底捞月 | 火锅外卖 | ||
海底捞外卖 | 火锅底料 | ||
海底捞服务 | 火锅店 | ||
海底捞会员 | 火锅料 |
表2:按照切割好的实体来做匹配
可以看出,海底捞和火锅这两个词,我们匹配到了更加精准的实体词库,虽然海底捞匹配到“海底捞月”,但是比之前的按字匹配可是要好太多了。相较于传统的端到端的NER方法,这种方法的优势是实体切分可以跨领域复用。另外,在实体标签识别阶段可以充分使用已积累的实体数据和实体链接等技术提高标签识别准确率,缺点是会存在错误传播的问题。
那么话到这里,基本上NER整体任务已经介绍完毕了,这一次我们由简到深,逐步细化的进行介绍,详细大家都已经看懂了。整体的pipeline形式如下所示,船长画了整整的一张图,下面我们进行细致的讲解。
图:NER任务总体
预处理:这部分可以忽略,很多业务规则等等,比方说去掉表情之类。
实体切分:根据上文所述,这一部分我们主要训练一个分类模型,来判断当前实体的边界在哪里,之后方便下文进行实体词库的特征补充。其次,当然也可以根据业务规则来进行切分。
词典嵌入:这个地方进行词典的嵌入,把实体嵌入到模型的训练当中。嵌入的过程,大多是直接进行线上模糊搜索或者匹配进行的,因为这一步是特征构造,耗时需要很短才行。在做好匹配之后,实际上可以对匹配的实体进行一些简单的排序,选取top10,如果匹配数量很多的话,例如在表2中,海底捞的匹配就有海底捞月,如果经过排序层之后,海底捞月和海底捞的关联很小,就会排在最后面。
实体分类:如何根据上述的词典进行知识的嵌入是一个很重要的领域,这点往往能够决定模型的上限,而船长之后会着重对这部分进行分析。
下游任务:NER任务是NLP任务的核心任务之一,只有做好了这一步,下游的NLP任务才得以大施拳脚。
最后,本期的工业界是如何在NER就介绍完毕了,觉得写得好,记得点赞关注!
你好,我是一个毕业于南加州大学的算法工程师,就职于大厂,个人喜好极其广泛,擅长深度思考,喜欢思维锻炼。公众号(船长尼莫)旨在和读者共同进步,会有原创的算法知识分享、工作求职分享、学者访谈、关于互联网的深度思考、读书分享等等。评论区可以和我积极互动,也可以写下你想看的内容~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。