简介
在本教程中,我们将介绍如何在Spacy Library中进行命名实体识别(NER)。我们将首先了解什么是NER以及为什么要使用它。然后,我们将通过Spacy中的一些NER的例子,看看如何访问实体注释和标签,并设置新的实体注释。
什么是命名实体?
命名实体是一个专有名词,它指的是一个特定的实体,如地点、人物、组织等。例如,在 "Elon Musk是Tesla的所有者 "这个句子中,Elon Musk和Tesla是命名实体。
这些是命名实体的更多例子 -
| 命名实体。 | 例子 | |
|---|---|---|
| 1 | 组织 | 微软, Facebook |
| 2 | 个人 | 拉斐尔-纳达尔, 纳尔逊-曼德拉 |
| 3 | 金钱 | 9百万美元,4克朗 |
| 4 | GPE | 印度、澳大利亚、东南亚 |
| 5 | 地点 | 珠穆朗玛峰、甘加河 |
| 6 | 日期 | 1987年5月9日,8月4日 |
| 7 | 时间 | 上午7点23分,凌晨3点40分 |
什么是命名实体识别(NER)?
在NLP中,命名实体识别或NER是识别命名实体的过程。NER在信息检索、内容分类、问答系统等领域非常有用。
命名实体识别的操作是一个两步过程 - i) 首先进行POS(语音部分)标记。 ii) 基于POS标记,从文本中提取命名实体。
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] :
- 还可以阅读-NLTK库中的命名实体识别(NER)新手指南
参考资料 -Spacy文档
The postNamed Entity Recognition (NER) in Spacy Libraryappeared first onMLK - Machine Learning Knowledge.