NLP算法-命名实体识别

article/2025/9/19 7:53:57

命名实体识别

  • 什么是命名实体识别?
    • NER 研究的命名实体
    • NER研究目前所遇到的问题
    • 命名实体识别的主要方法:
  • 基于条件随机场的命名实体识别
    • 常用的NER模型
      • 1、Spacy NER 模型
      • 2、斯坦福命名实体识别器
  • 中文人名识别
    • 中文姓名的构成规律
    • 姓名的上下文环境分析
    • Hanlp进行人名识别
    • demo
  • 地名识别
    • 中文地名构成
    • 基于 Hanlp 进行地名识别
    • demo
  • 参考书籍

什么是命名实体识别?

与自动分词、词性标注一样,命名实体识别也是自然语言处理的一个基础任务,是信息抽取、信息检索、机器翻译、问答系统等多种自然语言处理技术必不可少的组成部分。其目的是识别语料中人名、地名、组织机构名等命名实体。由于这些命名实体数量不断增加,通常不可能在词典中穷尽列出,且其构成方法具有各自的规律性,因此,通常把对这些词的识别在词汇形态处理(如汉语切分)任务中独立处理,称为命名实体识别( Named Entities Recognition,NER )

NER 研究的命名实体

NER 研究的命名实体一般分为3大类(实体类、时间类和数字类)7小类(人名、地名、组织机构名、时间、日期、货币和百分比)

NER研究目前所遇到的问题

命名实体识别当前并不是一个大热的研究课题,因为学术界部分认为这是一个已经解决了的问题,但是也有学者认为这个问题还没有得到很好地解决,原因主要有:

  1. 只是在有限的文本类型(主要是新闻语料)和实体类别(主要是人名、地名)中取得一定效果;
  2. 评测语料较小,易产生过拟合;
  3. NER 更加侧重于召回率,但在信息检索领域,高准确率更重要;
  4. 通用的识别多种类型的命名实体的系统性很差。

中文的命名实体识别与英文的相比,挑战更大,目前常遇到的问题有:

  1. 各类命名实体数量太多;
  2. 命名实体的构成规律复杂;
  3. 嵌套情况复杂;
  4. 长度不确定。

命名实体识别的主要方法:

命名实体识别目前主要有三类方法:

  1. 基于规则的命名实体识别:规则加词典是早期命名实体识别中最行之有效的方式。其依赖手工规则的系统,结合命名实体库,对每条规则进行权重赋值,然后通过实体与规则的相符情况来进行类型判断。当提取的规则能够较好反映语言现象时,该方法能明显优于其他方法。
  2. 基于统计的命名实体识别:与分词类似,目前主流的基于统计的命名实体识别方法有:隐马尔可夫模型、最大熵模型、条件随机场等。其主要思想是基于人工标注的语料,将命名实体识别任务作为序列标注问题来解决。基于统计的方法对语料库的依赖比较大,而可以用来建设和评估命名实体识别系统的大规模通用语料库又比较少,这是该方法的一大制约。
  3. 混合方法:自然语言处理并不完全是一个随机过程,单独使用基于统计的方法使状态搜索空间非常庞大,必须借助规则知识提前进行过滤修剪处理。目前几乎没有单纯使用统计模型而不使用规则知识的命名实体识别系统,在很多情况下是使用混合方法,结合规则和统计方法。

基于条件随机场的命名实体识别

条件随机场是在给定观察的标记序列下,计算整个标记序列的联合概率,而 HMM 则是在给定当前状态下,定义下一个状态的分布;条件随机场的具体定义为:

设X=(X 1 ,X 2 ,X 3 ,…,X n )和Y=(Y 1 ,Y 2 ,Y 3 ,…Y m )是联合随机变量,若随机变量 Y 构成一个无向图G=(V,E)表示的马尔可夫模型,则其条件概率分布P(Y∣X)称为条件随机场(简称 CRF),P(Yv∣X,Y w ,w  =v)=P(Y v∣X,Y w ,w−v)其中w−v表示图G=(V,E)中与结点 v 有边连接的所有节点,w 不等于 v 表示结点 v 以外的所有结点。

