笔记转载于GitHub项目https://github.com/NLP-LOVE/Introduction-NLP

8. 命名实体识别

8.1 概述

  1. 命名实体

    文本中有一些描述实体的词汇。比如人名、地名、组织机构名、股票基金、医学术语等,称为命名实体。具有以下共性:

    • 数量无穷。比如宇宙中的恒星命名、新生儿的命名不断出现新组合。
    • 构词灵活。比如中国工商银行,既可以称为工商银行,也可以简称工行。
    • 类别模糊。有一些地名本身就是机构名,比如“国家博物馆”
  2. 命名实体识别

    识别出句子中命名实体的边界与类别的任务称为命名实体识别。由于上述难点,命名实体识别也是一个统计为主、规则为辅的任务。

    对于规则性较强的命名实体,比如网址、E-mail、IBSN、商品编号等,完全可以通过正则表达式处理,未匹配上的片段交给统计模型处理。

    命名实体识别也可以转化为一个序列标注问题。具体做法是将命名实体识别附着到{B,M,E,S}标签,比如, 构成地名的单词标注为“B/ME/S- 地名”,以此类推。对于那些命名实体边界之外的单词,则统一标注为0 ( Outside )。具体实施时,HanLP做了一个简化,即所有非复合词的命名实体都标注为S,不再附着类别。这样标注集更精简,模型更小巧。

命名实体识别实际上可以看作分词与词性标注任务的集成: 命名实体的边界可以通过{B,M,E,S}确定,其类别可以通过 B-nt 等附加类别的标签来确定。

HanLP内部提供了语料库转换工序,用户无需关心,只需要传入 PKU 格式的语料库路径即可。

8.2 基于隐马尔可夫模型序列标注的命名实体识别

之前我们就介绍过隐马尔可夫模型,详细见: 4.隐马尔可夫模型与序列标注

隐马尔可夫模型命名实体识别代码见(自动下载 PKU 语料库): hmm_ner.py

https://github.com/NLP-LOVE/Introduction-NLP/tree/master/code/ch08/hmm_ner.py

运行代码后结果如下:

华北电力公司/nt 董事长/n 谭旭光/nr 和/c 秘书/n 胡花蕊/nr 来到/v 美国纽约/ns 现代/ntc 艺术/n 博物馆/n 参观/v

其中机构名“华北电力公司”、人名“谭旭光”“胡花蕊”全部识别正确。但是地名“美国纽约现代艺术博物馆”则无法识别。有以下两个原因:

  • PKU 语料库中没有出现过这个样本。
  • 隐马尔可夫模型无法利用词性特征。

对于第一个原因,只能额外标注一些语料。对于第二个原因可以通过切换到更强大的模型来解决。

8.3 基于感知机序列标注的命名实体识别

之前我们就介绍过感知机模型,详细见: 5.感知机分类与序列标注

感知机模型词性标注代码见(自动下载 PKU 语料库): perceptron_ner.py

https://github.com/NLP-LOVE/Introduction-NLP/tree/master/code/ch08/perceptron_ner.py

运行会有些慢,结果如下:

华北电力公司/nt 董事长/n 谭旭光/nr 和/c 秘书/n 胡花蕊/nr 来到/v [美国纽约/ns 现代/ntc 艺术/n 博物馆/n]/ns 参观/v

与隐马尔可夫模型相比,已经能够正确识别地名了。

8.4 基于条件随机场序列标注的命名实体识别

之前我们就介绍过条件随机场模型,详细见: 6.条件随机场与序列标注

条件随机场模型词性标注代码见(自动下载 PKU 语料库): crf_ner.py

https://github.com/NLP-LOVE/Introduction-NLP/tree/master/code/ch08/crf_ner.py

运行时间会比较长,结果如下:

华北电力公司/nt 董事长/n 谭旭光/nr 和/c 秘书/n 胡花蕊/nr 来到/v [美国纽约/ns 现代/ntc 艺术/n 博物馆/n]/ns 参观/v

得到了结果是一样的。

8.5 命名实体识别标准化评测

