SpaCyのドキュメントとサンプルは、PhraseMatcherクラスがドキュメント内のトークンのシーケンスを照合するのに役立つことを示しています。照合されるシーケンスの語彙を提供する必要があります。
私のアプリケーションには、トークンとフレーズのコレクションであるドキュメントがあります。さまざまなタイプのエンティティがあります。データはリモートの自然言語です(ドキュメントはセミランダム順のキーワードのセットです)。複数のタイプの一致を見つけようとしています。
例えば:
yellow boots for kids
SpaCyのPhraseMatchesを使用して、色(例:黄色)、製品タイプ(例:ブーツ)、および年齢(例:子供)の一致を見つけるにはどうすればよいですか?これは良いユースケースですか?異なるエンティティの一致が重複する場合(たとえば、色が色リストと材料リストで一致する場合)、すべての一意のケースを生成することは可能ですか?
データは大まかに構造化されており、あいまいさが多く、シーケンスタガーは実際には使用できません。エンティティ(色、年齢、製品タイプなど)のリストと関連する値のリストがあります。
1つのアイデアは、エンティティごとに1つずつ、複数のPhraseMatcherオブジェクトをインスタンス化し、一致を個別に実行してから、結果をマージすることです。エンティティタイプごとに独自の語彙を取得します。これは簡単に聞こえますが、特にマージ部分では効率的ではありません。値リストはかなり大きいです。このルートに進む前に、これが良いアイデアなのか、それともSpaCyでこれを行う簡単な方法があるのかを知りたいと思います。
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)
_
matcher
でdoc
を呼び出すと、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
_属性を設定する単純なコンポーネントを作成できます。ドキュメントには、これを開始するのに役立ついくつかの例があります。