最近做了一点微小的工作,搞了下命名实体识别(named entity recongnition, NER),这里总结一下目前的认识。内容比较杂,先亮一下目录,如图0-1.

1什么是命名实体
1.1什么是实体
实体(entity)指客观存在、并可相互区别的事物(https://baike.baidu.com/item/%E5%AE%9E%E4%BD%93/422661)。实体可以是具体的人、事、物,也可以是概念。
1.2命名实体
命名实体就是以名称为标识的实体。简单来说,如果我们听到一个名字,就能知道这个东西是哪一个具体的事物,那么这个事物就是命名实体。
用大众的语言来说,只要有名字,就算阿猫阿狗也是一个命名实体。比如我有一只蟋蟀,名叫“小强”,那么小强就是一个命名实体(当然是对我来说,其他人会踩死它)。
用程序员的语言来说,类的一个实例,就是一个命名实体。比如“Person”这个类实例化后,得到一个名为“孙悟空”的对象,这个“孙悟空”就是一个可以用名称来引用和操作的东西了(叫“孙悟空”,不会有另一个对象答应)。
在生活和生产中,到处有实体。如表1-1,是我们的生产和生活中经常遇到的命名实体和实体的类型。实体的类型是根据需求,人为定义的一种概念,用来区分命名实体的类别,以便区别对待和使用,常见的实体类型有人名、地名(有时候分为地理地名和政治地名两部分)、组织名、时间、产品名等等。
表1-1 常见命名实体实例
序号 |
实体 |
实体类型 |
1 |
1949年10月1日 |
时间表达式 |
2 |
中国 |
地名 |
3 |
国庆节 |
节日 |
4 |
姚明 |
人名 |
5 |
韶山学校 |
组织机构 |
6 |
北京 |
地名 |
7 |
百分之百 |
数字表达式 |
1.3为什么要识别命名实体
命名实体是现实世界里的事物,它们和现实世界相互作用、相互影响,因此命名实体在一些一些场景里特别重要,比如我想知道《红楼梦》里所有的人物在各回的出场情况,进而为每个人物做一个生平简介。这时候,我们就需要某种手段,把文本中的命名实体给识别出来,如表1-2。
有时候,我们需要知道事物之间的关系,进而准确地决策。比如说,王夫人需要知道大观园里所有人和宝玉的交往情况,找出所有可能引诱宝玉不走正道的“狐媚子”。我们可以识别出大观园里出现的所有的人物,并判断人物之间的关系(有想法、没想法),然后做成一个有向图。这样,就可以把所有对宝玉有想法的人拎出来审问了。
这么做似乎代价有点高啊。如果只是为了保护宝玉,做这个图谱就有点铺张了;如果是为了保护所有的人,这个图谱的成本就会被摊的比较薄,值得做。
表1-2 《红楼梦》片段里的人名
回序号 |
文本 |
人名 |
5 |
宝玉还欲看时,那仙姑知他天分高明,『性』情颖慧,恐把天机泄漏,遂掩了卷册,笑向宝玉道:“且随我去游顽奇景,何必在此打这闷葫芦。”宝玉恍恍惚惚,不觉弃了卷册,又随了警幻来至后面。但见珠帘绣幙,画栋雕檐,说不尽那光摇朱户金铺地,雪照琼窗玉作宫;更见仙花馥郁,异草芬芳,真好个所在。 |
宝玉,警幻 |
1.4海量文本数据中的命名实体
给我一周的时间,我能把《红楼梦》里面的人名全都标记出来。咬咬牙,把地名、组织名、职位名都标记出来,也是可以的。
什么?还有明代四大奇书以及《四库全书》?我需要亲切问候一下提需求的人。
1.5什么是命名实体标注
壮士且慢,有没有听过命名实体识别,也就是NER呢?NER指的是一类技术,可以自动地从文本数据中识别出特定类型的命名实体。我们可以用计算机来完成这个任务,用不了一周。
如图1-1,是命名实体标注任务的流程图。我们将原始文本输入到NER工具里,该工具会输出带有命名实体标记的文本或者命名实体列表。
