> ## Documentation Index
> Fetch the complete documentation index at: https://docs.abbyy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Exemples de règles d'extraction

> Exemples pratiques de règles d'extraction NLP — dernière occurrence d'entité, montants en toutes lettres et en chiffres, détection de segments, regroupement de parties et appariement de dates et d'heures.

Cette section présente quelques exemples de règles d'extraction créées à l'aide de l'éditeur de code, qui offre plus de flexibilité que l'interface utilisateur graphique (voir la section [Syntaxe](/fr/vantage/documentation/advanced-designer/activities/nlp-extraction-rules/code-syntax/syntax) pour une description détaillée de la syntaxe utilisée).

<div id="finding-the-last-instance-of-a-named-entity">
  ## Recherche de la dernière occurrence d’une entité nommée
</div>

Dans cet exemple, une règle d’extraction est utilisée pour trouver le nom de l’organisation du locataire dans un contrat de bail. Ce nom apparaît après ceux de toutes les autres organisations et ne peut pas être extrait à l’aide des paramètres de l’interface graphique, où vous ne pouvez sélectionner que **Instances > First**. Toutefois, vous pouvez utiliser une règle d’extraction pour rechercher le nom de l’organisation qui précède immédiatement le mot « Tenant » entre parenthèses.

D’abord, nous identifions le mot-clé « Tenant » comme élément de recherche auxiliaire. Ensuite, nous cherchons le nom de l’organisation qui apparaît avant ce mot-clé. Dans cet exemple, deux jetons s’interposent — une parenthèse ouvrante et un guillemet — nous limitons donc la distance à trois jetons, en conservant une marge de sécurité. Si vos documents comportent davantage de jetons séparant le mot-clé du nom de l’organisation, augmentez ce nombre en conséquence.

<div id="rule-for-extracting-the-last-organization-instance">
  ### Règle d’extraction de la dernière occurrence d’organisation
</div>

```
// Nous recherchons une seule instance
~TenantName
// Rechercher le nom d'organisation qui apparaît avant le mot-clé "Tenant"
// et qui en est séparé par trois jetons au maximum
// Les jetons intermédiaires ne doivent pas contenir d'autre nom d'organisation
[ t: @NEROrganization ]+ [ ~@NEROrganization ~@kw_Tenant ]{0,3} [ @kw_Tenant ]
=>
TenantName( t );
```

<div id="example">
  ### Exemple
</div>

<Frame>
  <img src="https://mintcdn.com/abbyy/Bmjdl5TjCaidPxKi/images/vantage/advanced-designer/ad_extractionrulesnlp_sampleslastinstance.png?fit=max&auto=format&n=Bmjdl5TjCaidPxKi&q=85&s=388c6b8b78d27784f2c1b9f19dfed147" alt="Extrait de contrat de location montrant le nom de l’organisation du locataire extrait dans l’élément de recherche TenantName" width="1017" height="82" data-path="images/vantage/advanced-designer/ad_extractionrulesnlp_sampleslastinstance.png" />
</Frame>

<div id="extract-an-amount-of-money-stated-both-in-words-and-as-a-numeral">
  ## Extraire un montant indiqué à la fois en toutes lettres et en chiffres
</div>

Dans cet exemple, une règle d’extraction avec des expressions régulières est utilisée pour trouver un montant d’abord écrit en toutes lettres puis en chiffres entre parenthèses, par exemple :

Deux mille cent quarante-sept dollars et soixante cents (\$2,147.60)

Deux mille cent quarante-sept dollars et soixante cents (en chiffres : \$2,147.60)

<div id="rule-for-extracting-an-amount-of-money">
  ### Règle d’extraction d’un montant
</div>

```
// La variable a reçoit l'entité nommée Money qui n'est pas en chiffres
// et qui n'a pas encore été affectée à une autre instance de l'élément de recherche Money
[ a: @NERMoney( same ) ~@Money ~/\d+/ ]+
[ br: '(' ]
// Le point d'interrogation signifie que les mots « en chiffres » sont facultatifs
// Les symboles ^ et $ signifient que la chaîne entière doit correspondre à l'expression régulière
// L'option i signifie que la correspondance ne tient pas compte de la casse
( [ e1: /^in$/i ] [ e2: /^numbers$/i ] [ e3: ':' ]? )?
// La variable b reçoit l'entité nommée Money qui est placée entre parenthèses
[ b: @NERMoney( same ) ~@Money ]+
=>
Money( a + br + e1 + e2 + e3 + b );
```

<div id="example">
  ### Exemple
</div>

<Frame>
  <img src="https://mintcdn.com/abbyy/Bmjdl5TjCaidPxKi/images/vantage/advanced-designer/ad_extractionrulesnlp_samplesmoneywordsdigits.png?fit=max&auto=format&n=Bmjdl5TjCaidPxKi&q=85&s=3e5e6ddce3c026db047f5f1db664221d" alt="Montant extrait sous forme d’une valeur unique combinant la forme en toutes lettres et la forme chiffrée entre parenthèses" style={{ width:"45%" }} width="826" height="297" data-path="images/vantage/advanced-designer/ad_extractionrulesnlp_samplesmoneywordsdigits.png" />
