Langage de requête XML pour les scripts d’extraction FlexiCapture : créez des requêtes Contain avec les éléments Required, Optional et Except, les distances et la recherche floue.
Une requête définit les mots ou combinaisons de mots qu’un document doit contenir. Le langage de requête utilisé par les scripts d’extraction est basé sur XML.
Voici à quoi peut ressembler une requête simple :
<Request>
<Query>
<Contain>
<Required>
<Form><Text>first</Text></Form>
</Required>
<Optional>
<Form><Text>second</Text></Form>
</Optional>
<Except>
<Query>
<Contain>
<Required>
<Form><Text>third</Text></Form>
</Required>
<Optional>
<Form><Text>fourth</Text></Form>
</Optional>
</Contain>
</Query>
</Except>
</Contain>
</Query>
</Request>
<Request> — Il s’agit de l’élément racine d’une requête.
<Query> — Il s’agit d’une requête de base. Une requête de base contient une arborescence de requête qui définit les conditions auxquelles doit répondre la combinaison de mots recherchée. Une requête de base peut faire partie d’une combinaison de formes de mots dans une requête de niveau supérieur. Il s’agit d’un élément Obligatoire.
<Contain> — Spécifie les mots ou combinaisons de mots qu’un document doit contenir. Une requête ne peut contenir qu’un seul élément <Contain>. Il s’agit d’un élément Obligatoire. Cet élément peut inclure n’importe quel nombre des éléments suivants, dans n’importe quel ordre :
<Required> — Spécifie une forme de mot ou une sous-requête qu’une combinaison de mots doit contenir. Il s’agit d’un élément facultatif.
<Optional> — Spécifie une forme de mot ou une sous-requête qu’une combinaison de mots peut contenir. Il s’agit d’un élément facultatif.
<Except> — Spécifie une forme de mot ou une sous-requête qu’une combinaison de mots ne doit pas contenir. Il s’agit d’un élément facultatif.
Chacun des éléments ci-dessus doit contenir l’un des éléments suivants :
<Query> — Spécifie si une chaîne de formes de mots doit être incluse dans la combinaison de mots ou en être exclue.
<Form> — Spécifie si une forme de mot doit être incluse dans une combinaison de mots ou en être exclue.
L’élément <Contain> doit contenir au moins un élément <Required> ou <Optional>.
Attribut MinCount pour définir le nombre minimal d’éléments dans une combinaison de formes de mots
Le nombre minimal d’éléments dans une combinaison de formes de mots peut être spécifié dans l’attribut MinCount. Chaque élément est soit une forme de mot, soit une chaîne de formes de mots renvoyée par la sous-requête. La valeur par défaut de cet attribut est 1. La valeur de ce paramètre ne doit pas être supérieure au nombre total d’éléments <Required> et <Optional> dans la combinaison de formes de mots donnée.Ce paramètre est utile lorsqu’une combinaison de formes de mots contient un ou plusieurs éléments <Optional>.
Tout d’abord, voici un exemple de requête qui recherche soit le premier, soit le deuxième terme
<Query>
<Contain>
<Optional>
<Form><Text>first</Text></Form>
</Optional>
<Optional>
<Form><Text>second</Text></Form>
</Optional>
</Contain>
</Query>
La requête suivante indique au programme de trouver au moins trois des quatre mots spécifiés dans la requête, dont deux sont obligatoires :
<Query>
<Contain MinCount="3">
<Optional>
<Form><Text>US</Text></Form>
</Optional>
<Required>
<Form><Text>President</Text></Form>
</Required>
<Optional>
<Form><Text>Barack</Text></Form>
</Optional>
<Required>
<Form><Text>Obama</Text></Form>
</Required>
</Contain>
</Query>
La requête ci-dessus trouvera les expressions suivantes : « US President Barack Obama », « President Barack Obama » et « US President Obama ».
Attribut KeepOrder pour un ordre fixe des éléments dans une combinaison de formes de mots
Pour indiquer que l’ordre des éléments dans une combinaison de formes de mots est fixe, vous pouvez utiliser un attribut KeepOrder de type Boolean. La valeur par défaut de cet attribut est false.
Voici un exemple de requête qui indique que l’ordre des éléments est fixe :
<Query>
<Contain KeepOrder="true">
<Required>
<Form><Text>first</Text></Form>
</Required>
<Required>
<Form><Text>second</Text></Form>
</Required>
<Required>
<Form><Text>third</Text></Form>
</Required>
</Contain>
</Query>
La combinaison « first third second third » ne correspondra pas à la requête, même si celle-ci contient bien une suite de mots dans l’ordre requis.KeepOrder s’applique également à tous les éléments <Except>. Les mots correspondant aux éléments <Except> d’une requête ne doivent pas apparaître entre les mots qu’ils séparent dans la requête ; en revanche, ils peuvent apparaître à toute autre position en dehors des suites de mots de la requête à ordre fixe.Par exemple, si nous modifions la requête ci-dessus en plaçant la forme de mot « second » dans un élément <Except> au lieu de <Required>, un document contenant la combinaison de formes de mots « first third second » correspondra à la requête (mais la forme de mot « second » ne sera pas incluse dans le résultat). Si nous modifions ensuite la requête ci-dessus en supprimant l’attribut KeepOrder, un document contenant la combinaison de formes de mots « first third second » ne sera pas inclus dans le résultat, car la forme de mot « second » ne doit apparaître nulle part dans le texte du document.
Attributs MinDistance et MaxDistance pour spécifier des distances
Les attributs MinDistance et MaxDistance définissent les distances minimale et maximale entre des mots dans une requête. Ces attributs n’ont pas de valeurs par défaut. Si l’un des deux attributs n’est pas spécifié, aucune restriction de distance ne s’applique.La distance entre les mots est mesurée en nombre de mots et correspond à la différence entre les positions des deux mots concernés. La distance entre deux mots voisins est égale à 1 ; la valeur minimale de chacun de ces attributs est donc 1. MaxDistance doit être supérieur ou égal à MinDistance.La distance entre deux suites de mots est calculée comme suit. Si les suites ne se chevauchent pas, elle correspond à la différence entre la position du mot le plus à gauche dans la suite de droite et la position du mot le plus à droite dans la suite de gauche. Si les suites se chevauchent, la distance est considérée comme égale à 0.Par exemple, dans l’expression « The quick brown fox jumped over the lazy dog », la distance entre les suites « quick fox » et « lazy dog » est de 4, et la distance entre les suites « quick fox » et « brown lazy dog » est de 0.Pour les éléments <Except>, la distance entre les mots est calculée comme suit :
Si KeepOrder=“true,”, le mot ne doit pas apparaître à la distance spécifiée des mots voisins dans la suite (c.-à-d. les mots entre lesquels il apparaît dans la requête). En même temps, la distance entre les voisins de l’élément <Except> doit se situer dans la plage spécifiée.
Si KeepOrder=“****false,”, le mot ne doit pas apparaître à la distance spécifiée de tout autre mot de la suite.
Exemple 1 :
<Query>
<Contain KeepOrder="true" MaxDistance="2">
<Required>
<Form><Text>sodium /Text></Form>
</Required>
<Except>
<Form><Text>tetraborate</Text></Form>
</Except>
<Optional>
<Form><Text>carborate</Text></Form>
</Optional>
<Optional>
<Form><Text>sulfate</Text></Form>
</Optional>
<Required>
<Form><Text>decahydrate</Text></Form>
</Required>
</Contain>
</Query>
Cette requête trouvera des expressions telles que « sodium carborate decahydrate » et « sodium sulfate decahydrate ».
Exemple 2 :
<Query>
<Contain KeepOrder="false" MaxDistance="2">
<Required>
<Form><Text>sodium /Text></Form>
</Required>
<Except>
<Form><Text>tetraborate</Text></Form>
</Except>
<Optional>
<Form><Text>carborate</Text></Form>
</Optional>
<Optional>
<Form><Text>sulfate</Text></Form>
</Optional>
<Required>
<Form><Text>decahydrate</Text></Form>
</Required>
</Contain>
</Query>
Cette requête trouvera uniquement « sodium sulfate decahydrate », car le mot « tetraborate » est placé dans les balises <Except></Except> et la distance maximale entre « tetraborate » et « sodium » est de deux mots.
<Text> — Élément facultatif contenant le texte Unicode d’une forme de mot.
Si aucun mot du texte n’est spécifié, n’importe quel mot correspondra à la requête, à condition qu’il satisfasse aussi à la requête d’attributs, qui est alors obligatoire.
Des conditions de recherche supplémentaires pour une forme de mot peuvent être spécifiées dans les attributs de la balise <Form>.
Attribut SearchType pour spécifier le type de recherche de formes de mots
Le type de recherche de formes de mots peut être spécifié dans l’attribut SearchType de la balise <Form>. Cet attribut peut prendre les valeurs suivantes :
AllFormsSearch – Le programme recherchera toutes les formes du mot spécifié.
ExactSearch – Le programme recherchera uniquement la forme spécifiée du mot.
PrefixSearch – Le programme recherchera toutes les formes de mots commençant par la chaîne spécifiée.
FuzzySearch – Le programme effectuera une recherche approximative du mot spécifié. FuzzySearch peut être utile si vous avez des raisons de penser que vos textes peuvent contenir des erreurs d’OCR et qu’ExactSearch ne fonctionnera pas. FuzzySearch ne peut être utilisé que pour les mots contenant au moins 3 caractères. Pour les mots de 3 à 5 caractères, FuzzySearch autorise 1 erreur d’OCR. Pour les mots de plus de 5 caractères, FuzzySearch autorise jusqu’à 2 erreurs d’OCR.
FuzzyPrefixSearch – Le programme effectuera une recherche approximative de tous les mots commençant par la chaîne spécifiée.
L’attribut SearchType est facultatif et, par défaut, prend la valeur AllFormsSearch.
Attribut CaseSensitive pour les recherches sensibles à la casse
Pour les recherches sensibles à la casse, l’attribut CaseSensitive de la balise <Form> peut être utilisé. Cet attribut est facultatif et vaut false par défaut.
Voici une requête qui illustre l’utilisation des attributs de la
Cette requête recherchera l’acronyme WHO exactement sous cette forme, ce qui permet d’éviter un grand nombre de résultats redondants contenant « who », « whom » ou « whose ».
élément <Attributes> permettant d’obtenir les attributs des formes de mots
Une requête sur les attributs des formes de mots est une expression logique construite à l’aide des opérateurs AND, OR et NOT. NOT est un opérateur unaire, tandis que AND et OR sont n-aires. Les opérandes de cette expression logique sont des valeurs de type Bool. Cette expression logique s’écrit sous forme d’arborescence. Le résultat de la requête sera l’ensemble des formes de mots, dans le texte d’un document, qui satisfont cette expression logique.Pour obtenir les attributs des formes de mots, on utilise un élément <Attributes>. Cet élément peut contenir les éléments suivants :
<Attribute> — Cet élément contient le texte de l’attribut de mot requis. Il s’agit d’une feuille dans l’arborescence de l’expression logique.
<Or> — L’opérateur OR est un nœud de l’arbre.
<And> — L’opérateur AND est un nœud de l’arbre.
<Not> — L’opérateur NOT est un nœud de l’arbre.
L’élément <Not> est construit de la même manière que l’élément <Attributes> et ne peut contenir qu’un seul des éléments ci-dessus.Les éléments <Or> et <And> doivent contenir au moins deux des éléments ci-dessus.La balise <Attribute> possède un attribut facultatif, SearchType, qui spécifie le type de recherche d’attribut. Cet attribut peut prendre les valeurs suivantes :
ExactSearch — Le programme recherchera l’attribut exactement sous la forme spécifiée dans la requête.
PrefixSearch — Le programme recherchera tous les attributs commençant par le texte spécifié.
La recherche d’attributs est toujours sensible à la casse. L’attribut SearchType est défini sur ExactSearch par défaut.Supposons que nous ayons un document dans lequel nous avons déjà identifié :
des objets NER (en appelant la fonction ExtractNerObjects)
des formes de mots issues d’un dictionnaire utilisateur nommé « dictionary » (en appelant la fonction ExtractWordsFromUserDictionary)
tous les objets qui satisfont l’expression régulière passée en paramètre (en appelant la fonction ExtractRegularExpression)
Supposons également que la collection résultante de ces objets soit nommée « regExp ».
Le nom de la collection peut être utilisé dans les requêtes XML exécutées sur le document indexé. La collection résultante elle-même est accessible par son nom.
Une requête d’attribut de forme ressemblera alors à ceci :
<Query>
<Contain>
<Required>
<Form>
<Attributes>
<Attribute>regExp1</Attribute>
</Attributes>
</Form>
</Required>
<Required>
<Form>
<Attributes>
<And>
<Attribute>NerOrg1</Attribute>
<Not>
<Attribute> dictionary1</Attribute>
</Not>
</And>
</Attributes>
</Form>
</Required>
</Contain>
</Query>
Cette requête recherchera une expression de deux mots, dans laquelle le premier mot doit correspondre à l’expression régulière spécifiée et le second être un nom d’organisation autorisé.Les chiffres placés après les noms d’attribut servent à distinguer les mots requis dans les objets détectés composés de plusieurs mots et indexés avec les attributs correspondants. Par exemple, une expression régulière nommée « date » peut trouver une date au format « May 31, 2019 ». Dans ce cas, date 1 correspondra au mot « May », date 2 correspondra à « 31 » et date 3 correspondra à « 2019 ».
élément <FormSet> pour obtenir un ensemble de formes de mot
Une requête portant sur plusieurs formes de mot est définie à l’aide d’un élément <FormSet>.Ce type de requête combine plusieurs requêtes à une seule forme à l’aide de OR. Il équivaut à une requête <Query> dans laquelle toutes les sous-requêtes sont des requêtes facultatives sur des formes de mot.Avec une requête <FormSet>, vous pouvez toutefois spécifier une requête d’attribut commune à toutes les formes. Cela rend les recherches plus efficaces lorsque ExactSearch est utilisé pour rechercher toutes les formes de mot, qu’une requête d’attribut est définie pour chaque forme et que toutes ces requêtes d’attribut ont un fragment commun.Un élément <FormSet> contient les éléments suivants :
<Attributes> — Il s’agit d’un élément facultatif qui contient une requête sur les attributs de la forme. Cette requête est combinée avec les requêtes sur les attributs de la forme à l’aide de AND.
<Form> — Il s’agit d’un élément obligatoire qui contient une requête sur une forme de mot. Un élément <FormSet> doit contenir au moins un élément <Form>.
Le résultat d’une requête d’extraction d’adresse sera une chaîne de caractères contenant le premier mot du pays, le premier mot de la rue, le premier mot de la ville, le premier mot de l’État et le premier mot du code ZIP (dans cet ordre, à condition qu’ils ne soient pas espacés de plus de 5 mots).La chaîne de mots consécutifs qui compose un composant (par ex. un nom de rue) est également numérotée dans l’indice, à partir de 1.
Le résultat d’une requête d’extraction d’adresse est enregistré dans le champ répétitif xmlQueryResult :
this.RunQueryAndSaveToField( xmlQuery, “query”, “xmlQueryResult” );