若在给定随机变量序列 X 的条件下,随机变量序列 Y 的条件概率分布P(Y∣X)构成条件随机场,且满足马尔可夫性,此时,称P(Y∣X)为线性链的条件随机场,简称 CRF,线性链条件随机场的结构图如图1所示。
图 1 线性链条件随机场

HMM 与 CRF 的联系区别如下表所示:

HMMCRF
概率图类型概率有向图概率无向图
模型类别生成模型判别模型
求解过程可能是局部最优可以全局最优
处理方面每个状态依赖上一个状态依赖于当前状态的周围节点状态

常用的NER模型

1、Spacy NER 模型

作为一个免费的开放源码库,Spacy 使 Python 中的高级自然语言处理(NLP)变得更加简单方便。

Spacy 为 python 中的命名实体识别提供了一个非常有效的统计系统,它可以将标签分配给连续的令牌组。它提供了一个默认模型,可以识别各种命名或数字实体,其中包括公司名称、位置、组织、产品名称等。除了这些默认实体之外,Spacy 还可以通过训练模型以用新的被训练示例更新,将使模型可以任意类添新的命名实体,进行识别。

2、斯坦福命名实体识别器

Stanford NER 是一个命名实体 Recognizer,用 Java 实现。它提供了一个默认的训练模型,主要用于识别组织、人员和位置等实体。除此之外,还提供针对不同语言和环境训练的各种模型。

斯坦福 NER 因为线性链条件随机场(CRF)序列模型已经在软件中实现,所以也被称为 CRF(条件随机场)分类器。我们可以使用自己的标注数据集为各种应用程序训练自己的自定义模型。


中文人名识别

中文姓名的构成规律

中文姓名一般由二字或三字组成,第一字为姓氏字(复姓为前两字),其后的一到两个汉字为名用字。统计表明,中文姓名在用字上也有一定规律:一方面某些字频频出现在姓名中,如在姓氏用字中,虽然姓氏辞典中列举了几千个姓氏字,但目前实际使用的不过几百个,而张、王、李、赵、刘5个姓竟占了32%;另一方面,某些字又从不被用作姓名用字,如最、仅、 紧、以、且等字。
根据这一特性,首先从一个含有1万多个人名的数据库中抽取303个姓用字和1047个名用字,形成系统的知识源;然后根据姓名的构成原则制定了一组姓名构成规则集,其中的规则以姓氏字驱动。由于中文姓名的构成是严格遵守构成规则的,因而本文将姓名构成规则定义为一组必须匹配的严格规则
在这里插入图片描述

姓名的上下文环境分析

中文姓名在文本中不是孤立存在的,其依存的上下文信息具有一定的特点:

  1. 前置信息:姓名的前端多冠有对人的职业、职务及与说话人的关系的称谓,如“这是上海市副市长刘振元日前在与上海旅游记者协会座谈时介绍的。”、“我和妻子秦润英都是双目失明的盲人。”等。在上述句子中的“市长”和“妻子”就是人名“刘振元”和“秦润英”的前置提示信息。

  2. 后置信息:姓名的后端多随有对此人的职业、职务及与说话人的关系的称谓,如“我国著名学者彭明教授访问前苏联时将书稿复印件全文带回。”,这里的“教授”就成为人名“彭明”的后置提示信息。

  3. 提示动词:某些动词多随在姓名和人称代词后,如“说、指出、告诉、通知…”,可充分利用这些词的提示作用。

Hanlp进行人名识别

HanLP 是由一系列模型与算法组成的工具包,目标是普及自然语言处理在生产环境中的应用HanLP 具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点;
提供词法分析(中文分词、词性标注、命名实体识别)、句法分析、文本分类和情感分析等功能。

HanLP 已经被广泛用于 Lucene、Solr、ElasticSearch、Hadoop、Android、Resin 等平台,有大量开源作者开发各种插件与拓展,并且被包装或移植到 Python、C#、R、JavaScript 等语言上去。 基于深度学习的 HanLP2.0 已于2020年初发布,面向下一个十年的前沿 NLP 技术,与 1.x 相辅相成,平行发展。

