仅使用 Spacy Phrasematcher 进行最长匹​​配

Longest match only with Spacy Phrasematcher

我创建了一个 Spacy Phrasematcher to match names in a document, following the tutorial。我想使用生成的匹配项作为额外的训练数据来训练 Spacy NER 模型。 但是,我的模式分别包含全名(例如 'Barack Obama')和姓氏('Obama')。

因此,在包含 'Barack Obama' 的句子中,两种模式都匹配,导致重叠匹配。但是,当我尝试使用数据进行训练时,这种重叠会触发异常,例如:

ValueError: [E103] Trying to set conflicting doc.ents: '(19, 33, 'PERSON')' and '(29, 33, 'PERSON')'. A token can only be part of one entity, so make sure the entities you're setting don't overlap.

我一直在考虑在使用数据进行训练之前过滤掉重叠的匹配项,但这似乎是一种非常低效的方法,导致大数据的处理时间显着增加。

有没有办法设置 PhraseMatcher 以便它只匹配重叠匹配的最长匹配?

PhraseMatcher 没有内置的方法来在匹配时过滤掉重叠匹配,但是有一个实用函数可以在之后过滤重叠匹配:spacy.util.filter_spans()。它更喜欢最长的跨度,如果两个重叠的跨度相同,则文本中较早的跨度。