SpaCy NER 似乎无法正确识别带连字符的名称
SpaCy NER doesn't seem to correctly recognize hyphenated names
第一件事第一:我是 SpaCy 的新手,刚开始测试它。我不得不说它的简单性和文档质量给我留下了深刻的印象。谢谢!
现在,我正在尝试识别法语文本中的 PER。它似乎对大多数人来说工作得很好,但我看到了一个反复出现的错误模式:没有正确识别带有连字符的名字(例如:Pierre-Louis Durand 将显示为两个 PER:"Pierre" 和 "Louis Durand")。
参见示例:
import spacy
# nlp = spacy.load('fr')
nlp = spacy.load('fr_core_news_md')
description = ('C\'est Jean-Sébastien Durand qui leur a dit. Pierre Dupond n\'est pas venu à Boston comme attendu. '
'Louis-Jean s\'est trompé. Claire a bien choisi.')
text = nlp(description)
labels = set([w.label_ for w in text.ents])
for label in labels:
entities = [e.string for e in text.ents if label==e.label_]
entities = list(entities)
print(label, entities)
输出为:
LOC ['Boston ']
PER ['Jean', 'Sébastien Durand ', 'Pierre Dupond ', 'Louis', 'Jean ', 'Claire ']
应该是:"Jean-Sébastien Durand"和"Louis-Jean"。
我不确定在这里做什么:
- 更改令牌的提取方式(我想知道非 PER 的副作用)- 我认为这不是问题,因为 PER 可以是多个令牌的集合
- 在某个地方应用魔法设置,以便连字符可以在 NER 中用于 PER
- 训练模型
- 回学校去 ;-)
感谢您的帮助(是的,我正在通过阅读更多内容进行调查,我喜欢它)!
-TC
我最初认为这可能是分词器和训练数据之间的不匹配,但实际上这是一个问题,它是如何从保存的模型中加载处理带有连字符的某些单词的正则表达式的。
spacy v2.2 模型的临时修复(每次加载法国模型后都必须这样做)是用正确的默认设置替换有问题的分词器设置:
import spacy
from spacy.lang.fr import French
nlp = spacy.load("fr_core_news_md")
nlp.tokenizer.token_match = French.Defaults.token_match
description = ('C\'est Jean-Sébastien Durand qui leur a dit. Pierre Dupond n\'est pas venu à Boston comme attendu. '
'Louis-Jean s\'est trompé. Claire a bien choisi.')
text = nlp(description)
labels = set([w.label_ for w in text.ents])
for label in labels:
entities = [e.text for e in text.ents if label==e.label_]
entities = list(entities)
print(label, entities)
输出:
PER ['Jean-Sébastien Durand', 'Pierre Dupond']
LOC ['Boston', 'Louis-Jean', 'Claire']
(法语 NER 模型是根据来自维基百科的数据训练的,因此它在该特定文本的实体类型上仍然表现不佳。)
第一件事第一:我是 SpaCy 的新手,刚开始测试它。我不得不说它的简单性和文档质量给我留下了深刻的印象。谢谢!
现在,我正在尝试识别法语文本中的 PER。它似乎对大多数人来说工作得很好,但我看到了一个反复出现的错误模式:没有正确识别带有连字符的名字(例如:Pierre-Louis Durand 将显示为两个 PER:"Pierre" 和 "Louis Durand")。
参见示例:
import spacy
# nlp = spacy.load('fr')
nlp = spacy.load('fr_core_news_md')
description = ('C\'est Jean-Sébastien Durand qui leur a dit. Pierre Dupond n\'est pas venu à Boston comme attendu. '
'Louis-Jean s\'est trompé. Claire a bien choisi.')
text = nlp(description)
labels = set([w.label_ for w in text.ents])
for label in labels:
entities = [e.string for e in text.ents if label==e.label_]
entities = list(entities)
print(label, entities)
输出为:
LOC ['Boston ']
PER ['Jean', 'Sébastien Durand ', 'Pierre Dupond ', 'Louis', 'Jean ', 'Claire ']
应该是:"Jean-Sébastien Durand"和"Louis-Jean"。
我不确定在这里做什么:
- 更改令牌的提取方式(我想知道非 PER 的副作用)- 我认为这不是问题,因为 PER 可以是多个令牌的集合
- 在某个地方应用魔法设置,以便连字符可以在 NER 中用于 PER
- 训练模型
- 回学校去 ;-)
感谢您的帮助(是的,我正在通过阅读更多内容进行调查,我喜欢它)!
-TC
我最初认为这可能是分词器和训练数据之间的不匹配,但实际上这是一个问题,它是如何从保存的模型中加载处理带有连字符的某些单词的正则表达式的。
spacy v2.2 模型的临时修复(每次加载法国模型后都必须这样做)是用正确的默认设置替换有问题的分词器设置:
import spacy
from spacy.lang.fr import French
nlp = spacy.load("fr_core_news_md")
nlp.tokenizer.token_match = French.Defaults.token_match
description = ('C\'est Jean-Sébastien Durand qui leur a dit. Pierre Dupond n\'est pas venu à Boston comme attendu. '
'Louis-Jean s\'est trompé. Claire a bien choisi.')
text = nlp(description)
labels = set([w.label_ for w in text.ents])
for label in labels:
entities = [e.text for e in text.ents if label==e.label_]
entities = list(entities)
print(label, entities)
输出:
PER ['Jean-Sébastien Durand', 'Pierre Dupond']
LOC ['Boston', 'Louis-Jean', 'Claire']
(法语 NER 模型是根据来自维基百科的数据训练的,因此它在该特定文本的实体类型上仍然表现不佳。)