各个命名实体识别模块的准确率如何,并非只能通过几个句子主观感受。任何监督学习任务都有一套标准化评测方案,对于命名实体识别,按照惯例引入P、R 和 F1 评测指标。

在1998年1月《人民日报》语料库上的标准化评测结果如下:

模型 P R F1
隐马尔可夫模型 79.01 30.14 43.64
感知机 87.33 78.98 82.94
条件随机场 87.93 73.75 80.22

值得一提的是,准确率与评测策略、特征模板、语料库规模息息相关。通常而言,当语料库较小时,应当使用简单的特征模板,以防止模型过拟合;当语料库较大时,则建议使用更多特征,以期更高的准确率。当特征模板固定时,往往是语料库越大,准确率越高。

8.6 自定义领域命名实体识别

以上我们接触的都是通用领域上的语料库,所含的命名实体仅限于人名、地名、机构名等。假设我们想要识别专门领域中的命名实体,这时,我们就要自定义领域的语料库了。

  1. 标注领域命名实体识别语料库

    首先我们需要收集一些文本, 作为标注语料库的原料,称为生语料。由于我们的目标是识别文本中的战斗机名称或型号,所以生语料的来源应当是些军事网站的报道。在实际工程中,求由客户提出,则应当由该客户提供生语料。语料的量级越大越好,一般最低不少于数千个句子。

    生语料准备就绪后,就可以开始标注了。对于命名实体识别语料库,若以词语和词性为特征的话,还需要标注分词边界和词性。不过我们不必从零开始标注,而可以在HanLP的标注基础上进行校正,这样工作量更小。

    样本标注了数千个之后,生语料就被标注成了熟语料。下面代码自动下载语料库。

  2. 训练领域模型

    选择感知机作为训练算法(自动下载 战斗机 语料库): plane_ner.py

    https://github.com/NLP-LOVE/Introduction-NLP/tree/master/code/ch08/plane_ner.py

    运行结果如下:

    下载 http://file.hankcs.com/corpus/plane-re.zip 到 /usr/local/lib/python3.7/site-packages/pyhanlp/static/data/test/plane-re.zip
    100.00%, 0 MB, 552 KB/s, 还有 0 分 0 秒
    米高扬/nrf 设计/v [米格/nr -/w 17/m PF/nx]/np :/w [米格/nr -/w 17/m]/np PF/n 型/k 战斗机/n 比/p [米格/nr -/w 17/m P/nx]/np 性能/n 更好/l 。/w
    [米格/nr -/w 阿帕奇/nrf -/w 666/m S/q]/np 横空出世/l 。/w

    这句话已经在语料库中出现过,能被正常识别并不意外。我们可以伪造一款“米格-阿帕奇-666S”战斗机,试试模型的繁华能力,发现依然能够正确识别。

8.7 GitHub

HanLP何晗--《自然语言处理入门》笔记:

https://github.com/NLP-LOVE/Introduction-NLP

项目持续更新中......

目录


章节
第 1 章:新手上路
第 2 章:词典分词
第 3 章:二元语法与中文分词
第 4 章:隐马尔可夫模型与序列标注
第 5 章:感知机分类与序列标注
第 6 章:条件随机场与序列标注
第 7 章:词性标注
第 8 章:命名实体识别
第 9 章:信息抽取
第 10 章:文本聚类
第 11 章:文本分类
第 12 章:依存句法分析
第 13 章:深度学习与自然语言处理

