命名实体识别的两种方法

简介: 本文主要介绍自然语言处理中的经典问题——命名实体识别的两种方法。

目录

一.什么是命名实体识别
二.基于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

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

原文发布时间为:2018-07-20
本文作者:Walker
本文来自云栖社区合作伙伴“磐创AI”,了解相关信息可以关注“磐创AI”。

相关文章
|
机器学习/深度学习 数据可视化 TensorFlow
TensorFlow的可视化工具:TensorBoard的使用
【4月更文挑战第17天】TensorBoard是TensorFlow的官方可视化工具,用于展示和分析模型训练过程、结构和数据。它包括标量、图像、音频、模型图和直方图等多种可视化功能。通过`tf.summary`记录数据,使用`tensorboard --logdir`启动。高级功能包括自定义仪表板、嵌入和插件,助力深度学习的调试与优化。
|
JavaScript 前端开发
layui用layer.open打开子页面并获取子页面的ueditor富文本编辑器的内容
该内容描述了一个Web应用的交互流程,其中父页面通过调用子页面的JavaScript函数来获取富文本编辑器的内容。子页面包含一个富文本编辑器和一个`callbackdata`函数,用于返回编辑器的文本内容。父页面使用`layer.open`打开子页面作为弹窗,并在用户点击提交时,访问子页面的`callbackdata`获取编辑器内容,同时检查其他表单字段,如类型、标题等是否为空,以确保数据完整。
1130 0
|
机器学习/深度学习 人工智能 自然语言处理
解码语言:命名实体识别(NER)技术
解码语言:命名实体识别(NER)技术
解码语言:命名实体识别(NER)技术
|
7月前
|
前端开发 JavaScript Java
智能客服系统的技术栈解析-唯一客服系统技术架构优势
“唯一客服系统”采用 Vue.js 2.x + ElementUI 构建前端,实现响应式界面,支持多端适配;后端基于 Golang + Gin + GORM,具备高性能与高并发处理能力。系统支持私有化部署,提供灵活定制、AI 扩展能力,技术栈简洁易维护,兼顾开发者友好与企业级应用需求。
335 1
|
4月前
|
机器学习/深度学习 存储 自然语言处理
18_TF-IDF向量表示:从词频到文档相似度
在自然语言处理(NLP)领域,如何将非结构化的文本数据转换为计算机可以处理的数值形式,是一个基础性的关键问题。词袋模型(Bag of Words, BoW)作为一种简单直接的文本表示方法,虽然能够捕获文本中的词频信息,但无法区分不同词的重要性。为了解决这个问题,TF-IDF(Term Frequency-Inverse Document Frequency)向量表示方法应运而生,它通过评估词语对文档集合中某个文档的重要程度,为文本分析提供了更准确的数值表示。
|
机器学习/深度学习 自然语言处理 监控
命名实体识别(Named Entity Recognition, NER)
命名实体识别(Named Entity Recognition, NER)
703 7
|
机器学习/深度学习 自然语言处理 监控
命名实体识别(Named Entity Recognition, NER)
命名实体识别(NER)是自然语言处理的重要任务,旨在从文本中识别并分类特定实体,如人名、地点、组织等。通过BIO等标注模式,利用HMM、CRF及深度学习模型如RNN、LSTM、Transformer等进行实体识别。预训练模型如BERT显著提升了NER的性能。NER广泛应用于新闻分析、生物医学等领域,是信息提取、知识图谱构建等任务的基础。
1758 3
|
12月前
|
人工智能 安全 Java
片段式代码VS完整工程生成:飞算JavaAI如何让开发者告别碎片化开发?
飞算 JavaAI 是一款基于大模型的智能开发平台,旨在解决传统开发中的“碎片化困局”。它通过“智能引导开发五步法”,从需求分析到工程代码交付实现全链路智能化。不仅能生成高质量代码片段,更能直接输出可运行的完整工程,帮助开发者摆脱重复性劳动,专注于系统架构设计和业务创新,推动软件开发从“体力劳动”向“脑力创造”转变,开启高效开发新时代。
|
SQL 关系型数据库 MySQL
详解 pypika 模块:SQL 语句生成器,让你再也不用为拼接 SQL 语句而发愁
详解 pypika 模块:SQL 语句生成器,让你再也不用为拼接 SQL 语句而发愁
913 4
|
JavaScript 前端开发 安全
XSS Challenges 通关解析
XSS Challenges 通关解析