</Frame>

<div id="finding-segments-by-means-of-keywords">
  ## Recherche de segments à l’aide de mots-clés
</div>

Dans cet exemple, des règles d’extraction sont utilisées pour trouver des segments qui ne peuvent pas être détectés de manière fiable par l’activité Segmentation. Les règles recherchent des mots-clés qui marquent le début ou la fin d’un segment et extraient le texte entre les deux.

Nous partons du principe que nos documents comportent des titres de niveau deux numérotés, en majuscules, par exemple : 1.1 PREMISES, 2.3 LIABILITY AND INDEMNITY, etc. Nous supposons également avoir déjà extrait les titres de premier niveau dans un élément de recherche nommé "kw\_Heading1" (la règle d’extraction correspondante est omise par souci de concision).

D’abord, nous recherchons les mots-clés qui commencent chaque paragraphe du document et nous les extrayons dans un élément de recherche nommé "kw\_Heading2". Ensuite, nous plaçons le texte entre deux mots-clés consécutifs dans un élément de recherche nommé "Segment".

Dans la version actuelle d’Advanced Designer, l’éditeur de code n’est disponible que pour les éléments de recherche utilisés pour trouver des entités nommées. En guise de solution de contournement, pour extraire du texte comme des titres ou des segments au moyen de code, créez simplement un élément de recherche pour l’une des entités nommées prises en charge (par exemple, **Organization**) et saisissez le code de la règle dans l’éditeur de code de cet élément.

<div id="rule-for-extracting-second-level-headings-into-the-kw_heading2-search-element">
  ### Règle d’extraction des titres de niveau 2 vers l’élément de recherche kw\_Heading2
</div>

```
// Rechercher un titre de deuxième niveau numéroté contenant jusqu'à cinq mots en majuscules
// Le numéro du titre peut être trouvé sous la forme d'un seul jeton : 1.1
[ t1: /\d{1,2}\.\d{1,2}/ ] [ t2: <all_letters_capitalized> ]{1,5}
=>
kw_Heading2( t1 + t2 );
// Le numéro du titre peut être trouvé sous la forme de trois jetons distincts : 1, point, 1
[ t1: /\d{1,2}/ ] [ t2: '.' ] [ t3: /\d{1,2}/ ] [ t4: <all_letters_capitalized> ]{1,5}
=>
kw_Heading2( t1 + t2 + t3 + t4 );
```

<div id="rule-for-extracting-the-segment-into-the-segment-search-element">
  ### Règle d’extraction du segment vers l’élément de recherche « Segment »
</div>

```
// Trouver le segment de texte entre deux titres de section consécutifs
// Exclure également les titres de premier niveau
[ @kw_Heading2 ] [ interval: ~@kw_Heading2 ~@kw_Heading1 ]+
=>
Root.Segment( interval );
```

<div id="example">
  ### Exemple
</div>

<Frame>
  <img src="https://mintcdn.com/abbyy/Bmjdl5TjCaidPxKi/images/vantage/advanced-designer/ad_extractionrulesnlp_samplessegments.png?fit=max&auto=format&n=Bmjdl5TjCaidPxKi&q=85&s=5a13cbb13cd4c69f1cbc7ab152d07273" alt="Texte du document avec des segments extraits entre des titres consécutifs de deuxième niveau dans l’élément de recherche `Segment`" width="990" height="212" data-path="images/vantage/advanced-designer/ad_extractionrulesnlp_samplessegments.png" />
</Frame>

Dans cet exemple, les mots « 3.1 FIRSTLY » et « 3.2 SECONDLY » sont extraits dans l’élément de recherche `kw_Heading2`, puis le texte compris entre deux occurrences consécutives de l’élément de recherche `kw_Heading2` est extrait dans une instance de l’élément de recherche `Segment`.

<div id="grouping-information-about-each-entity">
  ## Regrouper les informations sur chaque entité
</div>

Dans cet exemple, des règles d’extraction sont utilisées pour garantir que les détails concernant chaque partie à un accord sont correctement regroupés (c’est‑à‑dire que le nom et l’adresse de chaque partie appartiennent à une même instance de groupe, sans être scindés en plusieurs instances ni mélangés avec les détails de l’autre partie).

L’idée est d’identifier une information relative à une partie qui apparaît toujours en premier. Plusieurs approches sont possibles, selon la manière dont les accords sont rédigés.

Dans cet exemple, nous supposons que le nom de chaque organisation apparaît toujours en premier, suivi de son adresse et de son rôle dans l’accord. Par conséquent, nous allons :

1. Rechercher les noms d’organisation, créer une nouvelle instance de l’élément de recherche de groupe `Party_Group` pour chaque nom trouvé, et renseigner son élément de recherche enfant nommé "`Organization_Name`".
2. Rechercher l’adresse et le rôle situés à une distance maximale de, disons, 20 tokens de chaque occurrence du nom de l’organisation, accéder à l’instance de `Party_Group` parente de ce nom et renseigner, dans cette instance, les éléments de recherche enfants nommés "`Address`" et "`Role`".

