从零开始学Python自然语言处理(六)—— 命名实体识别

浏览: 4658

前文传送门:

从零开始学自然语言处理(五)—— 词性标注

在之前的文章中我们使用了jieba进行分词和词性标注,遗憾的是,jieba无法进行命名实体识别。什么是命名实体识别呢?命名实体识别通常包括两部分:(1)实体边界识别;(2) 确定实体类别(人名、地名、机构名或其他)。英语中的命名实体具有比较明显的形式标志(即实体中的每个词的第一个字母要大写),所以实体边界识别相对容易,任务的重点是确定实体的类别。和英语相比,汉语命名实体识别任务更加复杂,而且相对于实体类别标注子任务,实体边界的识别更加困难。NER任务用于识别文本中的人名(PER)、地名(LOC)等具有特定意义的实体。非实体用O来表示。我们以人名来举例:

张  B-PER
伟  I-PER
和  O
小  B-PER
清  I-PER
结  O
婚  O
了。O

IOB是块标记的一种表示。B-表示开始(begin),I-表示内部(inner),O-表示外部(outer)NER其实是个分类任务,可称为序列标注任务,即将文本中的实体序列标注出来,给予不同的实体标签。通常,解决这类问题有三种方法:

(1)基于规则的方法,写一些语言学上语言结构的规则模板。

(2)基于统计的方法,常用的是隐马尔可夫(HMM)、条件随机场(CRF)模型和维特比(Viterbi)算法。这几个算法非常难理解,在之后的公众号文章中会通俗易懂讲解这些算法。关注公众号“数据科学杂谈”,等我们更新!

(3)基于神经网络的深度学习方法,例如LSTM。

我们使用 standford CoreNLP 进行命名实体识别(NER)(文末扫码关注公众号“数据科学杂谈”,公众号后台回复“NER”,即可获取相关安装文件,提供的是比较新的 stanford-corenlp-full-2018-10-05 ,因为自己去网站下载太慢了。。。)

(1)首先下载安装对应版本的JDK1.8及以上版本(https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

(2)然后下载Stanford CoreNLP文件,解压。(http://nlp.stanford.edu/software/stanford-corenlp-full-2016-10-31.zip

(3)处理中文文本数据还需要下载中文的模型jar文件,然后放到stanford-corenlp-full-2016-10-31根目录下即可(注意一定要下载这个文件哦,否则它默认是按英文来处理的)(http://nlp.stanford.edu/software/stanford-chinese-corenlp-2016-10-31-models.jar

(4)安装python相关包:pip install stanfordcorenlp这里推荐国内镜像源安装:pip install stanfordcorenlp -i https://pypi.tuna.tsinghua.edu.cn/simple

# 对中文进行实体识别
# 文件路径为解压你的 stanford-corenlp-full-2018-10-05 之后的文件夹,我改名为 stanfordnlp 了
from stanfordcorenlp import StanfordCoreNLP
zh_model = StanfordCoreNLP(r'E:\stanfordnlp', lang='zh')
s_zh = '我爱“数据科学杂谈”公众号!'
ner_zh = zh_model.ner(s_zh)
s_zh1 = '我爱上海!'
ner_zh1 = zh_model.ner(s_zh1)
print(ner_zh)
print(ner_zh1)

结果如下:

[('我', 'O'), ('爱', 'O'), ('“', 'O'), ('数据', 'O'), ('科学', 'O'), ('杂谈', 'O'), ('”', 'O'), ('公众号', 'O'), ('!', 'O')]

[('我爱', 'O'), ('上海', 'STATE_OR_PROVINCE'), ('!', 'O')]

# 对英文进行实体识别
from stanfordcorenlp import StanfordCoreNLP
eng_model = StanfordCoreNLP(r'E:\stanfordnlp',lang='en')
s_eng = 'I love natural language processing technology!'
ner_eng = eng_model.ner(s_eng)
s_eng1 = 'I love Shanghai!'
ner_eng1 = eng_model.ner(s_eng1)
print(ner_eng)
print(ner_eng1)

结果如下:
[('I', 'O'), ('love', 'O'), ('natural', 'O'), ('language', 'O'), ('processing', 'O'), ('technology', 'O'), ('!', 'O')]
[('I', 'O'), ('love', 'O'), ('Shanghai', 'CITY'), ('!', 'O')]
文末扫码关注公众号“数据科学杂谈”,公众号后台回复“NER”,即可获取本文所需相关安装文件~

扫码下图关注我们不会让你失望!

image.png

推荐 0
本文由 ID王大伟 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册