メインコンテンツへスキップ
すでにドイツ語の文書からのデータ抽出を開始しているため、まずこれらの文書向けに Extraction Rules アクティビティを設定します。

準備手順

  1. Activity Editor で “Sick Note DE” アクティビティを開きます。
  2. ドキュメントセットからドキュメントを1つ選択します。
  3. 要素プロパティの詳細モードが有効になっていることを確認します。このモードを切り替えるには、Properties ペインのアイコンをクリックします。
  4. アップロードされたすべてのドキュメントは事前認識が実行されており、画像上で検出されたオブジェクトを確認すると便利です。アイコンをクリックします。画面サイズの都合でこのアイコンが表示されない場合は、アイコンをクリックして Recognized Words を選択します。該当するオブジェクトがドキュメント画像上でハイライト表示されます。ハイライトするオブジェクトの種類はいつでも切り替えられます。例えば、段落を探す際は Recognized Lines に切り替えると役立ち、Separators に切り替えるとセパレーター検索要素の設定が容易になります。
  5. 検索要素が検索領域の外にある場合は検出されません。ドキュメント画像のコンテキストメニューで Show search area オプションを有効にします。照合結果を評価する際、各要素の検索領域は緑色でハイライト表示されます。
抽出精度を高めるために、検索要素の詳細プロパティを試してみると有効な場合があります。 また、抽出ルールの動作を確認し、セット内の異なるドキュメントで抽出結果を比較するため、頻繁に Match をクリックすることをお勧めします。コンテキストメニューで Match Element をクリックすると、他の要素との関連なしに単一の要素をテストできます。この場合、先行要素の仮説品質は照合結果に影響しません。

患者のデータを抽出する

まず、患者に関する不足データを抽出します。そのために、いくつかの検索要素を作成します。 1つのエンティティに関連する要素は、まとめてグループ化することをお勧めします。要素は順番に照合され、先頭の要素が見つからないと、後続要素の仮説品質が低下します。一方、検索要素のグループ同士は照合時に互いに独立して処理され、各グループごとに個別の仮説が生成されます。これにより、要素間の影響を制御できます。また、グループ内の要素が正しく見つかったかを確認するだけで、照合結果を一目で評価できます。さらに、グループ化は照合時間の短縮にも役立ちます。
  1. Create Element をクリックし、ドロップダウンリストから Group 要素を選択します。名前を「PatientDataArea」に変更します。
  2. 新しいグループ検索要素はデフォルトで必須に設定されています。必須要素が見つからない場合、Activity Editor はエラーとなり、照合は中断されます。この挙動により、特定のドキュメントに適さないアクティビティをスキップできます。ただしこのチュートリアルでは、すべての受信ドキュメントからデータを抽出するアクティビティを作成するため、グループは任意にします。Under what conditions セクションで Element is の値を Optional に変更します。
  3. 患者の氏名と住所を含む段落を抽出します。ドイツ語の書類では、該当の段落は常に「Name, Vorname … 」というラベルの付いた field にあります。ドキュメント上でこのテキストを見つけ、抽出対象データの検索基準として使用します。
    a. キーワードは Static Text 検索要素で見つけられます。Create Element をクリックし、ドロップダウンリストから Static Text 要素を選択します。名前を「kwPatientTitle」に変更します。
    b. Properties ペインの Text to find field に「Name, Vorname」と入力します。
    c. Match をクリックします。処理が完了すると、ドキュメントの下に Tree of Hypotheses が表示されます。Advanced Designer が目的の静的テキストを正しく検出したことを確認してください。要素名の横に緑の点があれば、ドキュメント上で対応する要素が見つかったことを示します。Tree of Hypotheses で要素名をクリックすると、ドキュメント上の対応領域が紫色の枠で表示されます。
