我正在测试这样的句子以提取实体值:
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
配对。许多示例就是这种情况,因为当我要从数量中分离仪表时,我不能依靠这个引擎。
我应该手动执行吗?
答案 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 EntityRuler
,combining models and rules和token match pattern syntax。