跳转到主要内容
我们已经开始从德语文档中提取数据,因此将首先为这些文档配置 Extraction Rules 活动。

准备步骤

  1. Activity Editor中打开“Sick Note DE”活动。
  2. 从文档集里选择其中一个文档。
  3. 确保已启用元素属性的高级模式。要切换该模式的开启或关闭,请点击Properties窗格上的icon。
  4. 所有上传的文档都已进行预识别,查看图像上找到的对象会很有用。点击icon。如果由于屏幕尺寸看不到此icon,请点击icon并选择Recognized Words。相应对象将在文档图像上高亮显示。您可以随时在不同的高亮对象类型之间切换。例如,当查找段落时,切换到Recognized Lines会很有帮助,而切换到Separators将有助于配置Separator搜索元素。
  5. 如果某个搜索元素位于搜索区域之外,将无法找到它。在文档图像的上下文菜单中启用Show search area选项。当您评估匹配结果时,每个元素的搜索区域都会以绿色高亮显示。
请记住,尝试调整搜索元素的高级属性可能有助于提高提取准确性。 我们也建议您经常点击Match来检查提取规则的效果,并比较集合中不同文档的提取结果。您可以通过在其上下文菜单中点击Match Element,在不关联其他元素的情况下测试单个元素。在这种情况下,先前元素的假设质量不会影响匹配结果。

提取患者数据

先来提取患者缺失的数据。为此,我们需要创建若干搜索元素。 建议将与同一实体相关的所有元素归为一组。元素按顺序依次匹配,若未找到最上面的元素,会降低后续元素的假设质量。同时,匹配时各组搜索元素彼此独立处理,并为每个组分别形成假设。这样,您可以控制元素之间的相互影响。还可以通过查看组内元素是否成功找到,一目了然地评估匹配结果。最后,分组还有助于缩短匹配时间。
  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字段中输入“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 alignment更改为Left
    c. 患者数据占用两到五行,因此将Line count设置为 2 到 5。
    d. 指定该段落的搜索区域。这一次,请在Where to search部分使用Add菜单。该元素应位于“kwPatientTitle”元素下方且“SeparatorBottom”元素上方。
    e. 单击Match
  3. 现在我们要提取患者数据。创建一个名为“PatientGroup”的新组元素。
  4. 患者姓名可能占用一到两行。要捕获某个元素的多个实例,我们将使用可重复组。
    a. 创建一个Repeating Group搜索元素,并将其命名为“NameGroup”。将最大重复次数设置为 2。将该元素设为可选。
    b. 我们希望搜索属于“NameAddressParagraph”段落的行。要将元素的区域指定为搜索区域,请单击文档图像下方的代码编辑器图标,并在Code EditorSearch Conditions部分粘贴以下脚本:
RSA:PatientDataArea.NameAddressParagraph.Rect;
c. 在可重复组内,创建一个用于捕获单行字符的Character String元素,并将其命名为“NameLine”。
d. 目标文本可能包含大小写字母,以及姓名中常见的一组标点符号。请配置两个独立的字符集。第一个字符集应包含所有拉丁大小写字母。若要添加带变音符的字符,请更改 Unicode 子范围,或将这些字符直接粘贴到Selected characters字段中。
e. 另一个字符集应包含以下标点符号:,-.()‘。我们不希望字符串仅由标点组成,因此将第二个字符集的**Portion in text, %**设置为 40%。此属性定义来自某一字符集的字符所允许的最大占比。
注意: 默认设置允许字符串包含最多 30% 未包含在任何字符集中的字符。这样即使某些字符识别不正确或不在字符集中(例如带变音符的字符),也能找到相应字符串。您可以在Properties窗格中通过更改Allowed errors值来调整该设置。 f. 禁用 Search for parts of words 选项。
g. 为“NameLine”元素指定搜索区域:位于“kwPatientTitle”元素之下,并与其最近。
h. 点击 Match 并查看 Tree of Hypotheses。您会看到识别出两个字符串。不过,第二个字符串包含患者的地址。
i. 为了将地址从搜索结果中排除,我们将检查第一个字符串是否同时包含名和姓。可以通过添加一个简单的脚本搜索条件来实现。选择“NameLine”搜索元素并打开 Search Conditions 代码编辑器。
j. 我们假设如果第一行包含逗号和空格,则其包含全名。如果包含全名,则不再搜索该可重复组的第二个实例。将以下脚本粘贴到编辑器中:
if (NameGroup.HasInstances and LastFound.NameLine.Value.Find(", ") > 0) then DontFind;
k. 点击 Match,并确保名称被正确识别。
  1. 第 7 步提取的患者姓名将映射到“Name” field。我们还将提取并映射患者地址。
    a. 在“PatientGroup”中,创建一个名为“Address”的 Character String 搜索元素,其字符集配置与“NameLine”元素相同。
    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. 打开管理字段对话框,创建相应字段,并按如下方式将其映射到搜索元素:
名称类型搜索元素
名称“Patient” 组中的文本字段NameLine
Address“Patient” 组中的文本字段Address
  1. 删除为新字段自动创建的搜索元素。

提取病假单类型

“病假单类型”field 有两个复选框,标签为“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. 创建名为“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”元素也可能找到主勾选框。为避免这种情况,请将主勾选框(“PrimaryGroup”的“Checkmark”元素)从“SecondaryGroup”的“Checkmark”元素的搜索区域中排除。
    d. 单击 Match
搜索元素结构应如下所示: AD_Tutorial_DE_TypeOfSickNote_Structure
  1. 打开 Manage Fields 窗口,创建相应的字段,并按如下方式将其映射到搜索元素:
NameTypeSearch element
Type of Sick NoteCheckmark group
PrimaryCheckmark in the “Type of Sick Note” checkmark groupPrimaryGroup -> Checkmark
SecondaryCheckmark in the “Type of Sick Note” checkmark groupSecondaryGroup -> Checkmark
  1. 删除为新字段自动创建的搜索元素。

提取医生数据

现在我们需要处理这些文档上的最后一个数据块。该数据块包含医生的信息和签名。我们将先找到包含数据的框,然后提取包含医生信息的段落以及包含签名的图像区域。
  1. 创建一个名为 “DoctorAreaGroup” 的 Group 元素。将该元素设置为可选。
  2. 要查找的框包含一个标签。为找到它,创建一个名为 “kwDoctorTitle” 的 Static Text 元素(要查找的文本:“Unterschrift des Arztes”)。
  3. 在 “DoctorAreaGroup” 组内,创建另一个名为 “DataArea” 的组。
  4. 包含医生信息和签名的框由四条分隔线构成,位于 “kwDoctorTitle” 元素周围。不过,我们应当这样配置这些元素:即使未找到 “kwDoctorTitle” 元素,程序也能定位它们。在 “DataArea” 组中,创建四个具有以下属性的 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 选项卡,在文档图像上查看字段区域。请注意,只有当区域属于最佳路径中的假设时,才会传递给字段。 当你对结果满意后,点击文档图像上方的复制 icon,将预测标注复制到参考标注。