我的关键字全部以小写形式存储,例如我正在尝试执行“实体提取”。我遇到的问题是,对于NER,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
我应该为所有内容加标题吗?我可以使用其他解决方法吗?
答案 0 :(得分:2)
通常,对于预训练的模型,非标准化套管是有问题的。
您有一些解决方法:
我建议使用Truecasing,因为其中有一些不错的open-source truecasers,而且准确性很高,而且它们可以让您使用经过预先训练的NER解决方案,例如spaCy。
无案例和混合案例模型的建立比较耗时,并且不一定能得到更好的结果。
答案 1 :(得分:0)
spaCy的pre-trained statistical models受过大量一般新闻和网络文本的培训。这意味着实体识别器可能只看到了很少的全小写示例,因为在这些类型的文本中这种情况要少得多。用英语来说,大写也是一个命名实体的有力指标(与德语不同,德语中所有名词通常都是大写的),因此该模型可能会更加注意这一点。
如果您使用的大小写不正确的文本,则可能需要微调模型以使其在此处不那么敏感。有关更多详细信息和代码示例,请参见updating the named entity recognizer上的文档。
希望制作训练示例不会很困难,因为您可以使用现有的注释和数据集,或者使用预先训练的模型创建一个注释,然后将所有内容都小写。例如,您可以采用大写字母的文本,在其上运行模型,然后提取文本中的所有实体范围。接下来,对所有文本进行小写,并使用新数据更新模型。确保也将文本与大写字母混合使用,因为您不希望模型学习诸如“现在一切都小写!大写字母不再存在!”之类的东西。
顺便说一句,如果您具有可以使用列表或规则集定义的实体,则可能还需要签出EntityRuler
component。它可以与统计实体识别器结合使用,并允许您传递完全不匹配的字典或不区分大小写的抽象标记模式。例如,[{"lower": "nike"}]
将匹配一个小写形式为“ nike”的令牌-因此“ NIKE”,“ Nike”,“ nike”,“ NiKe”等。