カスタム辞書を使用したエンティティの検出

検出したい用語が、製品名や組織名のリストなど、あらかじめ決まっている場合は、辞書を作成することができます。 辞書検索は非常に高速で、リソース効率に優れています。

Watson 自然言語処理(NLP)辞書には、単純な文字列一致にとどまらない高度な照合機能が含まれており、具体的には以下のものが挙げられます:

  • 辞書の用語は、単一のトークン(例: wheel )で構成される場合もあれば、複数のトークン(例: steering wheel )で構成される場合もあります。
  • 辞書項目の照合は、大文字と小文字を区別する場合と区別しない場合があります。 大文字と小文字を区別する検索を行うことで、 ABS のような頭字語が、 abs のように異なる意味を持つ通常の単語と一致しないようにすることができます。
  • 複数の辞書項目が同じテキストに一致する場合、それらをどのように統合するかを指定できます。 「 Watson 」と「 Watson Natural Language Processing 」という2つの辞書エントリがある場合、「I like Watson Natural Language Processing」という文において、どちらのエントリに一致させるかを設定できます。具体的には、「 Watson Natural Language Processing 」のみ(「 Watson 」が含まれているため)に一致させるか、あるいは両方に一致させるかを選択できます。
  • すべての活用形を列挙する代わりに、語幹に一致させるように指定することができます。 こうすることで、辞書に 「mouse」 という単語を1つ登録するだけで、テキスト内の 「mouse」「mice」 の両方を検出できるようになります。
  • 各辞書エントリにラベル(例: 組織カテゴリ) を付与することで、照合に追加のメタデータを含めることができます。

これらの機能はすべて設定可能なので、用途に合わせて最適なオプションを選択できます。

辞書ファイルの種類

Watson 自然言語処理では、2種類の辞書ファイルがサポートされています:

  • 語彙リスト(で .dict終わる語)

    用語リストの例:

    Arthur
    Allen
    Albert
    Alexa
    
  • 表(末尾が であるもの .csv

    表の例:

    "label", "entry"
    "ORGANIZATION", "NASA"
    "COUNTRY", "USA"
    "ACTOR", "Christian Bale"
    

1回の抽出処理中に、複数の辞書を使用することができます。 また、両方のタイプを同時に使用することも可能です。例えば、3つの辞書、1つの用語リスト、2つのテーブルを使用して、1回の抽出を実行することができます。

辞書ファイルの作成

まず、ノートブック内にモジュールディレクトリを作成します。 これは、ノートブックファイルシステム内にあるディレクトリで、辞書ファイルを一時的に保存するために使用されます。

ノートブックに辞書ファイルを作成するには:

  1. モジュールディレクトリを作成します。 モジュールフォルダの名前にはハイフンを含めないでください。ハイフンを含めるとエラーが発生します。
    import os
    import watson_nlp
    module_folder = "NLP_Dict_Module_1"
    os.makedirs(module_folder, exist_ok=True)
    
  2. 辞書ファイルを作成し、それらをモジュールディレクトリに保存します。 外部のリストや CSV ファイルを読み込むことも、次のように辞書ファイルを作成することもできます:
    # Create a term list dictionary
    term_file = "names.dict"
    with open(os.path.join(module_folder, term_file), 'w') as dictionary:
        dictionary.write('Bruce')
        dictionary.write('\n')
        dictionary.write('Peter')
        dictionary.write('\n')
    
    # Create a table dictionary
    table_file = 'Places.csv'
    with open(os.path.join(module_folder, table_file), 'w') as places:
        places.write("\"label\", \"entry\"")
        places.write("\n")
        places.write("\"SIGHT\", \"Times Square\"")
        places.write("\n")
        places.write("\"PLACE\", \"5th Avenue\"")
        places.write("\n")
    

辞書の読み込みと照合オプションの設定

辞書は、以下のヘルパー・メソッドを使用してロードできます。

  • 単一の辞書を読み込むには、次のようにします。 watson_nlp.toolkit.rule_utils.DictionaryConfig (<dictionary configuration>)
  • 複数の辞書を読み込むには、以下を使用します watson_nlp.toolkit.rule_utils.DictionaryConfig.load_all([<dictionary configuration>)])

各辞書について、辞書設定を指定する必要があります。 辞書設定は、 Python 辞書であり、以下の属性を持っています:

属性 説明 必須
name ストリング 辞書の名前 はい
source ストリング 辞書のパス(相対パス) module_folder はい
dict_type ファイルまたはテーブル 辞書オブジェクトが用語リスト(ファイル)であるか、マッピングテーブル(テーブル)であるか いいえ デフォルトはファイルです
consolidate ContainedWithin (最も長い一致を残し、重複を削除する) / NotContainedWithin (最も短い一致を残し、重複を削除する) / ContainsButNotEqual (最も長い一致を残すが、重複する一致も保持する) / ExactMatch (重複を削除する) / LeftToRight (左端にある、重複しない最も長いスパンを残す) 重複する辞書の一致項目をどう扱うか。 いいえ デフォルトでは、一致する項目は統合されません。
case 大文字小文字を区別しない / 区別する 大文字と小文字を区別するか、区別しないかのいずれかです。 いいえ デフォルトは完全一致です。
lemma 正しい/間違っている 辞書にある語句を、本文中の語幹と対応させてください。 辞書には、見出し語の形のみを含めるべきである。 たとえば、辞書に mouse を追加すると、テキスト内の micemouse の両方に一致するようになります。 辞書に mice 追加しないでください。 テキスト内の複数のトークンから成る用語に一致させるには、辞書内のそれらの用語の語幹をスペースで区切ってください。 いいえ デフォルトは false です。
mappings.columns (列 as attribute of のマッピング: {}) リスト [ 文字列 ] テーブルのCSVファイルと同じ順序で並んだ列見出しの一覧 はい、もし~なら dict_type: table
mappings.entry (エントリ as attribute of のマッピング: {}) ストリング ドキュメントと照合する文字列を含む列ヘッダーの名前。 はい、もし~なら dict_type: table
label ストリング マッチに貼るラベル。 いいえ

コード・サンプル

使用している環境に応じて、コード・サンプルを選択します。

  • Watson Natural Language Processing ライブラリーを含む環境では、以下を使用します。

    # Load the dictionaries
    # Use the following helper method
    dictionaries = watson_nlp.toolkit.rule_utils.DictionaryConfig.load_all([{
        'name': 'Names',
        'source': term_file,
        'case':'insensitive'
    }, {
        'name': 'places_and_sights_mappings',
        'source': table_file,
        'dict_type': 'table',
        'mappings': {
            'columns': ['label', 'entry'],
            'entry': 'entry'
        }
    }])
    

辞書を含むモデルの学習

辞書を読み込んだら、辞書モデルを作成し、`train()` メソッド RBR.train() を使用してモデルを学習させます。 このメソッドでは、以下を指定してください:

  • モジュールディレクトリ
  • 辞書の見出し語の言語
  • 使用する辞書

コード・サンプル

custom_dict_block = watson_nlp.resources.feature_extractor.RBR.train(module_folder,
language='en', dictionaries=dictionaries)

新しいデータにモデルを適用する

辞書の学習が完了したら、既存の事前学習済みブロックを使用する場合と同様に、` run() method` を使用して新しいデータにモデルを適用します。

コード・サンプル

custom_dict_block.run('Bruce is at Times Square')

コードサンプルの出力:

{(0, 5): ['Names'], (12, 24): ['SIGHT']}

辞書のラベルまたは名前を表示するには:

RBR_result = custom_dict_block.executor.get_raw_response('Bruce is at Times Square', language='en')
print(RBR_result)

ラベルが表示された出力:

{'annotations': {'View_Names': [{'label': 'Names', 'match': {'location': {'begin': 0, 'end': 5}, 'text': 'Bruce'}}], 'View_places_and_sights_mappings': [{'label': 'SIGHT', 'match': {'location': {'begin': 12, 'end': 24}, 'text': 'Times Square'}}]}, 'instrumentationInfo': {'annotator': {'version': '1.0', 'key': 'Text match extractor for NLP_Dict_Module_1'}, 'runningTimeMS': 3, 'documentSizeChars': 32, 'numAnnotationsTotal': 2, 'numAnnotationsPerType': [{'annotationType': 'View_Names', 'numAnnotations': 1}, {'annotationType': 'View_places_and_sights_mappings', 'numAnnotations': 1}], 'interrupted': False, 'success': True}}