我创建了一个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
使其仅与重叠匹配中最长的匹配?
答案 0 :(得分:1)
PhraseMatcher
没有内置的方法可以在匹配时过滤掉重叠的匹配项,但是有一个实用函数可以在以后过滤掉重叠的匹配项:spacy.util.filter_spans()
。它希望使用最长的跨度,如果两个重叠的跨度是相同的长度,则使用文本中较早的跨度。