在 python 环境下使用 Hanlp 可以通过安装 pyhanlp 来导入:

    pip install pyhanlp # 安装 pyhanlp 库from pyhanlp import HanLP # 使用前导入 HanLP工具

在 Hanlp 工具中,主要使用的是 HMM 算法对人名进行识别,在对人名进行识别时,我们可以通过以下方式:

    text =input()segment = HanLP.newSegment().enableNameRecognize(True); # 构建人名识别器result = segment.seg(text) # 对text文本进行人名识别print(result) # 输出结果

比如,我们输入的文本为张三在吃苹果,输出的结果则为 [张三/nr, 在/p, 吃苹果/nz],人名识别的结果中,包含着各个词的识别结果,我们可以根据各个词的识别结果得知哪些词属于人名。常见标注的具体意义如下:

代码意义
nr人名
n名词
v动词
p介词
g语素词
h前接部分

demo

from pyhanlp import HanLP
text =input()
# 任务:完成对 text 文本的人名识别并输出结果
segment = HanLP.newSegment().enableNameRecognize(True); # 构建人名识别器
result = segment.seg(text) # 对text文本进行人名识别
print(result) # 输出结果

测试输入
张三今天没来上课

实际输出
[张三/nr, 今天/t, 没来/v, 上课/vi]


地名识别

中文地名构成

中文地名是指由汉字表示的中国地名及外国地名,从信息处理的角度出发,我们把中文地名定义为基本地名和复合地名构成的二级体系。基本地名是地名的最小成词单位,对应于人脑中存储地名的最小单位:它是人们对具有特定方位、地域范围的地理实体赋予的专有名称。作为地名的原子类型,基本地名满足指称性、非类指性(专门性)、词汇性、开放性等命名实体特征并具有指位性的功能特征。

典型的基本地名由“命名成分+通名”构成,命名成分是所指的标志符,不可缺省,如“江苏省”的“江苏”,“佛罗里达州”的“佛罗里达”;通名标识了所指单位的大小级别或类别,当命名成分已另有所指或为单字时常不可缺省,如“江苏路”中的“路”,“蓟县”的“县”。

基本地名通过合理组合形成复合地名。这里“合理”的意思是组合后形成的新地名有且只有一个所指,如“江苏省南京市”。复合地名是一个意义单位,相邻基本地名是否存在单向的领属关系是能否组合为一个复合地名的关键。因此,让计算机正确地识别、分析和理解复合地名有赖于基本地名的识别和基本地名之间关系的识别。
在这里插入图片描述

基于 Hanlp 进行地名识别

在 Hanlp 开发工具中,对地名识别主要采取的是 HMM 算法,在实际开发过程中,我们可以通过以下方式进行地名识别:

    text =input()segment = HanLP.newSegment().enablePlaceRecognize(True); # 构建地名识别器result = segment.seg(text) # 对text文本进行地名识别

比如,我们输入文本中国是个好地方,可以得到地名识别的结果为[中国/ns, 是/vshi, 个/q, 好/a, 地方/n],与人名识别类似,地名识别器根据对句子的理解为各个词都做了标注,其中标注为 ns 的词即为地名。

在 Hanlp 中,目前标准分词器都默认关闭了地名识别,用户需要手动开启;这是因为消耗性能,其实多数地名都收录在核心词典和用户自定义词典中;在生产环境中,能靠词典解决的问题就靠词典解决,这是最高效稳定的方法;对命名实体识别要求较高的用户可以使用感知机词法分析器。

demo

from pyhanlp import HanLP
text =input()
# 任务:完成对 text 文本的地名识别并输出结果
segment = HanLP.newSegment().enablePlaceRecognize(True); # 构建地名识别器
result = segment.seg(text) # 对text文本进行地名识别
print(result)

测试输入
中国是个好地方

实际输出
[中国/ns, 是/vshi, 个/q, 好/a, 地方/n]