注: 要素が見つからなかった場合は、名前の横にオレンジの点が表示され、ドキュメント画像の周囲にオレンジの枠が表示されます。要素の仮説品質は、チェーン内の後続要素の状態およびチェーン全体の品質に影響します。仮説品質の詳細については、ドキュメントをご参照ください。
  1. ここでは、患者の氏名と住所を含むセルの下端の境界を見つけます。これはSeparator要素を使って行います。
    a. グループにSeparator要素を追加し、名前を”SeparatorBottom”にします。最小長を200に設定します。
    b. 要素を右クリックし、コンテキストメニューからMatch Elementを選択します。Tree of Hypothesesに多数の緑の点が表示されます。これらは検索条件に合致するさまざまなセパレーターを表しています。各点をクリックすると、画像上の対応するオブジェクトを確認できます。
    c. 検索条件を絞り込むために、セパレーターの検索範囲を指定します。Matchをクリックして、アンカー要素として使用する”kwPatientTitle”要素を見つけます。PropertiesペインのWhere to searchセクションでDraw on Imageをクリックします。ドキュメント上の”kwPatientTitle”要素を選択し、下向き矢印アイコンをクリックして、キーワードの下側を検索範囲に指定し、最も近いセパレーターを探すために最寄りのアイコンを選択します。アンカー要素の詳細はドキュメントを参照してください。
    d. Matchをクリックし、Advanced Designerが”kwPatientTitle”要素の下にセパレーターを見つけたことを確認します。Tree of Hypothesesセクションで各要素名をクリックすると、その仮説を確認できます。
  2. ラベルとセパレーターは患者データに対する信頼性の高い参照要素です。しかし、印刷品質が低いと、ラベルのテキストが認識されなかったり、セパレーターが見つからなかったりする可能性があります。良好な抽出結果を確保するため、ラベルとセパレーターの間にある段落を検索します。段落は均一なテキストブロックであり、一部の境界要素が見つからない場合でも検出できます。
    a. Paragraph検索要素を作成し、“NameAddressParagraph”という名前を付けます。
    b. Text alignmentLeftに変更します。
    c. 患者データは2~5行にわたるため、Line countを2~5に指定します。
    d. 段落の検索範囲を指定します。今回はWhere to searchセクションのAddメニューを使用します。要素は”kwPatientTitle”要素の下、“SeparatorBottom”要素の上に位置する必要があります。
    e. Matchをクリックします。
  3. 次に、患者データを抽出します。“PatientGroup”という名前の新しいグループ要素を作成します。
  4. 患者の氏名は1行または2行にわたる場合があります。複数のインスタンスを取得するには、繰り返しグループを使用します。
    a. Repeating Group検索要素を作成し、“NameGroup”という名前を付けます。最大繰り返し数を2に設定し、要素を任意(オプション)にします。
    b. “NameAddressParagraph”段落の一部である行を検索します。要素の領域を検索範囲として指定するには、ドキュメント画像の下にあるコードエディタアイコンをクリックし、Code EditorSearch Conditionsセクションに次のスクリプトを貼り付けます。
RSA:PatientDataArea.NameAddressParagraph.Rect;
c. 繰り返しグループ内に、1行の文字列を取得するための Character String 要素を作成し、名前を「NameLine」とします。
d. 取得対象のテキストには、大文字・小文字に加え、名前で使用される句読記号が含まれる場合があります。文字セットを2種類に分けて構成します。1つ目のセットには、ラテン文字の大文字・小文字をすべて含めます。ダイアクリティカルマーク付きの文字を追加するには、Unicode のサブレンジを変更するか、Selected characters フィールドに該当文字を直接貼り付けます。
e. もう1つのセットには、次の句読記号を含めます: ,-.()’. 文字列が句読記号だけにならないよう、2つ目のセットの Portion in text, % を 40% に設定します。このプロパティは、特定のセットに属する文字の最大許容割合を定義します。
Note: 既定の設定では、いずれのセットにも含まれない文字を最大30%まで文字列に含めることができます。これにより、一部の文字が誤認識されたり、セットに含まれていない(ダイアクリティカルマーク付きの文字など)場合でも、文字列を検出しやすくなります。この設定は、Properties ペインの Allowed errors の値を変更して調整できます。 f. 単語の一部を検索 オプションを無効にします。
g. “NameLine” 要素の検索範囲を指定します。対象は “kwPatientTitle” 要素の下側で、かつ最も近い位置です。
h. 一致 をクリックし、仮説ツリー を確認します。2つの文字列が検出されますが、2つ目の文字列には患者の住所が含まれています。
i. 住所を検索結果から除外するため、最初の文字列に名と姓の両方が含まれているかを確認します。これは簡単なスクリプトの検索条件を追加することで行えます。“NameLine” の検索要素を選択し、検索条件 のコードエディタを開きます。
j. 最初の行にカンマと空白が含まれている場合、フルネームが含まれているとみなします。フルネームが含まれている場合は、繰り返しグループの2件目の検出は行いません。次のスクリプトをエディタに貼り付けます:
if (NameGroup.HasInstances and LastFound.NameLine.Value.Find(", ") > 0) then DontFind;
k. Match をクリックし、名前が正しく検出されていることを確認します。
  1. 手順 7 で抽出された患者の名前は「Name」field にマッピングされます。患者の住所も抽出してマッピングします。
    a. 「PatientGroup」の内側で、「NameLine」要素と同じ文字セット構成を持つ Character String 検索要素「Address」を作成します。
    b. コードで要素の検索領域を指定します。住所は「NameLine」の下、またはこの要素が見つからない場合は「NameAddressParagraph」要素の最初の行の下に位置している必要があります。
