Case-sensitive实体识别

Case-sensitive entity recognition

我的关键字都以小写形式存储,例如"discount nike shoes",我正在尝试对其执行实体提取。我 运行 遇到的问题是,当涉及到 NER 时,spaCy 似乎区分大小写。请注意,我不认为这是 spaCy 特有的。

当我运行...

doc = nlp(u"i love nike shoes from the uk")

for ent in doc.ents:
    print(ent.text, ent.start_char, ent.end_char, ent.label_)

...没有返回任何内容。

当我运行...

doc = nlp(u"i love Nike shoes from the Uk")

for ent in doc.ents:
    print(ent.text, ent.start_char, ent.end_char, ent.label_)

我得到以下结果...

Nike 7 11 ORG
Uk 25 27 GPE

我应该把所有的东西都用标题大小写吗?我可以使用其他解决方法吗?

spaCy 的 pre-trained statistical models 接受了大量一般新闻和网络文本的训练。这意味着实体识别器可能只看到了很少的 all-lowercase 个示例,因为这在这些类型的文本中不太常见。在英语中,大写也是命名实体的重要指标(与德语不同,所有名词通常都大写),因此模型可能更关注这一点。

如果您正在处理没有正确大写的文本,您可能希望 fine-tune 此处的模型不那么敏感。有关详细信息和代码示例,请参阅 updating the named entity recognizer 上的文档。

希望生成训练示例不会很困难,因为您可以使用现有的注释和数据集,或者使用 pre-trained 模型创建一个,然后将所有内容小写。例如,您可以采用适当大写的文本,运行 模型并提取文本中的所有实体跨度。接下来,将所有文本小写,并使用新数据更新模型。确保还混合了适当大写的文本,因为您不希望模型学习 "Everything is lowercase now! Capitalisation doesn't exist anymore!".

之类的东西

顺便说一句,如果您有可以使用列表或规则集定义的实体,您可能还想查看 EntityRuler component。它可以与统计实体识别器相结合,让你传入一个完全匹配的字典或可以是 case-insensitive 的抽象标记模式。例如,[{"lower": "nike"}] 将匹配一个小写形式为 "nike" 的标记——因此 "NIKE"、"Nike"、"nike"、"NiKe" 等

一般来说,non-standardized 外壳对于 pre-trained 模型是有问题的。

您有一些解决方法:

  • Truecasing:更正文本中的大写字母,以便您可以使用标准 NER 模型。
  • Caseless 模型:训练完全忽略大写的 NER 模型。
  • 混合大小写 模型:在混合大小写和非大小写文本上训练 NER 模型。

我会推荐 Truecasing,因为那里有一些不错的 open-source truecasers,准确度很高,它们允许您使用 pre-trained NER 解决方案,例如 spaCy。

无壳和 mixed-case 型号更 time-consuming 设置,不一定会提供更好的结果。