我正在编写一段代码,用于在Spacy的NER引擎中训练自定义实体。我一直在理解在线教程中的一小部分代码。这是教程的链接。以下是代码,我一直在理解注释# add labels
下的两个for循环。我是蟒蛇的新手。
import spacy
################### Train Spacy NER.###########
def train_spacy():
TRAIN_DATA = convert_dataturks_to_spacy("dataturks_downloaded.json");
nlp = spacy.blank('en') # create blank Language class
# create the built-in pipeline components and add them to the pipeline
# nlp.create_pipe works for built-ins that are registered with spaCy
if 'ner' not in nlp.pipe_names:
ner = nlp.create_pipe('ner')
nlp.add_pipe(ner, last=True)
# add labels
for _, annotations in TRAIN_DATA:
for ent in annotations.get('entities'):
ner.add_label(ent[2])
显然,这个for循环是在向NER添加自定义标签。我的问题是:;
- 什么是"注释",它的数据类型是什么?(我在谷歌上搜索"spacy annotation",但找不到答案(
- 为什么在'in',('_'和'annotation'(的左边有两个变量
- ent[2]返回什么?2号位置有什么
您的问题大多可以通过理解函数convert_dataturks_to_spacy
来回答。这方面的代码与下面的教程在同一个repo中。
- 函数返回元组列表,其中每个元组由
(text, {"entities" : entities})
组成。CCD_ 4是每个元组的第二个元素 - 从输出中分配多个变量称为元组拆包。基本上,for循环是指对于训练数据中的每个元组,将元组的第一个元素分配给
_
,将第二个元素分配到annotations
,然后做一些事情。在python中,_
经常被用作丢弃变量,即代码中其他地方没有使用但数据中存在的变量 ent[2]
是被标记的实体的标签。从代码来看,dataturks中的实体是一个包含3个元素的元组——字符串中的起始位置、字符串中的结束位置和标签