如何使用spaCy创建新实体并仅从关键字列表中学习



我正在尝试使用 spaCy 创建一个带有物种名称列表的新实体分类"物种",例如他可以在这里找到。

我从这个spaCy教程中找到了一个训练新实体类型的教程(Github代码在这里(。但是,问题是,我不想为每个物种名称手动创建一个句子,因为这非常耗时。

我在下面创建了训练数据,如下所示:

TRAIN_DATA = [('Bombina',{'entities':[(0,6,'SPECIES')]}),
('Dermaptera',{'entities':[(0,9,'SPECIES')]}),
.... 
]

我创建训练集的方式是:我只提供每个物种的名称,而不是提供完整的句子和匹配实体的位置,并且开始和结束索引以编程方式生成:

[( 0, 6, '物种' (]

[( 0, 9, '物种' (]

下面的训练代码是我用来训练模型的代码。(从上面的超链接复制的代码(

nlp = spacy.blank('en')  # create blank Language class
# Add entity recognizer to model if it's not in 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) 
# otherwise, get it, so we can add labels to it 
else: 
ner = nlp.get_pipe('ner') 
ner.add_label(LABEL)   # add new entity label to entity recognizer

if model is None: 
optimizer = nlp.begin_training() 
else: 
# Note that 'begin_training' initializes the models, so it'll zero out 
# existing entity types. 
optimizer = nlp.entity.create_optimizer() 
# get names of other pipes to disable them during training 
other_pipes = [pipe for pipe in nlp.pipe_names if pipe != 'ner'] 
with nlp.disable_pipes(*other_pipes):  # only train NER 
for itn in range(n_iter): 
random.shuffle(TRAIN_DATA) 
losses = {} 
for text, annotations in TRAIN_DATA: 
nlp.update([text], [annotations], sgd=optimizer, drop=0.35,  losses=losses) 
print(losses) 

我是 NLP 和 spaCy 的新手,请让我知道我是否正确。以及为什么我的尝试未能通过训练(当我运行它时,它会抛出错误(。

<小时 />

[更新]

我只想将关键字提供给训练模型的原因是,理想情况下,我希望模型首先学习这些关键字,一旦它确定了包含关键字的上下文,它将学习关联的上下文,从而增强当前模型。

乍一看,它更像是正则表达式。但随着越来越多的数据输入,模型将不断学习,并最终能够识别以前在原始训练集中不存在的新物种名称。

<小时 />

谢谢, 凯蒂

训练命名实体识别器以检测文本中的SPECIES的优点是,该模型不仅能够识别您的示例,而且还能够在上下文中概括和识别其他物种。如果您只想查找一组固定的术语,而不是更多,则更简单的基于规则的方法可能更适合您。您可以在此处找到这方面的示例和详细信息。

如果确实希望模型在上下文中概括和识别实体类型,则还必须向它显示上下文中的实体示例。这就是您的训练示例目前的问题:您只显示模型单个单词,而不是包含单词的句子。为了获得良好的结果,训练模型时使用的数据需要尽可能接近以后要分析的数据。

虽然还有其他方法可以训练没有标记示例或标记较少的示例的模型,但收集训练数据以训练 spaCy 模型的最直接策略是......标记训练数据。但是,您可以使用一些技巧来减轻痛苦:

  • 从物种列表开始,然后使用MatcherPhraseMatcher在文档中查找它们。对于每个匹配项,您将获得一个Span对象,因此您可以在文本中提取跨度的开始和结束位置。这可以轻松地让您自动创建一堆示例。您可以在此处找到更多详细信息。

  • 使用
  • 词向量查找与要查找的实体更相似的术语,以便使用上述方法获得更多可以在文本中搜索的示例。我不确定spaCy的矢量模型对你的物种有什么影响,因为这些术语非常具体。因此,如果你有一个包含物种的大量原始文本语料库,你可能必须训练你自己的向量。

  • 使用标注或数据注释工具。有像Brat这样的开源解决方案,或者,一旦你对注释和培训更加认真,你可能还想看看我们的注释工具Prodigy,这是一个与spaCy无缝集成的现代商业解决方案(免责声明:我是spaCy维护者之一(。

最新更新