web-dev-qa-db-ja.com

SpaCyでPhraseMatcherを使用して複数のマッチタイプを見つける

SpaCyのドキュメントとサンプルは、PhraseMatcherクラスがドキュメント内のトークンのシーケンスを照合するのに役立つことを示しています。照合されるシーケンスの語彙を提供する必要があります。

私のアプリケーションには、トークンとフレーズのコレクションであるドキュメントがあります。さまざまなタイプのエンティティがあります。データはリモートの自然言語です(ドキュメントはセミランダム順のキーワードのセットです)。複数のタイプの一致を見つけようとしています。

例えば:

yellow boots for kids

SpaCyのPhraseMatchesを使用して、色(例:黄色)、製品タイプ(例:ブーツ)、および年齢(例:子供)の一致を見つけるにはどうすればよいですか?これは良いユースケースですか?異なるエンティティの一致が重複する場合(たとえば、色が色リストと材料リストで一致する場合)、すべての一意のケースを生成することは可能ですか?

データは大まかに構造化されており、あいまいさが多く、シーケンスタガーは実際には使用できません。エンティティ(色、年齢、製品タイプなど)のリストと関連する値のリストがあります。

1つのアイデアは、エンティティごとに1つずつ、複数のPhraseMatcherオブジェクトをインスタンス化し、一致を個別に実行してから、結果をマージすることです。エンティティタイプごとに独自の語彙を取得します。これは簡単に聞こえますが、特にマージ部分では効率的ではありません。値リストはかなり大きいです。このルートに進む前に、これが良いアイデアなのか、それともSpaCyでこれを行う簡単な方法があるのか​​を知りたいと思います。

10

spaCyのPhraseMatcherは、複数のパターンを含む複数のルールの追加、および追加する各マッチャールールへのIDの割り当てをサポートしています。 2つのルールが重複する場合、両方の一致が返されます。だからあなたはこのようなことをすることができます:

_color_patterns = [nlp(text) for text in ('red', 'green', 'yellow')]
product_patterns = [nlp(text) for text in ('boots', 'coats', 'bag')]
material_patterns = [nlp(text) for text in ('silk', 'yellow fabric')]

matcher = PhraseMatcher(nlp.vocab)
matcher.add('COLOR', None, *color_patterns)
matcher.add('PRODUCT', None, *product_patterns)
matcher.add('MATERIAL', None, *material_patterns)
_

matcherdocを呼び出すと、spaCyは_(match_id, start, end)_タプルのリストを返します。 spaCyはすべての文字列を整数として保存するため、返される_match_id_も整数になります–しかし、語彙のStringStoreで検索することにより、文字列表現をいつでも取得できます。つまり、_nlp.vocab.strings_:

_doc = nlp("yellow fabric")
matches = matcher(doc)
for match_id, start, end in matches:
    rule_id = nlp.vocab.strings[match_id]  # get the unicode ID, i.e. 'COLOR'
    span = doc[start : end]  # get the matched slice of the doc
    print(rule_id, span.text)

# COLOR yellow
# MATERIAL yellow fabric
_

マッチャールールを追加する場合、_on_match_の2番目の引数として _Matcher.add_コールバック関数 を定義することもできます。これは、特定のアクションをトリガーする場合に役立ちます。たとえば、COLOR一致が見つかった場合に1つの処理を実行し、PRODUCT一致に対して別の処理を実行します。

これをよりエレガントに解決したい場合は、マッチャーを カスタムパイプラインコンポーネント または カスタム属性 と組み合わせる方法を検討することもできます。たとえば、テキストに対してnlp()を呼び出すと自動的に実行され、一致するものを見つけ、_Doc._.contains_product_または_Token._.is_color_属性を設定する単純なコンポーネントを作成できます。ドキュメントには、これを開始するのに役立ついくつかの例があります。

30
Ines Montani