使用 Spacy 克服错误实体识别的最佳方法是什么?
What is the best way to overcome wrong entity recognision with 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 meters QUANTITY 10 m QUANTITY 6 CARDINAL
即数字3m
没有与m
配对。许多示例都是这种情况,因为当我想将仪表与数量分开时,我不能依赖这个引擎。
我应该手动执行此操作吗?
您的示例中的一个潜在困难是它不是很接近自然语言。 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')]
统计命名实体识别器尊重预定义实体并将"predict around"它们。因此,如果您在管道中添加 EntityRuler
before,您的自定义 QUANTITY
实体将首先分配,并且在实体识别器时将被考虑在内预测剩余标记的标签。
请注意,此示例使用的是最新版本的 spaCy,v2.1.x。您可能还想添加更多模式来涵盖不同的结构。有关更多详细信息和灵感,请查看 documentation on the EntityRuler
, combining models and rules and the token match pattern syntax.
我正在测试这样的句子以提取实体值:
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 meters QUANTITY 10 m QUANTITY 6 CARDINAL
即数字3m
没有与m
配对。许多示例都是这种情况,因为当我想将仪表与数量分开时,我不能依赖这个引擎。
我应该手动执行此操作吗?
您的示例中的一个潜在困难是它不是很接近自然语言。 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')]
统计命名实体识别器尊重预定义实体并将"predict around"它们。因此,如果您在管道中添加 EntityRuler
before,您的自定义 QUANTITY
实体将首先分配,并且在实体识别器时将被考虑在内预测剩余标记的标签。
请注意,此示例使用的是最新版本的 spaCy,v2.1.x。您可能还想添加更多模式来涵盖不同的结构。有关更多详细信息和灵感,请查看 documentation on the EntityRuler
, combining models and rules and the token match pattern syntax.