命名实体识别

article/2025/9/19 7:55:14

转载https://blog.csdn.net/fendouaini/article/details/81137424
link

作者:Walker

目录

    一.什么是命名实体识别

    二.基于NLTK的命名实体识别

    三.基于Stanford的NER

    四.总结

一 、什么是命名实体识别?

命名实体识别(Named Entity Recognition,简称NER),又称作“专名识别”,是指识别文本中具有特定意义的实体,主要包括人名、地名、机构名、专有名词等。通常包括两部分:(1)实体边界识别;(2) 确定实体类别(人名、地名、机构名或其他)。

命名实体识别通常是知识挖掘、信息抽取的第一步,被广泛应用在自然语言处理领域。接下来,我们将介绍常用的两种命名实体识别的方法。

二 、基于NLTK的命名实体识别:

NLTK:由宾夕法尼亚大学计算机和信息科学使用python语言实现的一种自然语言工具包,其收集的大量公开数据集、模型上提供了全面、易用的接口,涵盖了分词、词性标注(Part-Of-Speech tag, POS-tag)、命名实体识别(Named Entity Recognition, NER)、句法分析(Syntactic Parse)等各项NLP领域的功能。

使用前需要先下载NLTK,下载地址为:http://pypi.python.org/pypi/nltk,安装完成后,在python环境下输入import nltk测试是否安装成功,然后输入nltk.download()下载nltk所需要的数据包,完成安装。

Python代码实现(注意文件的编码格式为utf-8无BOM格式):

-- coding: utf-8 --

import sys

reload(sys)

sys.setdefaultencoding(‘utf8’)    #让cmd识别正确的编码

import nltk

newfile = open(‘news.txt’)

text = newfile.read()  #读取文件

tokens = nltk.word_tokenize(text)  #分词

tagged = nltk.pos_tag(tokens)  #词性标注

entities = nltk.chunk.ne_chunk(tagged)  #命名实体识别

a1=str(entities) #将文件转换为字符串

file_object = open(‘out.txt’, ‘w’)

file_object.write(a1)   #写入到文件中

file_object.close( )

print entities

 

具体的方法可参考NLTK官网介绍:http://www.nltk.org/,输出的结果为:

>>> entities = nltk.chunk.ne_chunk(tagged)

>>> entities

Tree(‘S’, [(‘At’, ‘IN’), (‘eight’, ‘CD’), (“o’clock”, ‘JJ’),

(‘on’, ‘IN’), (‘Thursday’, ‘NNP’), (‘morning’, ‘NN’),

Tree(‘PERSON’, [(‘Arthur’, ‘NNP’)]),

(‘did’, ‘VBD’), (“n’t”, ‘RB’), (‘feel’, ‘VB’),

(‘very’, ‘RB’), (‘good’, ‘JJ’), (‘.’, ‘.’)])

 

当然为了方便查看,我们可以以树结构的形式把结果绘制出来:

>>> from nltk.corpus import treebank

>>> t = treebank.parsed_sents(‘wsj_0001.mrg’)[0]

>>> t.draw()

 

三 、基于Stanford的NER:

Stanford Named Entity Recognizer (NER)是斯坦福大学自然语言研究小组发布的成果之一,主页是:http://nlp.stanford.edu/software/CRF-NER.shtml。Stanford NER 是一个Java实现的命名实体识别(以下简称NER))程序。NER将文本中的实体按类标记出来,例如人名,公司名,地区,基因和蛋白质的名字等。

NER基于一个训练而得的Model(模型可识别出 Time, Location, Organization, Person, Money, Percent, Date)七类属性,其用于训练的数据即大量人工标记好的文本,理论上用于训练的数据量越大,NER的识别效果就越好。

因为原始的NER是基于java实现的,所以在使用Python编程之前,要确保自己电脑上已经安装了jar1.8的环境(否则会报关于Socket的错误)。

然后我们使用Pyner使用python语言实现命名实体识别。下载地址为:https://github.com/dat/pyner

安装Pyner:解压下载的Pyner,命令行中将工作目录切换到Pyner文件夹下, 输入命令 :python setup.py install 完成安装.