RSA: PatientDataArea.NameAddressParagraph.Rect;
if NameGroup.HasInstances then
  RSA.Top: Max(RSA.Top, LastFound.NameLine.Rect.Bottom);
else
  RSA.Top: PatientDataArea.NameAddressParagraph.Lines[0].Rect.Bottom;
c. 単語の一部を検索 オプションを無効にします。d. 一致 をクリックします。 検索要素の構造は次のとおりです: AD_Tutorial_DE_Patient_Structure
  1. Manage Fields ダイアログを開き、対応する field を作成し、次のように検索要素にマッピングします:
NameTypeSearch element
Name”Patient” グループの Text fieldNameLine
Address”Patient” グループの Text fieldAddress
  1. 新しい field に対して自動的に作成された検索要素を削除します。

病欠証明の種類を抽出する

病欠証明の種類のfieldには2つのチェックボックスがあります。ラベルは「Erstbescheinigung」と「Folgebescheinigung」です。タスクは、これらのラベルを見つけ、その横に塗りつぶされたチェックマークがあるかを確認することです。
  1. 「TypeOfSickNoteGroup」という名前のGroup要素を作成します。要素は任意にします。
  2. 両方のチェックマークに関する情報を保持するために、Repeating Groupの検索要素を作成し、「PrimaryGroup」と名付けます。
    a. 要素グループの検索範囲を制限するのがおすすめです。コードで検索範囲を指定します: 「PatientGroup」要素の右側、かつ(後で作成する)「DoctorAreaGroup」要素の上。注: 将来作成する要素を参照する場合は、必ず「Exists」条件を指定してください。
if PatientGroup.Exists then RSA.Left: PatientGroup.NameGroup.NameLine.Rect.Right;
if DoctorAreaGroup.Exists then RSA.Bottom: DoctorAreaGroup.DataArea.SeparatorTop.Rect.Top;
b. Static Text 検索要素を作成し、名前を「kwPrimary」(検索テキスト:「Erstbescheinigung」)として必須にします。
c. 次の設定で Object Collection 検索要素を作成し、名前を「Checkmark」にします: Type: Checkmark, Checkmark state: Checked, Minimum height: 10, Maximum width: 20, Maximum height: 20。この要素が「kwPrimary」要素の左側かつ最も近い位置にあることを指定します。
d. Match をクリックします。
  1. 「PrimaryGroup」グループをコピーして貼り付けます。コピーしたグループの名前を「SecondaryGroup」に変更します。このグループは必須にします。
  2. 「SecondaryGroup」を編集します。
    a. 「kwPrimary」要素の名前を「kwSecondary」に変更し、検索テキストを「Folgebescheinigung」に設定します。検索領域として、「PrimaryGroup」の「kwPrimary」要素より下側を指定します。
    b. 「Checkmark」要素の検索領域を、「kwSecondary」の左側かつ最も近い位置に指定します。
    c. Object Collection 検索要素は、検索領域内のすべての該当オブジェクトのコレクションを検出します。チェックマークが同一行にある場合、「SecondaryGroup」の「Checkmark」要素がPrimaryのチェックマークも検出してしまう可能性があります。これを避けるため、「SecondaryGroup」の「Checkmark」要素の検索領域からPrimaryのチェックマーク(「PrimaryGroup」の「Checkmark」要素)を除外します。
    d. Match をクリックします。
検索要素の構造は次のとおりです: AD_Tutorial_DE_TypeOfSickNote_Structure
  1. Manage Fields ウィンドウを開き、対応するfieldを作成し、次のように検索要素へマッピングします:
NameTypeSearch element
Type of Sick NoteCheckmark group
Primary「Type of Sick Note」チェックマークグループ内のCheckmarkPrimaryGroup -> Checkmark
Secondary「Type of Sick Note」チェックマークグループ内のCheckmarkSecondaryGroup -> Checkmark
  1. 新しいfieldに対して自動的に作成された検索要素を削除します。

