メインコンテンツへスキップ
ドイツ語のドキュメントからのデータ抽出はすでに開始しているため、まずこれらのドキュメント向けに 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 … “というラベルの付いたフィールド内にあります。ドキュメント上でこのテキストを見つけ、抽出したいデータを検索するための基準として使用する必要があります。
    a. キーワードはStatic Text検索要素を使用して見つけることができます。Create Elementをクリックし、ドロップダウンリストからStatic Text要素を選択します。名前を”kwPatientTitle”に変更します。
    b. PropertiesペインのText to findフィールドに”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%に設定します。このプロパティは、特定のセットに属する文字の最大許容割合を定義します。
既定の設定では、どのセットにも含まれない文字を文字列に最大30%まで含めることができます。これにより、一部の文字が誤って認識された場合や、セットに含まれていない場合(ダイアクリティカルマーク付きの文字など)でも、文字列を見つけやすくなります。この設定は、PropertiesペインのAllowed errors値を変更して調整できます。
f. Search for parts of wordsオプションを無効にします。
g. “NameLine”要素の検索領域を指定します。“kwPatientTitle”要素の下で、かつそれに最も近い位置です。
h. Matchをクリックし、Tree of Hypothesesを確認します。2つの文字列が見つかっていることが分かります。ただし、2つ目の文字列には患者の住所が含まれています。
i. 検索結果から住所を除外するため、最初の文字列に名と姓の両方が含まれているかどうかを確認します。これは、簡単なスクリプト検索条件を追加することで実現できます。“NameLine”検索要素を選択し、Search Conditionsコードエディターを開きます。
j. 1行目にカンマと空白が含まれていれば、その行にはフルネームが含まれているとみなします。フルネームが含まれている場合は、繰り返しグループの2つ目のインスタンスを検索したくありません。エディターに次のスクリプトを貼り付けます:
if (NameGroup.HasInstances and LastFound.NameLine.Value.Find(", ") > 0) then DontFind;
k. Matchをクリックし、名前が正しく見つかっていることを確認します。
  1. 手順7で抽出した患者の氏名は、“Name”フィールドにマッピングされます。患者の住所も抽出してマッピングします。
    a. “PatientGroup”内に、“NameLine”要素と同じ文字セット構成を持つ”Address”という名前のCharacter String検索要素を作成します。
    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. Search for parts of wordsオプションを無効にします。
d. Matchをクリックします。
検索要素の構造は次のようになります。 AD_Tutorial_DE_Patient_Structure
  1. Manage Fieldsダイアログを開き、対応するフィールドを作成し、次のように検索要素にマッピングします。
NameTypeSearch element
Name”Patient”グループ内のText fieldNameLine
Address”Patient”グループ内のText fieldAddress
  1. 新しいフィールド用に自動的に作成された検索要素を削除します。

疾病証明書の種類の抽出

疾病証明書の種類フィールドには、2つのチェックボックスがあります。ラベルは”Erstbescheinigung”と”Folgebescheinigung”です。ここでのタスクは、これらのラベルを見つけてから、その横に塗りつぶされたチェックマークがあるかどうかを確認することです。
  1. “TypeOfSickNoteGroup”という名前のGroup要素を作成します。要素はオプションにします。
  2. 2つのチェックマークに関する情報を保存するため、Repeating Group検索要素を作成し、“PrimaryGroup”という名前を付けます。
    a. 要素グループの検索領域を制限するのは良い方法です。コードを使って検索領域を指定します。“PatientGroup”要素の右側で、“DoctorAreaGroup”要素(これは後で作成します)の上です。 **Note: **将来の要素を使用する場合は、必ず”Exists”条件を指定してください。
if PatientGroup.Exists then RSA.Left: PatientGroup.NameGroup.NameLine.Rect.Right;
if DoctorAreaGroup.Exists then RSA.Bottom: DoctorAreaGroup.DataArea.SeparatorTop.Rect.Top;
b. “kwPrimary”という名前のStatic Text検索要素を作成し(検索するテキスト: “Erstbescheinigung”)、必須にします。
c. “Checkmark”という名前のObject Collection検索要素を、次の設定で作成します: 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ウィンドウを開き、対応するフィールドを作成して、次のように検索要素にマッピングします。
NameTypeSearch element
Type of Sick NoteCheckmark group
Primary”Type of Sick Note”チェックマークグループ内のCheckmarkPrimaryGroup -> Checkmark
Secondary”Type of Sick Note”チェックマークグループ内のCheckmarkSecondaryGroup -> Checkmark
  1. 新しいフィールド用に自動的に作成された検索要素を削除します。

医師データの抽出

これらのドキュメントの最後のデータブロックを処理する必要があります。ここには医師のデータと署名が含まれています。まずデータが入っているボックスを見つけ、その中から医師の情報が記載された段落と、署名が含まれる画像領域を抽出します。
  1. “DoctorAreaGroup” という名前の Group 要素を作成します。この要素は任意とします。
  2. 探すボックスにはラベルが含まれています。これを見つけるために、“kwDoctorTitle” という名前の Static Text 要素を作成します (検索するテキスト: “Unterschrift des Arztes”) 。
  3. “DoctorAreaGroup” グループの中に、“DataArea” という名前のグループをもう 1 つ作成します。
  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 ダイアログを開き、対応する field を作成して、次のように検索要素にマッピングします。
NameTypeSearch element
Doctor Information”Doctor” グループの Text fieldDoctorInformation
Signature”Doctor” グループの Image fieldSignature
  1. 新しい field 用に自動的に作成された検索要素を削除します。

アクティビティのテスト

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