轻松NLP-命名实体识别-1

1. Named Entity Recognition(NER) 简介

学术上NER所涉及的命名实体一般包括3大类(实体类,时间类,数字类)和7小类(人名、地名、组织机构名、时间、日期、货币、百分比)。

但在实际的应用中,NER模型通常只要识别出人名、地名、组织机构名、日期时间即可,一些系统还会给出专有名词结果(比如缩写、会议名、产品名等)。货币、百分比等数字类实体可通过正则搞定。另外,在一些应用场景下会给出特定领域内的实体,如书名、歌曲名、期刊名等。

从自然语言处理的流程来看,NER是NLP中一项基础性关键任务,它可以被看作是词法分析中未登录词识别的一种,是未登录词中数量最多、识别难度最大、对分词效果影响最大问题。同时NER也是关系抽取、事件抽取、知识图谱、机器翻译、问答系统等诸多业务系统的基础。

在机器学习之前,借助于统计自然语言处理技术,NER任务其实已经有不错的发展,尤其在有限的文本类型(主要是新闻语料中)和实体类别(主要是人名、地名、组织机构名)中取得了不错的效果,所以有人认为这是一个已经解决的问题。其实,以目前的业务需求及技术来看,这个问题还是没有得到很好地解决,原因主要有:在复杂的文本类型与实体类型中效果不理想;与其他信息检索领域相比,实体命名评测预料较小,容易产生过拟合;命名实体识别更侧重高召回率,但在信息检索领域,高准确率更重要;通用的识别多种类型的命名实体的系统性能很差。

但是随着机器学习及深度学习在NLP领域的发展,这些问题也得到了比较好的解决,这其中以RNN(LSTM / BILSTM) 配合CRF的模型组合为代表,再实际的业务中再佐以强规则匹配,目前在各个领域的NER任务都可以得到不错的效果。下图是NER的技术发展路线。


image_0.png

2. 中文的特性:

在汉语中做NER时,需要对博大精深的汉语做一几点特殊说明.......其实没有别的意思,那下面就和英文对比下吧。

汉语作为象形文字,相比于英文等拼音文字来说,针对中文的NER任务来说往往要更有挑战性,主要体现在以下几点:

  • 没有显式的界限标志
    英文中存在天然的分割符(界限标志),那就是空格。而中文中没有

  • 没有大小写的形态区分
    英文中大小写有实际的区分含义,比如人名,地名,特有名词等,但是中文中没有

  • 没有严格的词的形态概念
    英文中的词是有边界的,如1中所说,另外,存在固定的短语和固定搭配。而中文中的组词造句千变万化,如果考虑字的多意,那感觉是黑洞。

  • 中文的用字灵活多变
    有些词语在脱离上下文语境的情况下无法判断是否是命名实体,而且就算是命名实体,当其处在不同的上下文语境下也可能是不同的实体类型

  • 中文实体存在嵌套
    比如“中山大学附属第三医院”,这一组织机构名中还嵌套着同样可以作为组织机构名的“中山大学”,而且这种现象在组织机构名中尤其严重

  • 中文里广泛存的简化表达
    如“中大附三医院”、“华科”等

3. 序列标注的方式

NER其实也是序列标注的一种,序列标注的任务就是以某种标准判断从一个词开始到那里应该分割。比如NRE中的ORG组织,“中山大学“中”开始到”学“分割。这种思路也同样可以扩展到分词POS

  • BMEO
    B,词首
    M,词中
    E,词尾
    O,单字
  • BIEOS
    B,Begin,开始
    I,Intermediate,中间
    E,End,结尾
    S,Single,单个字符
    O,Other,其他,用于标记无关字符

以上的标方式可以再根据实际裁剪,比如BIO等

4. 基本流程

  1. 剔除标点符号
  2. 预处理训练集,按BMEO标注
  3. 生成word2id
  4. 生成tag2id
  5. 训练

5. 算法模型

在深度学习模型中bilstm + crf的方案目前表现最好,也是目前的主流方案。在这个方案中主要有以下几个模块:

  • 字表示(word representation)
    对字的One-hot编码,如下图所示

  • 字编码(word embedding)
    使用word2vec技术对字进行大语料级别的语义编码,理论上讲这个模块是可选的,但是目前实际的操作中一般都要加入这个过程,如下图所示:

    image_1.png

  • 考虑上下文的字编码(contextual word embedding)
    使用bilstm对每个字进行考虑上下文语义的编码, 如下图所示:

    image_2.png

  • crf 预测
    使用crf对bilstm的结果进行分类,如下图所示:

    image_3.png

在看这张图之前,需要提一下CRF的内容,下面举例说明:

以词性标注为例,比如这句话:“Bob drank coffee at Starbucks”,注明每个单词的词性后是这样的:“Bob (名词) drank(动词) coffee(名词) at(介词) Starbucks(名词)”。用条件随机场来解决这个问题。

以上面的话为例,有5个单词,我们将:(名词,动词,名词,介词,名词)作为一个标注序列,称为l,可选的标注序列有很多种,比如还可以是这样:(名词,动词,动词,介词,名词),我们要在这么多的可选标注序列中,挑选出一个最靠谱的作为我们对这句话的标注。

怎么判断一个标注序列靠谱不靠谱呢?就我们上面展示的两个标注序列来说,第二个显然不如第一个靠谱,因为它把第二、第三个单词都标注成了动词,动词后面接动词,这在一个句子中通常是说不通的。

假如我们给每一个标注序列打分,打分越高代表这个标注序列越靠谱,我们至少可以说,凡是标注中出现了动词后面还是动词的标注序列,要给它负分!!

上面所说的动词后面还是动词就是一个特征函数,我们可以定义一个特征函数集合,用这个特征函数集合来为一个标注序列打分,并据此选出最靠谱的标注序列。也就是说,每一个特征函数都可以用来为一个标注序列评分,把集合中所有特征函数对同一个标注序列的评分综合起来,就是这个标注序列最终的评分值。

这就是CRF,听着是不是有点像softmax,这个是后话了......,不过现在再看上面的图就很清楚了,bilstm对每个词可能的标注情况已经有一个输出了,但是CRF需要再从全局(或者说横向)来考虑一次,看看哪种链路是最合理的,这也是CRF的强项。

6. CODE

代码与解释下回分解.....
轻松的命名实体识别-2,即将上线!

你可能感兴趣的:(轻松NLP-命名实体识别-1)