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

时间:2019-03-22 18:48:36

标签: python-3.x spacy entities

我正在测试这样的句子以提取实体值: 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个基数   4.0m CARDINAL   3.4 m卡丁4 m卡丁5米数量10 m数量6卡

即数字3m没有与m配对。许多示例就是这种情况,因为当我要从数量中分离仪表时,我不能依靠这个引擎。

我应该手动执行吗?

1 个答案:

答案 0 :(得分:1)

您的示例中的一个潜在困难是它与自然语言不是很接近。 pre-trained English模型是在大约200万个通用网络和新闻文本的单词上进行训练的,因此它们不一定总是在结构非常不同的文本上实现完美的即开即用。

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

this blog post中的示例实际上与您要执行的操作非常接近:

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实体,并在实体识别器预测标签时将其考虑在内其余令牌。

请注意,此示例使用的是最新版本的spaCyv2.1.x。您可能还希望添加更多模式以涵盖不同的构造。有关更多详细信息和灵感,请查看documentation on the EntityRulercombining models and rulestoken match pattern syntax