医師データの抽出

これらのドキュメントにある最後のデータブロックを処理します。ここには医師のデータと署名が含まれています。まずデータを格納するボックスを見つけ、その後、医師情報の段落と署名を含む画像領域を抽出します。
  1. “DoctorAreaGroup” という名前の Group 要素を作成します。要素は任意にします。
  2. 目的のボックスにはラベルが含まれています。これを見つけるため、“kwDoctorTitle” という名前の Static Text 要素を作成します(検索テキスト: “Unterschrift des Arztes”)。
  3. “DoctorAreaGroup” グループ内に、“DataArea” という名前の別のグループを作成します。
  4. 医師情報と署名を含むボックスは4本のセパレーターの組み合わせで構成されています。これらは “kwDoctorTitle” 要素の周囲にあります。ただし、“kwDoctorTitle” 要素が見つからない場合でも検出できるように設定する必要があります。“DataArea” グループで、次のプロパティを持つ4つの Separator 検索要素を作成します:
NameOrientationMinimum lengthSearch area
SeparatorRightVertical180”kwDoctorTitle” の右、ページ右端に最も近い
SeparatorLeftVertical180”kwDoctorTitle” の左、“SeparatorRight” の左(“kwDoctorTitle” が見つからなかった場合)、“SeparatorRight” に最も近い、“SeparatorRight” の下(セパレーター名の右側のアイコンをクリックして Top Boundary of Region を選択)、“SeparatorRight” を除外
SeparatorBottomHorizontal200”kwDoctorTitle” の下(-10 ポイントの調整付き)、“SeparatorLeft” の右、“SeparatorRight” の左、ページ下端に最も近い(“kwDoctorTitle” が見つからなかった場合に有用)
SeparatorTopHorizontal200”kwDoctorTitle” の上、“SeparatorLeft” の右、“TypeOfSickNoteGroup” に最も近い、“SeparatorBottom” を除外
これらすべての要素について Fits entirely within search area オプションを無効にします。
  1. 検出したセパレーターに基づいて医師の署名および医師情報の検索領域を手動で指定することもできますが、代わりにセパレーターで囲まれた領域に対応する Region 要素を作成します。“BoxRegion” という名前の Region 検索要素を作成し、検索領域を “SeparatorRight” の左、“SeparatorLeft” の右、“SeparatorBottom” の上、“SeparatorTop” の下に指定します。
  2. “DoctorGroup” という名前の新しいグループを作成します。
  3. 医師の署名を検出するため、“DoctorGroup” 内に次の設定で Object Collection 要素を作成します:
PropertyValue
NameSignature
TypePicture
Minimum width15
Minimum height15
Maximum width600
Maximum height350
Search Conditions section of the Code Editor署名がボックスの外側にはみ出している場合があります。画像全体を検出するため、各方向に100ドットずつ検索領域を拡張します: RSA: DoctorAreaGroup.DataArea.BoxRegion.Rect.GetInflated(100dot,100dot);
  1. ボックス内のテキスト情報を抽出するため、次の設定で Paragraph 要素を作成します:
PropertyValue
NameDoctorInformation
Maximum line count6
Search area”kwDoctorTitle” の上、“Signature” を除外
Search Conditions section of the Code EditorRSA: DoctorAreaGroup.DataArea.BoxRegion.Rect;
  1. Match をクリックし、要素が正しく検出されていることを確認します。
検索要素の構造は次のとおりです: AD_Tutorial_DE_Doctor_Structure
  1. Manage Fields ダイアログを開き、対応するフィールドを作成し、次のように検索要素へマッピングします:
NameTypeSearch element
Doctor Information”Doctor” グループの Text フィールドDoctorInformation
Signature”Doctor” グループの Image フィールドSignature
  1. 新しく作成したフィールドに対して自動生成された検索要素を削除します。

アクティビティのテスト

必要な検索要素とfieldをすべて設定しました。すべてのdocumentsを選択し、Match をクリックして Fields タブに切り替え、ドキュメント画像上のfield領域を確認します。ベストパスの仮説に属する場合にのみ、その領域がfieldに渡される点に注意してください。 結果に問題がなければ、ドキュメント画像上部のコピーiconをクリックして、予測ラベリングを参照ラベリングにコピーします。