在spacy中,是否可以在匹配匹配中获取相应的规则ID
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在spacy中,是否可以在匹配匹配中获取相应的规则ID相关的知识,希望对你有一定的参考价值。
在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)
在这种情况下,matches
返回:
[(12071893341338447867, 9, 12), (4566231695725171773, 16, 17)]
12071893341338447867
是一个基于class-1_0
的独特ID。我找不到原始的规则名称,即使我在matcher._patterns
中做了一些反省。
如果有人可以帮助我会很棒。非常感谢你。
是的 - 您可以通过StringStore
或nlp.vocab.strings
在词汇表的doc.vocab.strings
中查找ID。通过Doc
去这里非常方便,因为你可以在你的on_match
回调中这样做:
def on_match(matcher, doc, match_id, matches):
string_id = doc.vocab.strings[match_id]
为了提高效率,spaCy将所有字符串编码为整数,并在StringStore
查找表中保留对映射的引用。在spaCy v2.0中,整数是哈希值,因此它们总是匹配模型和词汇表。有关这方面的详细信息,请参阅this section in the docs。
当然,如果您的类和ID仍然有点神秘,那么建议整数ID的other answer也可以正常工作。请记住,您选择的那些整数ID也可能会映射到StringStore
中的某个随机字符串(如单词或词性标记或其他内容)。如果您没有查找它们并将它们解析为字符串,这通常无关紧要 - 但如果您这样做,输出可能会令人困惑。例如,如果你的匹配器规则ID是99
而你正在调用doc.vocab.strings[99]
,那么这将返回'VERB'
。
在写我的问题时,我经常找到解决方案。
这很简单,而不是使用unicode规则id,如class-1_0
,只需使用一个整数。标识符将在整个过程中保留。
matcher.add(1, on_match, [{'LEMMA': 'pilier'}])
匹配
[(1, 16, 17),]
以上是关于在spacy中,是否可以在匹配匹配中获取相应的规则ID的主要内容,如果未能解决你的问题,请参考以下文章