我创建了一个Spacy Phrasematcher以匹配文档中的名称,紧随tutorial之后。我想将结果匹配项用作其他训练数据,以训练Spacy NER模型。但是,我的模式分别包含全名(例如“巴拉克·奥巴马”)和姓氏(“奥巴马”)。
因此,在包含“巴拉克·奥巴马”的句子中,两个模式都匹配,导致匹配重叠。但是,当我尝试使用数据进行训练时,这种重叠会触发异常,例如:
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()
。它首选最长的跨度,如果两个重叠的跨度相同,则使用文本中较早的跨度。