辞書を使用してエンティティーを検出する場合と同様に、正規表現パターン・マッチングを使用してエンティティーを検出できます。
正規表現は、辞書などのファイルでは提供されませんが、正規表現構成内のメモリー内で提供されます。 同じ抽出で複数の正規表現構成を使用できます。
Watson Natural Language Processing で定義した正規表現は、トークン境界を使用できます。 これにより、1 つ以上のトークン内で正規表現が一致するようにすることができます。 これは、特に空白文字で区切られていない言語 (中国語など) で作業する場合に、より単純な正規表現エンジンよりも明白な利点です。
正規表現は、ルール・ベース・ランタイム (RBR) と呼ばれる専用コンポーネントによって処理されます。
正規表現構成の作成
ノートブック内にモジュール・ディレクトリーを作成することから始めます。 これは、RBR トレーニングによって作成されたファイルを保管するために一時的に使用されるノートブック・ファイル・システム内のディレクトリーです。 このモジュール・ディレクトリーは、辞書ベースのエンティティー抽出用に作成して使用したものと同じディレクトリーにすることができます。 辞書と正規表現は、同じトレーニング実行で使用できます。
ノートブックでモジュール・ディレクトリーを作成するには、コード・セルに以下を入力します。 モジュール・ディレクトリーにダッシュ (-) を含めることはできないことに注意してください。
import os
import watson_nlp
module_folder = "NLP_RBR_Module_2"
os.makedirs(module_folder, exist_ok=True)
正規表現構成は、以下の属性を持つ Python 辞書です。
属性 | 値 | 説明 | 必須 |
---|---|---|---|
name |
ストリング | 正規表現の名前です。 入力テキスト内の正規表現の一致には、出力内でこの名前のタグが付けられます。 | はい |
regexes |
リスト (Perl ベースの正規表現パターンのストリング) | 空であってはなりません。 複数の正規表現を指定できます。 | はい |
flags |
有効なフラグの区切り文字で区切られたストリング | UNICODE や CASE_INSENSITIVE などのフラグは、マッチングを制御します。 フラグの組み合わせにすることもできます。 サポートされるフラグについては、『パターン (Java Platform SE 8)』を参照してください。 | いいえ (デフォルトは DOTALL) |
token_boundary.min |
int | token_boundary は、トークン境界でのみ正規表現をマッチさせるかどうかを指示します。 min 属性とmax 属性を持つ dict オブジェクトとして指定されます。 |
いいえ (入力テキスト内の各文字位置で最も長い重複しない一致を返します) |
token_boundary.max |
int | max は token_boundary のオプション属性であり、境界を範囲 ( min トークンと max トークンの間) に拡張する必要がある場合に必要です。 token_boundary.max は >= token_boundary.min でなければなりません。 |
いいえ (token_boundary が指定されている場合、min 属性は単独で指定できます) |
groups |
リスト (一致するグループのストリングストリング・ラベル) | リスト内のストリング索引は、1 から始まるパターン内の一致グループに対応します。0 から始まる索引は、一致全体に対応します。 例: group: ['full', 'first', 'second'] を使用するab でのregex: (a)(b) の結果はfull: ab, first: a, second: b です |
いいえ (デフォルトでは、完全一致でラベル・マッチになります) |
正規表現構成は、以下のヘルパー・メソッドを使用してロードできます。
- 単一の正規表現構成をロードするには、
watson_nlp.toolkit.RegexConfig.load(<regex configuration>)
を使用します。 - 複数の正規表現構成をロードするには、
watson_nlp.toolkit.RegexConfig.load_all([<regex configuration>)])
を使用します。
コード・サンプル
このサンプルは、2 つの異なる正規表現構成をロードする方法を示しています。 最初の構成では、個人名が検出されます。 これはグループ属性を使用して、後の段階でフルネーム、ファーストネーム、およびラストネームに簡単にアクセスできるようにします。
2 番目の構成では、頭字語がすべて大文字のシーケンスとして検出されます。 token_boundary 属性を使用すると、大文字と小文字の両方を含む単語での一致が回避されます。
from watson_nlp.toolkit.rule_utils import RegexConfig
# Load some regex configs, for instance to match First names or acronyms
regexes = RegexConfig.load_all([
{
'name': 'full names',
'regexes': ['([A-Z][a-z]*) ([A-Z][a-z]*)'],
'groups': ['full name', 'first name', 'last name']
},
{
'name': 'acronyms',
'regexes': ['([A-Z]+)'],
'groups': ['acronym'],
'token_boundary': {
'min': 1,
'max': 1
}
}
])
正規表現を含むモデルのトレーニング
正規表現構成をロードした後、RBR.train()
メソッドを使用して RBR モデルを作成します。 メソッドで、以下を指定します。
- モジュール・ディレクトリー
- テキストの言語
- 使用する正規表現構成
これは、辞書ベースの抽出で RBR をトレーニングするために使用されるメソッドと同じです。 同じメソッド呼び出しで辞書構成を渡すことができます。
コード・サンプル
# Train the RBR model
custom_regex_block = watson_nlp.resources.feature_extractor.RBR.train(module_path=module_folder, language='en', regexes=regexes)
新規データへのモデルの適用
辞書をトレーニングした後、事前にトレーニングされた既存のブロックで使用するように、run()
メソッドを使用して新規データにモデルを適用します。
コード・サンプル
custom_regex_block.run('Bruce Wayne works for NASA')
コード・サンプルの出力:
{(0, 11): ['regex::full names'], (0, 5): ['regex::full names'], (6, 11): ['regex::full names'], (22, 26): ['regex::acronyms']}
一致するサブグループまたは一致したテキストを表示するには:
import json
# Get the raw response including matching groups
full_regex_result = custom_regex_block.executor.get_raw_response('Bruce Wayne works for NASA‘, language='en')
print(json.dumps(full_regex_result, indent=2))
コード・サンプルの出力:
{
"annotations": {
"View_full names": [
{
"label": "regex::full names",
"fullname": {
"location": {
"begin": 0,
"end": 11
},
"text": "Bruce Wayne"
},
"firstname": {
"location": {
"begin": 0,
"end": 5
},
"text": "Bruce"
},
"lastname": {
"location": {
"begin": 6,
"end": 11
},
"text": "Wayne"
}
}
],
"View_acronyms": [
{
"label": "regex::acronyms",
"acronym": {
"location": {
"begin": 22,
"end": 26
},
"text": "NASA"
}
}
]
},
...
}
親トピック: 独自のモデルの作成