首页 > 解决方案 > 用 Spacy 克服错误实体识别的最佳方法是什么?

问题描述

我正在测试这样的句子来提取实体值: 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 米 数量 10 m 数量 6 CARDINAL

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

我应该手动执行此操作吗?

标签: python-3.xspacyentities

解决方案


您的示例中的一个潜在困难是它与自然语言不太接近。预训练的英语模型是在大约 200 万词的一般网络和新闻文本上进行训练的,因此它们并不总是能够对结构非常不同的文本进行完美的开箱即用。

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

此博客文章中的示例实际上非常接近您要执行的操作:

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 beforeQUANTITY它,您的自定义实体将首先分配,并且在实体识别器预测剩余标记的标签时将被考虑在内。

请注意,此示例使用最新版本的 spaCy,v2.1.x。您可能还想添加更多模式以涵盖不同的结构。有关更多详细信息和灵感,请查看关于EntityRuler结合模型和规则以及令牌匹配模式语法的文档。


推荐阅读