使用Spacy克服错误实体识别的最佳方法是什么?

问题描述 投票:-1回答:1

我正在测试这样的句子来提取实体值:s = "Height: 3m, width: 4.0m, others: 3.4 m, 4m, 5 meters, 10 m. Quantity: 6."

sent = nlp(s)

for ent in sent.ents:
    print(ent.text, ent.label_)

并得到一些误导性的价值观:

3 CARDINAL 4.0m Cardinal 3.4 m Cardinal 4m Cardinal 5米QUANTITY 10 m QUANTITY 6 CARDINAL

即,3m号与m不配对。许多例子都是这种情况,因为当想要将数量与数量分开时,我不能依赖这种引擎。

我应该手动完成吗?

python-3.x spacy entities
1个回答
1
投票

你的例子中的一个潜在困难是它与自然语言不太接近。 pre-trained English模型在大约200万字的一般网络和新闻文本上进行了训练,因此它们并不总是能够在具有非常不同结构的文本上执行完美的开箱即用。

虽然您可以在特定文本中使用更多QUANTITY示例更新模型,但我认为基于规则的方法实际上可能是更好,更有效的解决方案。

this blog post中的示例实际上非常接近您要做的事情:

import spacy
from spacy.pipeline import EntityRuler

nlp = spacy.load("en_core_web_sm")
weights_pattern = [
    {"LIKE_NUM": True},
    {"LOWER": {"IN": ["g", "kg", "grams", "kilograms", "lb", "lbs", "pounds"]}}
]
patterns = [{"label": "QUANTITY", "pattern": weights_pattern}]
ruler = EntityRuler(nlp, patterns=patterns)
nlp.add_pipe(ruler, before="ner")
doc = nlp("U.S. average was 2 lbs.")
print([(ent.text, ent.label_) for ent in doc.ents])
# [('U.S.', 'GPE'), ('2 lbs', 'QUANTITY')]

统计命名实体识别器尊重预定义实体并且将“预测”它们。因此,如果您在管道中添加EntityRuler之前,将首先分配您的自定义QUANTITY实体,并在实体识别器预测其余标记的标签时将其考虑在内。

请注意,此示例使用的是最新版本的spaCy,v2.1.x。您可能还想添加更多模式以涵盖不同的构造。欲了解更多细节和灵感,请查看documentation on the EntityRulercombining models and rulestoken match pattern syntax

© www.soinside.com 2019 - 2024. All rights reserved.