Les données ne seront recherchées que dans le segment identifié par l’activité Segmentation et transmis à l’activité Extraction Rules en tant que champ d’entrée nommé "Parties\_Segment".

<div id="rule-for-extracting-the-organization_name-search-element">
  ### Règle d’extraction de l’élément de recherche Organization\_Name
</div>

```
// Rechercher le nom de l'organisation et créer une nouvelle instance de groupe pour chacune
[ org: @NEROrganization( same ) ~@Party_Group.Organization_Name @Parties_Segment ]+
=>
// Créer une nouvelle instance de Party_Group et renseigner Organization_Name
Party_Group.Organization_Name( org );
```

<div id="rule-for-extracting-the-address-search-element">
  ### Règle d’extraction de l’élément de recherche Address
</div>

```
// Rechercher maintenant l'adresse séparée par 20 jetons maximum
// du nom de l'organisation
// et qui n'a pas encore été attribuée à l'une des organisations dans Party_Group
[ org: @Party_Group.Organization_Name( same ) ]+
[ ~@NERAddress ]{0,20}
[ t: @NERAddress( same ) ~@Party_Group.Address @Parties_Segment ]+
=>
// Accéder à l'instance de Party_Group qui est le parent du nom de l'organisation
// et renseigner son enfant Address
parent( obj( org )).Address( t );
```

<div id="rule-for-extracting-the-role-search-element">
  ### Règle d’extraction de l’élément de recherche « Role »
</div>

```
// Répéter la même opération pour le rôle
// Pour trouver le rôle, utiliser des mots-clés
[ 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 );
```

<div id="example">
  ### Exemple
</div>

Les éléments de recherche seront extraits comme suit :

<Frame>
  <img src="https://mintcdn.com/abbyy/Bmjdl5TjCaidPxKi/images/vantage/advanced-designer/ad_extractionrulesnlp_samplesgroupdata.png?fit=max&auto=format&n=Bmjdl5TjCaidPxKi&q=85&s=c4b5148ffe843f15615417bd5c837997" alt="Instances de Party_Group extraites, avec le nom de l’organisation, l’adresse et le rôle de chaque partie correctement regroupés" width="1129" height="193" data-path="images/vantage/advanced-designer/ad_extractionrulesnlp_samplesgroupdata.png" />
</Frame>

Dans le formulaire de données, vous pouvez également voir que le nom, l’adresse et le rôle de chaque entreprise sont regroupés dans une instance de groupe distincte :

<Frame>
  <img src="https://mintcdn.com/abbyy/Bmjdl5TjCaidPxKi/images/vantage/advanced-designer/ad_extractionrulesnlp_samplesgroupdatafields.png?fit=max&auto=format&n=Bmjdl5TjCaidPxKi&q=85&s=e3f34a0f4c94ee1f0a2fce081a30b79e" alt="Formulaire de données montrant le nom, l’adresse et le rôle de chaque entreprise sous un numéro d’instance Party_Group distinct" width="1003" height="157" data-path="images/vantage/advanced-designer/ad_extractionrulesnlp_samplesgroupdatafields.png" />
</Frame>

Les informations relatives à chaque organisation sont regroupées, comme l’indiquent les numéros d’instance entre parenthèses.

<div id="finding-the-date-and-time-together">
  ## Recherche conjointe de la date et de l’heure
</div>

Dans cet exemple, une règle d’extraction est utilisée pour repérer une combinaison d’heure et de date.

Tout d’abord, nous utilisons un élément de recherche nommé "Time" de type **Value from Regular Expression** (l’expression régulière utilisée est `[1]?\d:\d{2}\s+(([ap]\.m\.)|([AP]M))?`). Ensuite, nous recherchons une entité nommée **Date** située à proximité. Enfin, nous concaténons les séquences de jetons trouvées et affectons le résultat à un élément de recherche nommé "TimeAndDate".

<div id="rule-for-extracting-date-and-time-combined">
  ### Règle d’extraction de la date et de l’heure combinées
</div>

```
// Utiliser une valeur de l'élément de recherche par expression régulière pour trouver l'heure
// Utiliser @NERDate pour trouver une entité nommée Date proche de l'heure
[ time: @Time ~@TimeAndDate ]+ [ t: ~@NERDate ]{0,3} [ date: @NERDate( same ) ]+
=>
// Combiner les valeurs pour les écrire dans un seul champ
// Seules les séquences de jetons consécutives peuvent être combinées, le jeton auxiliaire est donc également ajouté
TimeAndDate( time + t + date );
```

<div id="example">
  ### Exemple
</div>

<Frame>
  <img src="https://mintcdn.com/abbyy/Bmjdl5TjCaidPxKi/images/vantage/advanced-designer/ad_extractionrulesnlp_samplestimeanddate.png?fit=max&auto=format&n=Bmjdl5TjCaidPxKi&q=85&s=d8549ae06800dee774477d0951e95cb1" alt="Entité nommée concaténée Heure et Date extraite dans un seul élément de recherche TimeAndDate" style={{ width:"45%" }} width="1035" height="228" data-path="images/vantage/advanced-designer/ad_extractionrulesnlp_samplestimeanddate.png" />
</Frame>
