2017-11-26 7 views
3

Spacy 2.xでは、テキストコーパス内の特定のトークンを見つけるためにマッチャーを使用します。各ルールにはID(例:'class-1_0')があります。解析中、コールバックon_matchを使用して、それぞれの一致を処理します。コールバックで直接一致を見つけるために使用されるルールを取得するソリューションがありますか?spacyでは、一致するマッチで対応するルールIDを取得できますか

ここは私のサンプルコードです。この場合

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)] 

12071893341338447867class-1_0に基づいて固有のIDです。 matcher._patternsでイントロスペクションを行っても、元のルール名は見つかりません。

誰かが私を助けることができれば素晴らしいと思います。 ありがとうございます。

答えて

1

私の質問を書いている間、私はしばしば解決策を見つけました。

ユニコードルールIDを使用する代わりに、単純に死んでしまいました。たとえば、class-1_0のように、単にインターガーを使用します。識別子は、プロセス全体を通じて保持されます。

[(1, 16, 17),] 
1

matcher.add(1, on_match, [{'LEMMA': 'pilier'}]) 

マッチはい - あなたは単にnlp.vocab.stringsまたはdoc.vocab.stringsを経由して、あなたの語彙のStringStoreで利用できるIDを調べることができます。あなたはon_matchコールバックの中にそれを行うことができますので、Docを経由して行くことは、ここではかなり便利です:効率のため

def on_match(matcher, doc, match_id, matches): 
    string_id = doc.vocab.strings[match_id] 

、スペイシーは、整数にすべての文字列をエンコードし、StringStoreルックアップテーブルのマッピングへの参照を保持します。 spaCy v2.0では、整数はハッシュ値なので、モデルとボキャブラリで常に一致します。詳細はthis section in the docsを参照してください。

もちろん、あなたのクラスとIDがちょっとわかりにくい場合は、other answerの整数IDを示唆しても問題ありません。選択した整数IDはStringStore(単語や品詞タグなど)のランダムな文字列にもマッピングされる可能性が高いことにご注意ください。これは通常、あなたがそれらを探してどこかの文字列に解決していないかどうかは関係ありませんが、そうした場合、出力が混乱する可能性があります。たとえば、一致ルールIDが99で、doc.vocab.strings[99]を呼び出している場合、これは'VERB'を返します。

+0

ありがとうございます。私はあなたの答えをテストしました、それは正しい方向を指しています。しかし、文字列IDを取得するには、 'match_id'ではなく、整数でエンコードされたマッチルールを使用する必要があります。 'string_id = doc.vocab.strings [matches [id] [0]]' もう一度ありがとうございます。 – k3z

+0

そしてspacy 2.0であなたの信じられないほどの成果を感謝します:) – k3z

関連する問題