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

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

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

提取最后一个组织实体实例的规则

// We are looking only for one instance
~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 (in numbers: $2,147.60)

金额提取规则

// 变量 a 接收非数字形式的 Money 命名实体
// 且尚未分配给 Money 搜索元素的任何其他实例
[ a: @NERMoney( same ) ~@Money ~/\d+/ ]+
[ br: '(' ]
// The question mark means that the words "in numbers" are optional
// The ^ and $ symbols mean that the entire string must match the regular expression
// The i option means that matching is case-insensitive
( [ e1: /^in$/i ] [ e2: /^numbers$/i ] [ e3: ':' ]? )?
// The variable b receives the Money named entity that is placed inside brackets
[ b: @NERMoney( same ) ~@Money ]+
=>
Money( a + br + e1 + e2 + e3 + b );

示例

显示金额提取的示例

借助关键字查找片段

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

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

// 查找带编号的二级标题,最多包含五个全大写单词
// The heading number can be found as one token: 1.1
[ t1: /\d{1,2}\.\d{1,2}/ ] [ t2: <all_letters_capitalized> ]{1,5}
=>
kw_Heading2( t1 + t2 );
// The heading number can be found as three separate tokens: 1, dot, 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 字段传递给 Extraction Rules 活动的片段内进行搜索。

用于提取 Organization_Name 搜索元素的规则

// Find organization name and create a new group instance for each
[ 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 ]+
=>
// Access the instance of Party_Group that is the parent of the organization name
// and fill in its Address child
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 ) ]+
=>
// Combine the values to write them in one field
// Only consecutive token sequences can be combined, so the auxiliary token is also added
TimeAndDate( time + t + date );

示例

时间和日期提取示例