8.HanLP实现--命名实体识别的更多相关文章

  1. python调用hanlp进行命名实体识别

    本文分享自 6丁一的猫 的博客,主要是python调用hanlp进行命名实体识别的方法介绍.以下为分享的全文. 1.python与jdk版本位数一致 2.pip install jpype1(pyth ...

  2. hanlp进行命名实体识别

    需要安装jpype先,这个是python调用java库的桥梁. # -*- coding: utf-8 -*- """ Created on Thu May 10 09: ...

  3. HanLP分词命名实体提取详解

    HanLP分词命名实体提取详解   分享一篇大神的关于hanlp分词命名实体提取的经验文章,文章中分享的内容略有一段时间(使用的hanlp版本比较老),最新一版的hanlp已经出来了,也可以去看看新版 ...

  4. 自然语言18.2_NLTK命名实体识别

    QQ:231469242 欢迎nltk爱好者交流 http://blog.csdn.net/u010718606/article/details/50148261 NLTK中对于很多自然语言处理应用有 ...

  5. 基于条件随机场(CRF)的命名实体识别

    很久前做过一个命名实体识别的模块,现在有时间,记录一下. 一.要识别的对象 人名.地名.机构名 二.主要方法 1.使用CRF模型进行识别(识别对象都是最基础的序列,所以使用了好评率较高的序列识别算法C ...

  6. 神经网络结构在命名实体识别(NER)中的应用

    神经网络结构在命名实体识别(NER)中的应用 近年来,基于神经网络的深度学习方法在自然语言处理领域已经取得了不少进展.作为NLP领域的基础任务-命名实体识别(Named Entity Recognit ...

  7. 学习笔记CB007:分词、命名实体识别、词性标注、句法分析树

    中文分词把文本切分成词语,还可以反过来,把该拼一起的词再拼到一起,找到命名实体. 概率图模型条件随机场适用观测值条件下决定随机变量有有限个取值情况.给定观察序列X,某个特定标记序列Y概率,指数函数 e ...

  8. NLP入门(五)用深度学习实现命名实体识别(NER)

    前言   在文章:NLP入门(四)命名实体识别(NER)中,笔者介绍了两个实现命名实体识别的工具--NLTK和Stanford NLP.在本文中,我们将会学习到如何使用深度学习工具来自己一步步地实现N ...

  9. NLP入门(四)命名实体识别(NER)

      本文将会简单介绍自然语言处理(NLP)中的命名实体识别(NER).   命名实体识别(Named Entity Recognition,简称NER)是信息提取.问答系统.句法分析.机器翻译等应用领 ...

随机推荐

  1. k8s的简介以及搭建

    一:简介 1.什么是k8s? k8s是一个docker容器管理工具 它是一个全新的基于容器技术的分布式架构领先方案,是开源的容器集群管理系统. 在docker的基础上,为容器化的应用提供部署运行,资源 ...

  2. Django 多表、跨表、聚合、分组查询

    前期准备: 创建表 class Book(models.Model): title = models.CharField(max_length=32) price = models.DecimalFi ...

  3. Spring boot项目搭建及简单实例

    Spring boot项目搭建 Spring Boot 概述 Build Anything with Spring Boot:Spring Boot is the starting point for ...

  4. java中一些常考知识

    一.static的作用 static是修饰符,用于修饰成员变量(静态变量/类变量). static修饰的成员被所有对象共享. static优先于对象存在. static修饰的成员可以用类名.静态成员来 ...

  5. EFCore Database-first深入研究

    EFCore Database-first深入研究 使用Scaffold-DbContext从数据库生成实体 说明文档: 关于 Scaffold-DbContext 微软有官方说明文档 https:/ ...

  6. 【原创】Android adb错误“'adb' 不是内部或外部命令,也不是可运行的程序或批处理文件。”处理方法

    才刚刚接触Android没多久,现在使用adb命令的时候出现错误“'adb' 不是内部或外部命令,也不是可运行的程序或批处理文件.”,如下图所示: 这个问题一般有两种可能: 1.就是没有配置环境变量, ...

  7. 一键部署k8s 、docker 工具集——最新版本

  8. msi通过powershell安装、卸载

    function install_msi($url) { $telemetry = @{ DisplayName = "Telemetry Service"; filename = ...

  9. 【模板】2-SAT问题

    问题简述 有 \(n\) 个变量,每个变量可赋为 \(1\) 或 \(0\) 必须满足一些限制条件,如" \(a\) 为1 或 \(b\) 为0 " " \(a\) 为0 ...

  10. SSM框架整合中,不报错,数据库只能存ID进去问题解决

    嗯,这个错误其实不能算错误,是粗心造成的,在配置文件中对于传递的参数没有写#字符,直接写的的属性名.居然错了两次,哎!!! 嗯,还有一个问题,在动态SQL中,if标签中test属性中判断时,不能用大写 ...