注:ns即是识别为地名的名词


参考书籍

【1】自然语言处理
【2】命名实体识别(NER)综述


http://chatgpt.dhexx.cn/article/qeZtgaBn.shtml

相关文章

命名实体识别(NER)综述

本文是中文信息处理课程的期末考核大作业&#xff0c;对于自然语言处理主流任务的调研报告 ———————————————— 版权声明&#xff1a;本文为CSDN博主「<Running Snail>」的原创文章&#xff0c;遵循CC 4.0 BY-SA版权协议&#xff0c;转载请附上原文出处链接…

命名实体识别

转载https://blog.csdn.net/fendouaini/article/details/81137424 link 作者&#xff1a;Walker 目录 一&#xff0e;什么是命名实体识别 二&#xff0e;基于NLTK的命名实体识别 三&#xff0e;基于Stanford的NER 四&#xff0e;总结 一 、什么是命名实体识别&#xff1f; 命名…

NER入门:命名实体识别介绍及经验分享

每天给你送来NLP技术干货&#xff01; 来自&#xff1a;AI有温度 大家好&#xff0c;我是泰哥。本篇文章从什么是命名实体讲到为什么要做命名实体&#xff0c;然后讲到了NER数据处理及建模经验&#xff0c;对于做NER的同学&#xff0c;不论你是新手还是老手都非常值得一看&…

命名实体识别主要方法

命名实体识别主要方法 命名实体识别&#xff08;Named Entity Recognition&#xff0c;简称NER&#xff09;&#xff0c;又称作“专名识别”&#xff0c;是自然语言处理中的一项基础任务&#xff0c;应用范围非常广泛。命名实体一般指的是文本中具有特定意义或者指代性强的实体…

【实体识别】深入浅出讲解命名实体识别(介绍、常用算法)

本文收录于《深入浅出讲解自然语言处理》专栏&#xff0c;此专栏聚焦于自然语言处理领域的各大经典算法&#xff0c;将持续更新&#xff0c;欢迎大家订阅&#xff01;个人主页&#xff1a;有梦想的程序星空个人介绍&#xff1a;小编是人工智能领域硕士&#xff0c;全栈工程师&a…

命名实体识别(二)——基于条件随机场的命名实体识别

一、条件随机场 首先&#xff0c;我们看一下条件随机场的定义&#xff1a;在给定一组输入序列的条件下&#xff0c;另一组输出序列的条件概率分布模型。设X和Y是联合随机变量&#xff0c;若随机变量Y构成一个无向图G(V,E)表示的马尔科夫模型&#xff0c;则其条件概率分布P(Y|X…

正则表达式字符数字匹配

基础知识 数字&#xff1a;[0-9]或者[\d],不止一个就用 字母&#xff1a;[a-z]或者[A-Z]区分大小写 |&#xff1a;或的意思 工具 在线测试网站 拿不准的先可以测试一下&#xff0c;输入输出如下&#xff1a; 实战 改名字&#xff0c;其中注意正则式的小括号括起来的才可…

1.3 正则表达式【匹配数字】

数字匹配符 \d \d 可以配置 0到9的整数&#xff0c;等价于上一节 中的 [0-9] 。 测试实例 被匹配字符串 private static final String test1 "a12adf31d2tt"; 匹配公式1 匹配公式&#xff1a; String expression1 "\\d"; 匹配结果&#xff1a; 匹…

1.4 正则表达式【匹配非数字】

数字匹配符 \D \D 可以配置非数字&#xff0c;等价于上一节 中的 [^0-9] 。 测试实例 被匹配字符串 private static final String test1 "a12adf31d2tt"; 匹配公式3 匹配公式 String expression3 "\\D"; 匹配结果 匹配公式4 匹配公式 String exp…

1.6 正则表达式【匹配非字母和数字】

字母和数字匹配符 \W \W 可以配置 非字母和数字&#xff0c;等价于 [^a-zA-Z0-9] 。 测试实例 被匹配字符串 private static final String test1 "a12.a,df3.1d-2tt.*"; 匹配公式3 匹配公式 String expression3 "\\W"; 匹配结果 匹配公式4 匹配…

