メインコンテンツへスキップ
このセクションでは、コードエディターで作成した抽出ルールのサンプルをいくつか紹介します。コードエディターはグラフィカルユーザーインターフェースより柔軟性が高く、使用する構文の詳細は構文セクションを参照してください。

名前付きエンティティの最後の出現箇所を見つける

この例では、抽出ルールを使用して賃貸借契約書における借主の組織名を見つけます。この名称は他のすべての組織名の後に現れ、GUI の設定では抽出できません。GUI では Instances > First しか選択できないためです。ただし、抽出ルールを使用して、角括弧で囲まれた “Tenant” という語の直前に現れる組織名を検索できます。 まず補助的な検索要素としてキーワード “Tenant” を見つけます。次に、そのキーワードの前に現れる組織名を探します。この例では、間に入るトークンが 2 つ(開き括弧と引用符)あるため、安全余裕を見込んで距離を 3 トークンに制限します。お使いのドキュメントでキーワードと組織名の間により多くのトークンが介在する場合は、この数値を適宜増やしてください。

直近の組織インスタンスを抽出するためのルール

// 1つのインスタンスのみを検索
~TenantName
// キーワード「Tenant」の前に出現する組織名を検索
// キーワードとの間隔は3トークン以内
// 間にあるトークンに別の組織名を含めないこと
[ t: @NEROrganization ]+ [ ~@NEROrganization ~@kw_Tenant ]{0,3} [ @kw_Tenant ]
=>
TenantName( t );

テナント名の抽出例

金額が文字表記と数字表記の両方で記載されている場合の抽出

この例では、正規表現を用いた抽出ルールにより、まず文字で記載され、その後に丸括弧内で数字で示された金額を抽出します。例: Two Thousand One Hundred Forty-Seven Dollars and Sixty Cents ($2,147.60) Two Thousand One Hundred Forty-Seven Dollars and Sixty Cents (in numbers: $2,147.60)

合計金額を抽出するためのルール

// 変数 a は、数字ではない Money 名前付きエンティティを受け取り、
// まだ Money 検索要素の他のインスタンスに割り当てられていないもの
[ a: @NERMoney( same ) ~@Money ~/\d+/ ]+
[ br: '(' ]
// 疑問符は、「in numbers」という単語がオプションであることを意味します
// ^ と $ 記号は、文字列全体が正規表現に一致する必要があることを意味します
// i オプションは、大文字と小文字を区別しない一致を意味します
( [ e1: /^in$/i ] [ e2: /^numbers$/i ] [ e3: ':' ]? )?
// 変数 b は、括弧内に配置された Money 名前付きエンティティを受け取ります
[ b: @NERMoney( same ) ~@Money ]+
=>
Money( a + br + e1 + e2 + e3 + b );

金額抽出の例

キーワードによるセグメントの検索

この例では、Segmentation アクティビティで確実に検出できないセグメントを見つけるために抽出ルールを使用します。ルールは、セグメントの開始または終了となるキーワードを探し、その間のテキストを抽出します。 ドキュメントには、すべて大文字で書かれた番号付きの第2レベル見出しがあると仮定します。例: 1.1 PREMISES、2.3 LIABILITY AND INDEMNITY など。また、第1レベルの見出しは、検索要素 “kw_Heading1” にすでに抽出済みであるとします(簡潔のため、該当する抽出ルールは省略します)。 まず、ドキュメントの各段落の先頭にあるキーワードを探し、それらを検索要素 “kw_Heading2.” に抽出します。次に、連続する2つのキーワードの間のテキストを検索要素 “Segment.” に格納します。 Advanced Designer の現行バージョンでは、コードエディターは固有表現の検出に使用される検索要素でのみ利用可能です。回避策として、コードで見出しやセグメントのようなテキストを抽出するには、サポートされている固有表現(例: Organization)の検索要素を作成し、その要素のコードエディターにルールのコードを入力してください。

第2レベル見出しを kw_Heading2 検索要素に抽出するためのルール

// 最大5単語の全て大文字で構成された番号付き第2レベル見出しを検索
// 見出し番号は1つのトークンとして検出される可能性があります: 1.1
[ t1: /\d{1,2}\.\d{1,2}/ ] [ t2: <all_letters_capitalized> ]{1,5}
=>
kw_Heading2( t1 + t2 );
// 見出し番号は3つの別々のトークンとして検出される可能性があります: 1、ドット、1
[ t1: /\d{1,2}/ ] [ t2: '.' ] [ t3: /\d{1,2}/ ] [ t4: <all_letters_capitalized> ]{1,5}
=>
kw_Heading2( t1 + t2 + t3 + t4 );

