在Spacy 2.x中,我使用匹配器在文本语料库中查找特定的标记。每个规则都有一个ID('class-1_0'例如)。在解析期间,我使用回调函数on_match来处理每个匹配项。是否有解决方案来检索用于直接在回调中查找匹配项的规则。
这是我的示例代码。
txt = ("Aujourd'hui, je vais me faire une tartine au beurre "
"de cacahuète, c'est un pilier de ma nourriture "
"quotidienne.")
nlp = spacy.load('fr')
def on_match(matcher, doc, id, matches):
span = doc[matches[id][1]:matches[id][2]]
print(span)
# find a way to get the corresponding rule without fuzz
matcher = Matcher(nlp.vocab)
matcher.add('class-1_0', on_match, [{'LEMMA': 'pilier'}])
matcher.add('class-1_1', on_match, [{'LEMMA': 'beurre'}, {'LEMMA': 'de'}, {'LEMMA': 'cacahuète'}])
doc = nlp(txt)
matches = matcher(doc)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,matches返回:
[(12071893341338447867, 9, 12), (4566231695725171773, 16, 17)]
Run Code Online (Sandbox Code Playgroud)
12071893341338447867是基于的唯一ID class-1_0。即使在中进行了自省,我也找不到原始规则名称matcher._patterns。
如果有人可以帮助我,那将是很棒的。非常感谢你。
是的–您只需在StringStore词汇表中查找ID (可通过nlp.vocab.strings或即可找到)doc.vocab.strings。Doc在这里通过进行操作非常方便,因为您可以在on_match回调中进行操作:
def on_match(matcher, doc, match_id, matches):
string_id = doc.vocab.strings[match_id]
Run Code Online (Sandbox Code Playgroud)
为了提高效率,spaCy将所有字符串编码为整数,并在StringStore查找表中保留对映射的引用。在spaCy v2.0中,整数是哈希值,因此它们在模型和词汇表之间始终匹配。有关此内容的更多详细信息,请参阅docs中的本节。
当然,如果您的类和ID仍然有点晦涩难懂,则另一个答案表明整数ID也可以正常工作。请记住,您选择的那些整数ID也可能会映射到中的某个随机字符串StringStore(例如单词,词性标签或其他内容)。如果您不查找它们并将它们解析为某个位置的字符串,通常这并不重要-但是,如果这样做,输出可能会令人困惑。例如,如果您的匹配器规则ID为99且正在呼叫doc.vocab.strings[99],则它将返回'VERB'。
在写下我的问题时,我经常找到解决方案。
它非常简单,而不是使用 unicode 规则 id,例如class-1_0,只需使用整数。该标识符将在整个过程中保留。
matcher.add(1, on_match, [{'LEMMA': 'pilier'}])
Run Code Online (Sandbox Code Playgroud)
与 匹配
[(1, 16, 17),]
Run Code Online (Sandbox Code Playgroud)