NER为什么那么难
命名实体识别(Name Entity Recognition) 是自然语言处理中一个比较基础的问题。要解决的问题是,从unstructure的文本当中找到实体并归类。当然我这么定义已经有了一定的bias,认为是先找实体在归类,但实现过程则并不一定如此。
定义一般来说都比较抽象,我们举一些例子来理解一下NER试图要解决的问题。比如说,一篇作文中,找出时间,人物,地点; 一个医学报告中,找出疾病名称及药品名称等; 一份合同中,找出甲方乙方,付款方式以及到期日期等。
这些问题看上去似乎并不难,近几年的BiLSTM, BERT以及各种变形模型也不断刷新分数棒,F1高达0.95.
然而,当把NER运用到实际中来时,效果并不像理论上那么好。很多人称,NER问题离被解决还有很长的路要走。
为什么呢?
首先,对于实体的定义,据说即使都是行业专家,认同度达到95%已是非常难。人类尚未清楚自己想要什么,怎能期待模型能给出完美答案呢。这句话其实不然,也许模型就是知道你想要什么。
扯远了,其实要说的是,定义的模糊是这个问题的难点之一。举一个药品的例子。上下文是,一个人得了感冒,医生建议吃点泡腾片,补充一下vc。那,这个泡腾片可以是药品吗?
难点之二,一词多义,在简短的上下文中无法正确归类。比如说, 甲壳虫走了。这句话中,甲壳虫可以是汽车,可以是昆虫。
难点之三,边界模糊,主要原因是复杂的实体在标注的时候,就很难有一致的认识,以及实体prevalence(出现率)比较低导致边界在哪里嘛,太难说了。对于前者,比如说合同类型,"某某公司的员工雇佣合同”和"员工雇佣合同”都可以归类为合同类型,但前缀取不取呢,在不同上下文中可能有不同的需求。
NER问题解决经历了三个阶段。
最早的技术是,规则匹配和词典查询匹配。为了提高precision和recall,规则会变得非常的复杂,词典会变得非常的庞大。要构造完整的词典代价非常的大,于是在词典匹配上又结合了集群以及相似度查询的方法。
第二阶段,手工特征工程➕机器学习。这个阶段的特征工程的工作相当繁重,除了n-gram的词之外,比如说POS tag, 大小写,数字替代,词语集群等等。机器学习部分一般是比较简单的逻辑回归加CRF解码。即使手动工作量相当繁重,但是比起规则匹配和完善词典的工作还是轻松不少,效果也好很多。
第三阶段,深度学习。这个阶段,重要特征在深度神经网络中基本上可以做到自动提取,并且,效果明显比手动的特征工程好很多。加上embedding的使用,使得模型的输入含有更加丰富的信息。排行榜不断被刷新的事实也可以说明这一点。
那为什么深度学习还是不能完美解决实际的问题呢。这和之前提出来的难点息息相关的。
一词多义需要很长的上下文才能明确意思,但一般的深度学习模型不能有太长的输入。比如说经典的用来解决NER的深度模型BERT或BiLSTM一般输入为512或728个token,如果太长,系统资源消耗太大。
另外,一般的评分系统都是基于token的,最终整个词组被准确识别出来的分数并未受到非常大的关注。词组分界问题在不同的领域难度也差别很大,但如何在token模型之后准确解码到词组,并没有被很好的research过。
实际的NER问题比公共数据库,比如说CoNLL的难度要大很多。每个行业可能有自己的twist,但是并没有系统的被讨论和共享起来。
难以得到完美的数据集,使得这个问题即使解决的再完美也只能停留在某个水平。
之前看spacy的创始人讲NER, 说大家要达到一个基础水平很容易,要上一个台阶就非常难了。NER这个问题尚未解决也是相当fair的一种说法。
阅读作者更多原创,观众微信公众号:
作者简介:
Dagis: 现居住在瑞典,某AI公司的Data Scientist, 学习通信出身,喜欢数学,更喜欢把数学用于实际。