跳转到主要内容
本节提供了一些使用代码编辑器创建的提取规则示例。与图形用户界面相比,代码编辑器更具灵活性(有关所用语法的详细说明,请参见语法部分)。

查找命名实体的最后一次出现

在此示例中,我们使用提取规则来查找租赁协议中承租方组织的名称。该名称出现在所有其他组织名称之后,而在 GUI 的设置中无法提取,因为那里只能选择 Instances > First。不过,您可以使用提取规则来查找紧邻括号中单词“Tenant”之前的组织名称。 首先,将关键字“Tenant”作为辅助搜索元素定位。然后,查找出现在该关键字之前的组织名称。在本例中,中间隔着两个标记——一个左括号和一个引号——因此我们将距离限制为三个标记,留出一定的安全余量。如果您的文档在关键字与组织名称之间存在更多的中间标记,请相应地增加该数值。

提取最后一个机构实例的规则

// 我们仅查找一个实例
~TenantName
// 查找关键字"Tenant"之前出现的组织名称
// 且与其之间相隔不超过三个标记
// 中间的标记不得包含其他组织名称
[ 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(数字形式:$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 );

示例

展示货币提取的示例

通过关键词查找片段

在此示例中,使用提取规则来查找“分段”活动无法可靠检测到的片段。规则会查找用作片段起始或结束的关键词,并提取其间的文本。 我们假设文档包含全部大写的编号二级标题,例如:1.1 PREMISES、2.3 LIABILITY AND INDEMNITY 等。我们还假设已将一级标题提取到名为“kw_Heading1”的搜索元素中(为简洁起见,省略相应的提取规则)。 首先,我们查找用于开启文档各段的关键词,并将其提取到名为“kw_Heading2”的搜索元素中。接着,将两个相邻关键词之间的文本放入名为“Segment”的搜索元素中。 在当前版本的 Advanced Designer 中,代码编辑器仅适用于用于查找命名实体的搜索元素。作为变通方法,如需通过代码提取诸如标题或片段之类的文本,只需为任一受支持的命名实体(例如,Organization)创建一个搜索元素,并将规则代码输入该元素的代码编辑器中。

将二级标题提取到 kw_Heading2 搜索元素的规则

// 查找包含最多五个全大写单词的编号二级标题
// 标题编号可作为单个标记识别:1.1
[ t1: /\d{1,2}\.\d{1,2}/ ] [ t2: <all_letters_capitalized> ]{1,5}
=>
kw_Heading2( t1 + t2 );
// 标题编号可作为三个独立标记识别:1、点号、1
[ t1: /\d{1,2}/ ] [ t2: '.' ] [ t3: /\d{1,2}/ ] [ t4: <all_letters_capitalized> ]{1,5}
=>
kw_Heading2( t1 + t2 + t3 + t4 );

将片段提取到 Segment 搜索元素的规则

// 查找两个连续章节标题之间的文本段
// 同时排除所有一级标题
[ @kw_Heading2 ] [ interval: ~@kw_Heading2 ~@kw_Heading1 ]+
=>
Root.Segment( interval );

示例

显示片段提取的示例 在此示例中,“3.1 FIRSTLY” 和 “3.2 SECONDLY” 被提取到 kw_Heading2 搜索元素中,随后将任意两个相邻 kw_Heading2 搜索元素之间的文本提取为一个 Segment 搜索元素的实例。

对每个实体的信息进行分组

在此示例中,使用抽取规则来确保协议各方的详细信息被正确分组(即,每一方的名称和地址属于同一组实例,不会被拆分为多个实例,也不会与另一方的详情混杂)。 思路是先找到一条始终位于最前的当事方标识信息。具体做法取决于协议的起草方式,可能有多种实现路径。 在此示例中,我们假设每个组织的名称总是首先出现,随后是其地址以及在协议中的角色。因此,我们将:
  1. 查找组织名称,为找到的每个名称创建一个新的 Party_Group 组搜索元素实例,并填写其名为“Organization_Name”的子搜索元素。
  2. 查找与每个组织名称实例相距不超过(例如)20个 token 的地址和角色,定位作为该组织名称父级的 Party_Group 实例,并在该实例中填写名为“Address”和“Role”的子搜索元素。
数据仅会在由 Segmentation 活动识别并作为名为“Parties_Segment”的 Input field 传递给 Extraction Rules 活动的分段内进行搜索。

提取 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 );

提取“Role”搜索元素的规则

// 对角色重复相同操作
// 使用关键字查找角色
[ 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 );

示例

搜索元素将按如下方式提取: 显示分组数据提取的示例 在数据表单中,您还可以看到每家公司的名称、地址和角色被归入各自独立的组实例: 显示分组数据字段的示例 每个组织的详细信息被分组在一起,如括号中的实例编号所示。

同时查找日期和时间

在此示例中,使用提取规则来查找时间与日期的组合。 首先,使用一个名为“Time”、类型为 Value from Regular Expression 的搜索元素(正则表达式为 [1]?\d:\d{2}\s+(([ap]\.m\.)|([AP]M))?)。然后,查找与其相邻的 Date 命名实体。最后,将找到的标记序列连接起来,并将结果赋给名为“TimeAndDate”的搜索元素。

提取日期与时间组合的规则

// 使用正则表达式搜索元素中的值来查找时间
// 使用 @NERDate 查找靠近时间的日期命名实体
[ time: @Time ~@TimeAndDate ]+ [ t: ~@NERDate ]{0,3} [ date: @NERDate( same ) ]+
=>
// 组合这些值并将它们写入一个字段
// 只能组合连续的标记序列,因此也需要添加辅助标记
TimeAndDate( time + t + date );

示例

时间和日期提取示例