Spacy图书馆的命名实体识别(NER)

1,598 阅读4分钟

简介

在本教程中,我们将介绍如何在Spacy Library中进行命名实体识别(NER)。我们将首先了解什么是NER以及为什么要使用它。然后,我们将通过Spacy中的一些NER的例子,看看如何访问实体注释和标签,并设置新的实体注释。

什么是命名实体?

Spacy Named Entity Recognition NER

命名实体是一个专有名词,它指的是一个特定的实体,如地点、人物、组织等。例如,在 "Elon Musk是Tesla的所有者 "这个句子中,Elon Musk和Tesla是命名实体。

这些是命名实体的更多例子 -

命名实体。例子
1组织微软, Facebook
2个人拉斐尔-纳达尔, 纳尔逊-曼德拉
3金钱9百万美元,4克朗
4GPE印度、澳大利亚、东南亚
5地点珠穆朗玛峰、甘加河
6日期1987年5月9日,8月4日
7时间上午7点23分,凌晨3点40分

什么是命名实体识别(NER)?

在NLP中,命名实体识别或NER是识别命名实体的过程。NER在信息检索、内容分类、问答系统等领域非常有用。

命名实体识别的操作是一个两步过程 - i) 首先进行POS(语音部分)标记。 ii) 基于POS标记,从文本中提取命名实体。

NER-Example

Spacy中的命名实体识别(NER)

在Spacy中进行命名实体识别是非常快速和简单的。Spacy库可以识别的标签或命名实体包括公司、地点、组织和产品。Spacy的模型是预先训练好的,可以识别这些实体,但是,我们也可以在实体识别系统中加入我们自己的任意类别,并用新的例子来更新这个模型。

例子1

在下面这个Spacy NER的例子中,我们首先创建一个Spacy对象,用样本文本将其实例化,并将其分配给doc变量。通过对doc.ent对象的迭代,可以简单地提取命名实体。在每次迭代中,实体文本用ent.text打印,实体标签用ent.label_打印。

In [1]:

import

[输出] :

NASA ORG
Elon Musk PERSON
$2.9 billion MONEY

例2

这个例子也和上面的例子类似,只是用了不同的样本文本。

在[2]中。

import

[输出] :

Warren Edward Buffett PERSON
American NORP
Berkshire Hathaway PERSON

Spacy NER 列表

我们可以通过使用nlp.pipe_labels['ner']获得Spacy中的ner列表。

在 [2] 中

import spacy

nlp = spacy.load("en_core_web_sm")
ner_lst = nlp.pipe_labels['ner']

print(len(ner_lst))
print(ner_lst)

[输出] :

18
['CARDINAL', 'DATE', 'EVENT', 'FAC', 'GPE', 'LANGUAGE', 'LAW', 'LOC', 'MONEY', 'NORP', 'ORDINAL', 'ORG', 'PERCENT', 'PERSON', 'PRODUCT', 'QUANTITY', 'TIME', 'WORK_OF_ART']

访问实体注解和标签

在Spacy中访问实体注释的标准方法是使用doc.ents,它返回一个包含doc中所有实体的元组。实体类型可以通过使用ent.label和ent.label_作为哈希值或作为字符串类型来访问。通过使用doc.ent,我们可以得到一堆关于实体的信息,例如

  • 通过使用ent.text获得实体文本。
  • 通过使用ent.start_char和ent.end_char获得实体的起始和结束字符。
  • 通过使用ent.start获得实体的索引。
  • 通过使用ent.entid生成实体类型的id。
  • 使用ent.vector_norm生成实体的向量规范。

在[3]中。

import

[Out] :

Apple 0 5 ORG 0  383 21.796299
U.K. 27 31 GPE 5  384 21.744804
$1 billion 44 54 MONEY 8  394 17.723335

然而,我们也可以通过使用token.ent_iob和token.ent_type属性来访问实体注释。token.ent_iob返回三个标签'B'、'I'和'O'。'B'表示该标记开始于一个实体,'I'表示它在一个实体内,'O'表示它在一个实体外,即没有为该标记设置实体标签,将返回一个空字符串""。

In[5] :

import spacy

nlp = spacy.load("en_core_web_sm")
doc = nlp("New York is the most populous city in the United States")

for token in doc:
    print(token.text, token.ent_iob_, token.ent_type_)

[Out] :

New B GPE
York I GPE
is O 
the O 
most O 
populous O 
city O 
in O 
the B GPE
United I GPE
States I GPE

在Spacy中添加新的命名实体

Spacy库提供了一个在文档级别设置实体注释的功能。然而,这不能直接写入token.ent_iob或token.ent_type属性中。设置实体可以通过下面列出的各种方法完成。

方法1 :

创建一个新的实体作为span,并通过使用doc.set_ents函数将其分配给doc.ent。请记住,我们只能设置那些以前没有定义过的实体。否则会导致 "试图设置冲突的doc.ent "的错误。

在下面的例子中,默认的Spacy模型并不承认Facebook是一个实体。然后我们为Facebook实体创建了一个新的跨度,随后它就开始识别它了。

在[21]。

import

[Out] :

Before :  [('Mark Zuckerberg', 24, 39, 'PERSON'), ('Harvard College', 68, 83, 'ORG')]
After :  [('facebook', 0, 1, 'ORG'), ('Mark Zuckerberg', 4, 6, 'PERSON'), ('Harvard College', 11, 13, 'ORG')]

方法2:

我们创建了一个新的实体跨度列表,并将其与原来的doc.ents列表连接起来。

在[18]中。

import

[输出] :

Before :  [('Mark Zuckerberg', 24, 39, 'PERSON'), ('Harvard College', 68, 83, 'ORG')]
After :  [('facebook', 0, 1, 'ORG'), ('Mark Zuckerberg', 4, 6, 'PERSON'), ('Harvard College', 11, 13, 'ORG')]

方法3。

我们创建了一个大小为(doc的长度*2)的NumPy零数组来存储实体iob和实体类型,并分配新的实体。在这个例子中,我们将 "伦敦 "和 "英国 "指定为 "GPE"。

在[23]。

import

[Out] :

Before : []
After : [('London', 0, 1, 'GPE'), ('U.K.', 7, 8, 'GPE')]

在Spacy中实现命名实体的可视化

我们可以使用spacy库提供的dispacy函数来显示doc对象的实体的漂亮的可视化。

在[19]中。

import

[Out] :

Spacy NER Visualization

参考资料 -Spacy文档

The postNamed Entity Recognition (NER) in Spacy Libraryappeared first onMLK - Machine Learning Knowledge.