首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用spaCy创建新实体并仅从关键字列表中学习

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

Stack Overflow用户
提问于 2018-05-29 08:58:35
回答 1查看 7.9K关注 0票数 14

我试图使用spaCy创建一个新的实体分类“物种”,并列出一个物种名称,例如,他能找到这里吗?

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

我创建了下面的培训数据,如下所示:

代码语言:javascript
运行
复制
TRAIN_DATA = [('Bombina',{'entities':[(0,6,'SPECIES')]}),
 ('Dermaptera',{'entities':[(0,9,'SPECIES')]}),
  .... 
]

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

( 0,6,“物种”)

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

代码语言:javascript
运行
复制
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的新手,请告诉我我做得对不对。以及为什么我的尝试失败了(当我运行它时,它抛出一个错误)。

更新

我只想将关键字提供给培训模型的原因是,理想情况下,我希望模型首先学习那些关键词,一旦它识别出包含关键字的上下文,它就会学习相关的上下文,从而增强当前的模型。

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

谢谢,凯蒂

EN

回答 1

Stack Overflow用户

发布于 2018-05-30 11:14:37

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

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

虽然有其他的方法来训练模型没有或没有标签的例子,最直接的策略收集训练数据来训练你的spaCy模型是.标注培训数据。但是,您可以使用一些技巧来减轻这种痛苦:

  • 从物种列表开始,并使用PhraseMatcher在文档中找到它们。对于每个匹配,您将得到一个Span对象,因此您可以提取span在文本中的开始和结束位置。这很容易让您自动创建一堆示例。您可以找到关于这个这里的更多细节。
  • 使用字向量查找更多与您要查找的实体相似的术语,因此您可以使用上述方法在文本中搜索更多的示例。我不确定spaCy的矢量模型会对你的物种有多大的帮助,因为这些术语是非常具体的。因此,如果你有一个包含物种的大量原始文本,你可能需要训练你自己的载体。
  • 使用标签或数据注释工具。有一些像布拉特这样的开源解决方案,或者,一旦您对注释和培训变得更加认真,您可能还想看看我们的注释工具神童,这是一个与spaCy无缝集成的现代商业解决方案(免责声明:我是spaCy维护人员之一)。
票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50580262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档