kat*_* lu 11 python nlp machine-learning python-3.x spacy
我正在尝试使用spaCy创建一个新的实体分类'Species',其中包含物种名称列表,例如,他可以在这里找到.
我从这个spaCy教程(这里是 Github代码)中找到了一个培训新实体类型的教程.然而,问题是,我不想为每个物种名称手动创建一个句子,因为它会非常耗时.
我在下面创建了训练数据,如下所示:
TRAIN_DATA = [('Bombina',{'entities':[(0,6,'SPECIES')]}),
('Dermaptera',{'entities':[(0,9,'SPECIES')]}),
....
]
Run Code Online (Sandbox Code Playgroud)
我创建训练集的方式是:不是提供完整的句子和匹配实体的位置,而是仅提供每个物种的名称,并以编程方式生成开始和结束索引:
[(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)
Run Code Online (Sandbox Code Playgroud)
我是NLP和spaCy的新手,如果我做得不对,请告诉我.为什么我的尝试没有通过培训(当我运行它时,它会抛出错误).
[UPDATE]
我想仅将关键字提供给训练模型的原因是,理想情况下,我希望模型首先学习这些关键词,一旦识别出包含关键词的上下文,它就会学习相关的上下文,因此,增强现有模式.
乍一看,它更像是正则表达式.但随着越来越多的数据输入,该模型将不断学习,并最终能够识别原始训练集中以前不存在的新物种名称.
谢谢,凯蒂
Ine*_*ani 16
训练命名实体识别器SPECIES在文本中进行检测的优势在于,模型不仅能够识别您的示例,还能够在上下文中概括和识别其他物种.如果您只想找到一组固定的术语而不是更多,那么更简单,基于规则的方法可能对您更有效.你可以在这里找到这方面的例子和细节.
如果您希望模型在上下文中概括和识别实体类型,则还必须在上下文中显示实体的示例.这是您的训练示例中的问题:您只显示模型单个单词,而不是包含单词的句子.为了获得良好的结果,您正在训练模型的数据需要尽可能接近您以后要分析的数据.
虽然还有其他方法可以在没有或没有标记示例的情况下训练模型,但收集训练数据以训练spaCy模型的最直接的策略是...标记训练数据.但是,您可以使用一些技巧来减轻痛苦:
从物种列表开始,然后使用Matcher或PhraseMatcher在文档中找到它们.对于每个匹配,您将获得一个Span对象,因此您可以在文本中提取跨度的开始和结束位置.这很容易让您自动创建一堆示例.你可以在这里找到更多细节.
使用单词向量查找与您要查找的实体更相似的术语,因此您可以使用上述方法获得更多可在文本中搜索的示例.我不确定spaCy的矢量模型将如何为您的物种做什么,因为这些术语非常具体.因此,如果您有大量包含物种的原始文本,您可能需要训练自己的向量.
使用标签或数据注释工具.有像Brat这样的开源解决方案,或者,一旦你对注释和培训越来越认真,你可能还想看看我们的注释工具Prodigy,这是一个与spaCy无缝集成的现代商业解决方案(免责声明:I是其中一位spaCy维护者.