製品名や組織のリストなど、検出する必要がある用語の固定セットがある場合は、辞書を作成できます。 辞書マッチングは、非常に高速で、リソース効率に優れています。
Watson Natural Language Processing 辞書には、以下のような単純なストリング・マッチングを超える拡張マッチング機能が含まれています。
- 辞書用語は、単一のトークン (ホイールなど) で構成することも、複数のトークン ( 自動車ハンドルなど) で構成することもできます。
- 辞書用語のマッチングは、大/小文字を区別することも、大/小文字を区別しないこともできます。 大/小文字の区別があるマッチングでは、ABS(航空)のような頭字語が、意味の異なるabs(絶対)のような通常の言語の用語と一致しないようにすることができます。
- 複数の辞書項目が同じテキストに一致する場合に、一致を統合する方法を指定できます。 Watson と Watson Natural Language Processing の 2 つの辞書項目の場合、「I like Watson Natural Language Processing」でどの項目を一致させるかを構成できます。Watson が含まれている Watson Natural Language Processing のみ、またはその両方です。
- すべての語尾変化を列挙する代わりに、見出し語を一致させるように指定できます。 このようにすると、単一の辞書項目である mouse は、テキスト内で mouse と mice の両方を検出します。
- 各辞書項目にラベルを付けることができます。例えば、組織カテゴリーと指定すると、マッチングに追加のメタデータを含めることができます。
これらの機能はすべて構成できるため、ユース・ケースに適したオプションを選択できます。
辞書ファイルのタイプ
Watson Natural Language Processing は、以下の 2 つのタイプの辞書ファイルをサポートします。
用語リスト (末尾
.dict
)用語リストの例:
Arthur Allen Albert Alexa
表 (末尾
.csv
)表の例:
"label", "entry" "ORGANIZATION", "NASA" "COUNTRY", "USA" "ACTOR", "Christian Bale"
同じ抽出で複数の辞書を使用できます。 また、両方のタイプを同時に使用することもできます。例えば、3 つの辞書、1 つの用語リスト、および 2 つの表を使用して単一の抽出を実行できます。
辞書ファイルの作成
ノートブック内にモジュール・ディレクトリーを作成することから始めます。 これは、辞書ファイルを保管するために一時的に使用されるノートブック・ファイル・システム内のディレクトリーです。
ノートブックで辞書ファイルを作成するには、以下のようにします。
- モジュール・ディレクトリーを作成します。 エラーの原因となるため、モジュール・フォルダーの名前にダッシュを含めることはできません。
import os import watson_nlp module_folder = "NLP_Dict_Module_1" os.makedirs(module_folder, exist_ok=True)
- 辞書ファイルを作成し、モジュール・ディレクトリーに保管します。 外部リストまたは 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 |
True / False | 辞書内の用語を、テキストの見出し語と一致させます。 辞書には見出し語の形式のみを含める必要があります。 例えば、テキストのmouse とmice の両方に一致するように、辞書に mouse を追加します。 辞書にmice を追加しないでください。 テキスト内の複数のトークンで構成される用語を突き合わせるには、辞書内のそれらの用語の見出し語をスペース文字で区切ります。 |
いいえ。 デフォルトは False です。 |
mappings.columns (列as attribute of マッピング: {}) |
list [文字列] | 表 csv に存在するのと同じ順序での列ヘッダーのリスト | はい (dict_type: table の場合) |
mappings.entry (エントリーas attribute of マッピング: {}) |
ストリング | 文書と突き合わせるストリングを含む列ヘッダーの名前です。 | はい (dict_type: table の場合) |
label |
ストリング | 一致に付加するラベル。 | いいえ |
コード・サンプル
# Load the dictionaries
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'
}
}])
辞書を含むモデルのトレーニング
辞書をロードした後、辞書モデルを作成して、RBR.train()
メソッドを使用してモデルをトレーニングします。 メソッドで、以下を指定します。
- モジュール・ディレクトリー
- 辞書エントリーの言語
- 使用する辞書
コード・サンプル
custom_dict_block = watson_nlp.resources.feature_extractor.RBR.train(module_folder,
language='en', dictionaries=dictionaries)
新規データへのモデルの適用
辞書をトレーニングした後、事前にトレーニングされた既存のブロックで使用するように、run()
メソッドを使用して新規データにモデルを適用します。
コード・サンプル
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}}
親トピック: 独自のモデルの作成