메인 콘텐츠로 건너뛰기
이 섹션에서는 코드 편집기를 사용해 만든 몇 가지 추출 규칙 예제를 제공합니다. 코드 편집기는 그래픽 사용자 인터페이스보다 더 높은 유연성을 제공하며, 사용된 구문에 대한 자세한 설명은 Syntax 섹션을 참고하십시오.

명명된 개체의 마지막 인스턴스 찾기

이 예에서는 임대 계약서에서 임차인 조직의 이름을 찾기 위해 추출 규칙을 사용합니다. 이 이름은 다른 모든 조직 이름 뒤에 나타나며, GUI 설정에서는 Instances > First만 선택할 수 있기 때문에 추출할 수 없습니다. 그러나 괄호로 둘러싸인 “Tenant”라는 단어 바로 앞에(또는 가까이에) 있는 조직 이름을 찾도록 추출 규칙을 사용할 수 있습니다. 먼저 보조 검색 요소로서 “Tenant”라는 키워드를 찾습니다. 다음으로, 해당 키워드 앞에 나타나는 조직의 이름을 찾습니다. 이 예에서는 여는 괄호와 따옴표, 총 두 개의 토큰이 사이에 있으므로, 안전 여유를 두기 위해 최대 거리를 세 토큰으로 제한합니다. 사용하는 문서에서 키워드와 조직 이름 사이를 구분하는 토큰이 더 많다면, 이에 따라 이 값을 늘리면 됩니다.

마지막 조직 엔터티 인스턴스를 추출하는 규칙

// We are looking only for one instance
~TenantName
// "Tenant" 키워드 앞에 나타나는 조직 이름을 찾습니다
// 최대 3개의 토큰으로 구분되어야 합니다
// 중간 토큰에는 다른 조직 이름이 포함되어서는 안 됩니다
[ 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)

금액 추출 규칙

// The variable a receives the Money named entity that is not in numbers
// and has not yet been assigned to any other instance of the Money search element
[ a: @NERMoney( same ) ~@Money ~/\d+/ ]+
[ br: '(' ]
// 물음표는 "in numbers"라는 단어가 선택 사항임을 의미합니다
// ^ 및 $ 기호는 전체 string이 정규 표현식과 일치해야 함을 의미합니다
// i 옵션은 일치 시 대소문자를 구분하지 않음을 의미합니다
( [ 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)용 검색 요소를 하나 생성한 뒤, 해당 요소의 코드 편집기에 규칙 코드를 입력하면 됩니다.

2단계 제목을 kw_Heading2 검색 요소로 추출하기 위한 규칙

// 모든 단어가 대문자로 된 최대 5개 단어를 포함하는 번호가 매겨진 2단계 제목을 찾습니다
// 제목 번호는 하나의 토큰으로 찾을 수 있습니다: 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 search 요소로 세그먼트를 추출하는 규칙

// 연속된 두 섹션 제목 사이의 텍스트 세그먼트 찾기
// 1단계 제목도 제외
[ @kw_Heading2 ] [ interval: ~@kw_Heading2 ~@kw_Heading1 ]+
=>
Root.Segment( interval );

예시

구간 추출을 보여 주는 예시 이 예시에서 “3.1 FIRSTLY”와 “3.2 SECONDLY”라는 단어들은 kw_Heading2 검색 요소로 추출된 다음, 서로 연속된 두 kw_Heading2 검색 요소 인스턴스 사이에 있는 텍스트가 Segment 검색 요소의 인스턴스로 추출됩니다.

각 엔티티에 대한 정보 그룹화

이 예에서는 추출 규칙을 사용하여 계약 당사자 각각에 대한 세부 정보가 올바르게 그룹화되도록 합니다(즉, 각 당사자의 이름과 주소가 하나의 그룹 인스턴스에 속하고 여러 인스턴스로 분리되거나, 다른 당사자의 세부 정보와 섞이지 않도록 합니다). 핵심 아이디어는 항상 먼저 나오는 당사자에 대한 식별 정보를 찾는 것입니다. 이는 계약서가 어떻게 작성되었는지에 따라 여러 가지 방식으로 구현할 수 있습니다. 이 예에서는 각 조직의 이름이 항상 먼저 나오고, 그 뒤에 계약에서의 주소와 역할이 온다고 가정합니다. 따라서 다음과 같이 수행합니다.
  1. 조직 이름을 찾고, 발견된 각 이름에 대해 Party_Group 그룹 search element의 새 인스턴스를 생성한 다음, “Organization_Name”이라는 이름의 자식 search element를 채웁니다.
  2. 각 조직 이름 인스턴스로부터, 예를 들어 최대 20개의 토큰 이내에 있는 주소와 역할을 찾고, 해당 조직 이름의 부모인 Party_Group 인스턴스에 접근하여 그 인스턴스의 “Address” 및 “Role”이라는 이름의 자식 search element를 채웁니다.
데이터는 Segmentation activity에서 찾아진 세그먼트 내에서만 검색되며, “Parties_Segment”라는 이름의 Input field로 Extraction Rules activity에 전달됩니다.

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

예시

검색 요소는 다음과 같이 추출됩니다. 그룹화된 데이터 추출 예시 데이터 폼에서 각 회사의 이름, 주소, 역할이 각각 별도의 그룹 인스턴스에 묶여 있는 것도 확인할 수 있습니다. 그룹화된 데이터 field 예시 각 조직의 세부 정보는 대괄호 안에 있는 인스턴스 번호로 표시된 것처럼 함께 그룹화됩니다.

날짜와 시간을 함께 찾기

이 예에서는 추출 규칙을 사용하여 결합된 날짜와 시간을 찾습니다. 먼저, 정규식 값(Value from Regular Expression) 유형의 “Time”이라는 검색 요소를 사용합니다(사용되는 정규식은 [1]?\d:\d{2}\s+(([ap]\.m\.)|([AP]M))?입니다). 다음으로, 그 근처에 위치한 Date라는 명명된 엔터티(named entity)를 찾습니다. 마지막으로, 찾아낸 토큰 시퀀스를 연결(concatenate)하여 결과를 “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 );

예시

시간 및 날짜 추출 예시