Python正则表达式匹配字符串中的数字

导读这篇文章主要介绍了Python正则表达式匹配字符串中的数字&#xff0c;本文通过实例代码给大家介绍的非常详细&#xff0c;具有一定的参考借鉴价值,需要的朋友可以参考下 1.使用“\d”匹配全数字 代码&#xff1a; import re zen "Arizona 479, 501, 870. Carliforn…

正则表达式匹配数字、字母和汉字等各类汇总

最近在开发中遇到一个需求是只匹配字母和汉字&#xff0c;于是在网上找了一个比较全的记录一下。日后再用~ 正则表达式来匹配规范一段文本中的特定种类字符&#xff0c;下面是对常用的正则匹配做了一个归纳整理。 1、匹配中文:[\u4e00-\u9fa5] 2、英文字母:[a-zA-Z] 3、数字…

类加载机制、类加载顺序

1 类加载顺序 Java 的类加载过程可以分为 5 个阶段&#xff1a;载入、验证、准备、解析和初始化。这 5 个阶段一般是顺序发生的&#xff0c;但在动态绑定的情况下&#xff0c;解析阶段发生在初始化阶段之后。 1&#xff09;Loading&#xff08;载入&#xff09; JVM 在该阶段…

深入理解——Java类加载机制

我们知道&#xff0c;我们写的java文件是不能直接运行的&#xff0c;我们可以在IDEA中右键文件名点击运行&#xff0c;这中间其实掺杂了一系列的复杂处理过程。这篇文章&#xff0c;我们只讨论我们的代码在运行之前的一个环节&#xff0c;叫做类的加载。按照我写文章的常规惯例…

理解类加载机制

一般来说&#xff0c;我们日常的开发都是在IDE上进行的&#xff0c;这能让我们将更多的注意力放在业务的处理上&#xff0c;但是久而久之我们就忘记了其底层的实现原理。这是一把双刃剑&#xff0c;我们看不到底层实现&#xff0c;但是当有某些问题出现的时候&#xff0c;也只有…

谈谈类加载机制

前言 类的加载其实就是将.class文件加载的jvm的内存之中。在JVM中并不是一次性把所有的文件都加载到&#xff0c;而是一步一步的&#xff0c;按照需要来加载。JVM启动时会通过不同的类加载器加载不同的类&#xff0c;而且同一个类也不可能由多个加载器来进行加载。正是这种分级…

【JVM】详解类加载机制

JVM的类加载机制 一、类的生命周期二、类加载的过程1.加载2.连接3.初始化 三、类加载器的介绍3.1 启动类加载器&#xff08;根类加载器/引导类加载器&#xff09;&#xff08;Bootstrap ClassLoader&#xff09;3.2 扩展类加载器3.3 系统类加载器 四、双亲委派模型4.1 双亲委派…

tomcat类加载机制

目录 一、JVM类加载机制简介 二、TOMCAT类加载机制 三、违反双亲委托机制 一、JVM类加载机制简介 简述JVM双亲委派模型&#xff1a; JVM中包括集中类加载器&#xff1a; BootStrapClassLoader 引导类加载器ExtClassLoader 扩展类加载器AppClassLoader 应用类加载器Custom…

JAVA类加载机制详解

上一篇文章我们简单说了一下类的创建过程&#xff0c;但是如果JVM需要加载类&#xff0c;会经过哪些具体的过程呢&#xff1f;下面我们就来谈一谈。 要了解加载类的过程&#xff0c;我们就必须要了解类加载器。 在很多初学者刚听到类加载器的时候觉得很高大上&#xff0c;其实…

Android 类加载机制

1.类加载机制 .java文件不是可执行的文件,需要先编译成.class文件才可以被虚拟机执行。而类加载就是指通过类加载器把.class文件加载到虚拟机的内存空间,具体来说是方法区。类通常是按需加载,即第一次使用该类时才加载。 Java与Android都是把类加载到虚拟机内存中,然后由…