セグメントを「Segment search」要素に抽出するためのルール

// 連続する2つのセクション見出し間のテキストセグメントを検索
// 第1レベルの見出しも除外
[ @kw_Heading2 ] [ interval: ~@kw_Heading2 ~@kw_Heading1 ]+
=>
Root.Segment( interval );

セグメント抽出を示す例 この例では、「3.1 FIRSTLY」と「3.2 SECONDLY」という語が kw_Heading2 検索要素に抽出され、その後、連続する2つの kw_Heading2 検索要素の間にあるテキストが、Segment 検索要素のインスタンスとして抽出されます。

各エンティティに関する情報のグループ化

この例では、合意書の各当事者に関する詳細が正しくグループ化されるよう、抽出ルールを使用します(つまり、各当事者の氏名と住所が1つのグループインスタンスにまとまり、複数のインスタンスに分割されたり、相手方の情報と混在したりしないようにします)。 考え方は、常に先頭に現れる当事者の識別情報を見つけることです。これは、合意書の作成方法によって複数のやり方が考えられます。 この例では、各組織の名称が常に先頭にあり、その後に住所と合意書における役割が続くと仮定します。したがって、次のようにします。
  1. 組織名を検出し、見つかった各名称に対して Party_Group のグループ検索要素の新しいインスタンスを作成し、その子検索要素「Organization_Name」に値を設定します。
  2. 各組織名のインスタンスから、例えば20トークン以内の範囲にある住所と役割を探し、その組織名の親である Party_Group のインスタンスにアクセスして、そのインスタンス内の子検索要素「Address」および「Role」に値を設定します。
データの検索対象は、Segmentation アクティビティで検出され、Extraction Rules アクティビティに Input field「Parties_Segment」として渡されたセグメント内に限定されます。

Organization_Name 検索要素の抽出ルール

// 組織名を検索し、各組織に対して新しいグループインスタンスを作成
[ org: @NEROrganization( same ) ~@Party_Group.Organization_Name @Parties_Segment ]+
=>
// Party_Groupの新しいインスタンスを作成し、Organization_Nameに入力
Party_Group.Organization_Name( org );

Address 検索要素の抽出ルール

// 次に、組織名から20トークン以内に位置する住所を検索します
// この住所はまだParty_Group内のいずれの組織にも割り当てられていないものです
// 
[ org: @Party_Group.Organization_Name( same ) ]+
[ ~@NERAddress ]{0,20}
[ t: @NERAddress( same ) ~@Party_Group.Address @Parties_Segment ]+
=>
// 組織名の親であるParty_Groupのインスタンスにアクセスし
// そのAddressの子要素を入力します
parent( obj( org )).Address( t );

役割検索要素抽出のルール

// ロールについても同様に繰り返す
// ロールを検索するには、キーワードを使用する
[ org: @Party_Group.Organization_Name( same ) ]+
[ ~("Tenant" | "Landlord" | "Broker") ]{0,20}
[ t: "Tenant" | "Landlord" | "Broker" ~@Party_Group.Role @Parties_Segment ]+
=>
parent( obj( org )).Role( t );

検索要素は次のように抽出されます。 グループ化されたデータ抽出の例 データ フォームでは、各企業の名前、住所、役割がそれぞれ個別のグループ インスタンスにまとめられていることも確認できます。 グループ化されたデータ フィールドの例 各組織の詳細は一括してグループ化されており、角括弧内のインスタンス番号で示されています。

日付と時刻をまとめて検出する

この例では、抽出ルールを使って時刻と日付の組み合わせを検出します。 まず、Value from Regular Expression 型の検索要素「Time」を使用します(使用する正規表現は [1]?\d:\d{2}\s+(([ap]\.m\.)|([AP]M))?)。次に、その近傍にある Date という名前のエンティティを探します。最後に、検出したトークン列を連結し、結果を「TimeAndDate」という名前の検索要素に割り当てます。

日付と時刻の併記抽出ルール

// 正規表現検索要素のValueを使用して時刻を検索
// @NERDateを使用して時刻に近いDate名前付きエンティティを検索
[ time: @Time ~@TimeAndDate ]+ [ t: ~@NERDate ]{0,3} [ date: @NERDate( same ) ]+
=>
// 値を結合して1つのfieldに書き込む
// 連続したトークンシーケンスのみ結合可能なため、補助トークンも追加
TimeAndDate( time + t + date );

時刻と日付の抽出の例