接下来,还需要下载StanfordNER工具包,下载地址为:http://nlp.stanford.edu/software/stanford-ner-2014-01-04.zip,然后在解压后的目录打开cmd命令窗体,执行,java -mx1000m -cp stanford-ner.jar edu.stanford.nlp.ie.NERServer -loadClassifier classifiers/english.muc.7class.distsim.crf.ser.gz -port 8080 -outputFormat inlineXML,直到结果为:Loading classifier from classifiers/english.muc.7class.distsim.crf.ser.gz … done [1.2 sec].

以上操作是因为斯坦福的命名实体识别是基于java的socket写的,所以必要保证有一个窗题与我们执行的命令通信。关于java的socket编程,可以参考以下文章:http://www.cnblogs.com/rond/p/3565113.html

最后,我们终于可以使用python编程实现NER了:

import ner

import sys

import nltk

reload(sys)

sys.setdefaultencoding(‘utf8’)

newfile = open(‘news.txt’)

text = newfile.read()

tagger = ner.SocketNER(host=’localhost’, port=8080)#socket编程

result=tagger.get_entities(text)   #stanford实现NER

a1=str(result)

file_object = open(‘outfile.txt’, ‘w’)

file_object.write(a1)

file_object.close( )

print result

 

以上是我对文本文件进行的测试,官网的案例https://github.com/dat/pyner运行结果为:

>>> import ner

>>> tagger = ner.SocketNER(host=’localhost’, port=8080)

>>> tagger.get_entities(“University of California is located in California, United States”)

{‘LOCATION’: [‘California’, ‘United States’],

‘ORGANIZATION’: [‘University of California’]}

四 、两种方法的比较:

我拿同一个文本文件用两种方法进行命名实体识别,结果如下:

图1 NLTK运行结果

图2 Stanford方式运行结果

比较两种方式,我们可以发现,NLTK下的命名实体识别更加倾向于分词和词性标准,虽然它也会将组织名,人名,地名等标注出来,但由于它把文件中的谓语,宾语等成分也标注了出来,造成了输出文本的冗余性,不利于读者很好的识别命名实体,需要我们对文本做进一步处理。NLTK下的命名实体识别的有点时,可以使用NLTK下的treebank包将文本绘制为树形,使结果更加清晰易读。相较而言,我更加倾向于Stanford的命名实体识别,它可以把Time, Location, Organization, Person, Money, Percent, Date七类实体很清晰的标注出来,而没有多余的词性。但由于NER是基于java开发的,所以在用python实现时可能由于jar包或是路径问题出现很多bug。

以上就是关于NLTK和stanford对英文文本的命名实体识别,关于自然语言处理中文文件,我们可以考虑jieba分词:https://www.oschina.net/p/jieba。

【总结】:命名实体识别是构建知识图谱、进行自然语言处理问题的第一步,本文总结了现有的处理命名实体识别问题的两种方法,你掌握了吗?


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

相关文章

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

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

命名实体识别主要方法

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

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

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

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

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

正则表达式字符数字匹配

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

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

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

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

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

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

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

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

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

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

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

类加载机制、类加载顺序

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

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

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

理解类加载机制

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

谈谈类加载机制

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

【JVM】详解类加载机制

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

tomcat类加载机制

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

JAVA类加载机制详解

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

Android 类加载机制

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

面试题:请介绍 JVM 类加载机制

JVM 类加载机制 Java 代码执行流程类的生命周期加载验证准备解析初始化clinit 和 init 方法 类加载的时机被动引用 类加载器双亲委派机制 我们在前面分析JVM架构解析的时候,简单介绍了 Java 类加载机制,本文带大家深入分析一下。 Java 代码执行流程 根据…

Tomcat 的类加载机制

在前面 Java虚拟机:对象创建过程与类加载机制、双亲委派模型 文章中,我们介绍了 JVM 的类加载机制以及双亲委派模型,双亲委派模型的类加载过程主要分为以下几个步骤: (1)初始化 ClassLoader 时需要指定自己…