我本人原先是一名后端算法工程师,后转为NLP算法工程师,具体负责的第一个任务就是实体识别。实体识别和命名实体识别(NER)概念上的具体区别在这里简单阐述一下。我认为实体识别虽然通常不作为一个单独的概念和命名识别进行比较,但是从工程的角度上两者是不同的,区别在于以下几点:
- 研究领域不同;命名实体识别一般用于开放领域(如:人机对话,翻译),实体识别一般应用于具体的场景中(如汽车,医药,电商等垂直领域)。
- 研究主体不同;一般来说,命名实体识别的任务就是识别出待处理文本中三大类(实体类、时间类和数字类)、七小类(人名、机构名、地名、时间、日期、货币和百分比)命名实体。在这里主要需要关注的是实体类,因为这是实体识别所关注的一类词。在具体的领域中通常会有这个领域所特有的专有名词所构成的词典(医药行业的药名,汽车行业的车型、车系、品牌等)。除了实体类以外的时间和数字,通常我们都可以使用正则匹配的方式来识别。
- 主要任务不同;从概念上讲命名实体识别(NER)的主要任务有两个(1)实体边界识别;(2)确定实体类别(人名、地名、机构名或其他);而在工程实践中实体识别往往还要(3)确定“实体是什么?”,这一步是两者特征上最显著的不同。
第三点主要任务的不同,是两者从表征上讲最显著的不同,由这一点的不同出发将会延伸出不同的解决思路。在这里我提供两种基本思路供大家参考:
- 思路一:在拥有该领域标准词典的情况下,通过一定的算法一次性的划分出“疑似实体”在句子中的边界(疑似实体之间不存在边界冲突),并将“疑似实体”尝试转化为词典中的某一标准实体。
- 思路二:在拥有该领域标准词典的情况下,通过一定的算法找到句子中的所有“疑似实体”(可能存在位置冲突),再通过一定的算法将实体边界切分出来的同时转化为标准词典中的某一实体。
简单说明一下,第一个思路第一步所做的就是确定(1)实体的边界,通过这一步产生的实体的候选集之间边界是明确的且不存在冲突。第二种思路的第一步,是把所有可能成为实体的词都从句子中识别出来,即使他们之间存在位置冲突。从第一步看,两者的区别类似于jieba分词的精确模式和全模式之间的区别。我们选择的是第二种思路,在这里再简单解释一下为什么不使用第一种思路。我们来看第一种思路在工程中的具体实践,1.通过人工标注或者自动标注的方式获得标注数据。2.使用标注好的数据训练一个在该领域下的NER模型。3.通过训练好的模型对句子进行实体识别,因为模型的识别结果总是不产生冲突的,我们只需要