Python 区分大小写的实体识别

Python 区分大小写的实体识别,python,spacy,named-entity-recognition,Python,Spacy,Named Entity Recognition,我的关键字都以小写形式存储,例如“折扣nike shoes”,我正在尝试对其执行实体提取。我遇到的问题是spaCy在NER中似乎是区分大小写的。请注意,我不认为这是空间特定的 当我跑的时候 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 sh

我的关键字都以小写形式存储,例如“折扣nike shoes”,我正在尝试对其执行实体提取。我遇到的问题是spaCy在NER中似乎是区分大小写的。请注意,我不认为这是空间特定的

当我跑的时候

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_)
。。。一无所获

当我跑的时候

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
我应该把所有的事情都写下来吗?还有其他的解决办法吗?

斯帕西的学生们接受了大量一般新闻和网络文本的训练。这意味着实体识别器可能只看到很少的全小写示例,因为这在这些类型的文本中不太常见。在英语中,大写也是命名实体的有力指标(不像德语,所有名词通常都大写),因此模型可能更关注这一点

如果您处理的文本没有适当的大写字母,您可能希望对模型进行微调,使其不那么敏感。有关更多详细信息和代码示例,请参阅上的文档

生成训练示例希望不是很困难,因为您可以使用现有的注释和数据集,或者使用预先训练好的模型创建一个,然后将所有内容小写。例如,您可以采用适当大写的文本,在其上运行模型,并提取文本中的所有实体跨度。接下来,将所有文本小写,并使用新数据更新模型。还要确保在文本中加入适当的大写字母,因为你不想让模型学到“现在所有东西都是小写的!大写字母不再存在!”


顺便说一句,如果您有可以使用列表或一组规则定义的实体,您可能还希望签出。它可以与统计实体识别器相结合,并允许您传入精确匹配的字典或不区分大小写的抽象标记模式。例如,
[{“lower”:“nike”}]
将匹配一个小写形式为“nike”的令牌–因此“nike”、“nike”、“nike”、“nike”等。

一般来说,未标准化的外壳对于预先训练过的模型是有问题的

您有一些变通方法:

  • TrueCasting:更正文本中的大小写,以便可以使用标准的NER模型
  • 无案例模型:完全忽略资本化的模型
  • 混合大小写模型:在大小写混合文本上训练NER模型
我建议您使用TrueCasting,因为有一些非常好的精确性,它们允许您使用预先培训过的NER解决方案,如spaCy


无大小写和混合大小写模型设置起来比较耗时,不一定能给出更好的结果。

我猜命名实体总是以大写开头。这是一条语法规则。不完全正确,威尔弗里德。NER系统通常使用案例作为结构化预测的重要特征。Ines确实提出了要点。如果你有一个特殊的用例,你可能需要用你的文本进行训练:我不能在这个项目上投入太多的资源,所以我非常喜欢使用预先训练过的truecaser。我一定会查清楚的。谢谢@emma jean请记住,当涉及到组织名称时,TrueCasting可能会很棘手。您可能需要专门培训truecaser,以更好地处理或创造想法,谢谢!同时也是你们对spaCy的狂热粉丝。:)