python-3.x - 用 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
。许多示例都是这种情况,因为当我想将计量与数量分开时,我不能依赖这个引擎。
我应该手动执行此操作吗?
解决方案
您的示例中的一个潜在困难是它与自然语言不太接近。预训练的英语模型是在大约 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
结合模型和规则以及令牌匹配模式语法的文档。
推荐阅读
- pine-script - 在 Pine 脚本中获取字符串长度
- kotlin - 是否可以对具有无参数且无结果的函数类型参数的函数进行断言?
- c - 如何在c中使矩形的两侧相等?
- python - Python re.search 正则表达式匹配
- git - 变基中“上游分支”的含义
- css - 变换 - 仅倾斜锚标记背景
- google-app-engine - 使用 google drive API 错误 403 更新文件
- powerbi - 在powerbi中需要一个逗号分隔的group by
- android - 需要使用 Jetpack compose 的 AlertDialog 和 OutlinedTextField 单击两次确认按钮
- dailymotion-api - 如何禁用dailymotion android SDK自动播放视频?