代码之家  ›  专栏  ›  技术社区  ›  Shadi

命名实体识别大写问题

  •  0
  • Shadi  · 技术社区  · 8 年前

    我最近把我在spacy中为NER使用的模型从 en\u core\u web\u md xx\u ent\u wiki\u sm .

    我注意到,新模型总是将完整的大写单词识别为组织,例如new JERSEY或new YORK。我将能够提供训练数据来重新训练模型,尽管这将非常耗时。然而,我不确定该模型是否会放弃大写词是组织的假设,或者是否会保留该假设并为其创建一些例外。它甚至可能了解到,每个字母少于5个的全大写单词都可能是一个组织,而所有字母都不是?我只是不知道训练会对模型产生怎样的影响

    en_core_web_md似乎可以很好地处理首字母缩略词,而忽略了诸如newjersey之类的词。然而,对于我的用例,xx\u ent\u wiki\u sm的整体性能更好

    我这样问是因为这样的假设仍然非常有用,因为它允许我们识别缩写词,例如IBM作为一个组织。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Ines Montani    8 年前

    这个 xx_ent_wiki_sm 模型是在维基百科上训练的,所以它非常倾向于维基百科所考虑的内容和实体,以及数据中的常见内容。(由于第一人称的句子在维基百科上非常罕见,因此它也经常将“I”视为一个实体。)因此,用更多的例子进行后训练绝对是一个好策略,而且你试图做的事情听起来是可行的。

    防止模型“忘记”大写实体的最佳方法是始终包括模型先前在训练数据中正确识别的实体的示例(请参阅: "catastrophic forgetting problem" ). 好的是,您可以通过在一堆文本上运行spaCy并提取大写实体,以编程方式创建这些实体:

    uppercase_ents = [ent for ent in doc.ents if all(t.is_upper for t in ent)]
    

    看见 this section 有关如何使用spaCy创建训练数据的更多示例。您还可以使用spaCy生成所选实体的小写和titlecase变体,以引导您的训练数据,这有望为您节省大量时间和工作。