Améliorer un index avec des analyseurs et des conditions à jetons

Effectué

Le service Recherche Azure AI est configuré par défaut pour analyser du texte et identifier les jetons qui seront utiles dans votre index. Les bons jetons garantissent que les utilisateurs peuvent trouver rapidement les documents dont ils ont besoin. Dans la plupart des cas, la configuration par défaut produit un index optimal. Toutefois, lorsque vous avez des champs inhabituels ou uniques, vous pouvez configurer exactement la façon dont le texte est analysé.

Ici, vous allez apprendre à définir un analyseur personnalisé pour contrôler la façon dont le contenu d’un champ est divisé en jetons pour l’inclusion dans l’index.

Lorsque le service Recherche AI indexe votre contenu, il récupère du texte. Pour créer un index utile, avec des termes qui aident les utilisateurs à localiser les documents, ce texte doit être traité. Par exemple :

  • Le texte doit être divisé en mots, souvent en utilisant des espaces blancs et des caractères de ponctuation comme délimiteurs.
  • Les mots vides, tels que « the » et « it », doivent être supprimés, car les utilisateurs ne les recherchent pas.
  • Les mots doivent être réduits à leur forme racine. Par exemple, les mots au passé, tels que « exécuté », doivent être remplacés par des mots au présent, tels que « exécute ».

Dans Recherche AI, ce type de traitement est effectué par les analyseurs. Si vous ne spécifiez pas d’analyseur pour un champ, l’analyseur Lucene par défaut est utilisé. L’analyseur Lucene par défaut est un bon choix pour la plupart des champs, car il peut traiter de nombreuses langues et retourner des jetons utiles pour votre index.

Vous pouvez également spécifier l’un des analyseurs intégrés à Recherche AI. Les analyseurs intégrés sont de deux types :

  • Analyseurs de langage. Si vous avez besoin de fonctionnalités avancées pour des langues spécifiques, comme la lemmatisation, la décomposition de mots et la reconnaissance d’entité, utilisez un analyseur linguistique intégré. Microsoft fournit 50 analyseurs pour différentes langues.
  • Analyseurs spécialisés. Ces analyseurs sont indépendants de la langue et utilisés pour des champs spécialisés, comme les codes postaux ou les ID de produit. Vous pouvez, par exemple, utiliser PatternAnalyzer et spécifier une expression régulière pour faire correspondre les séparateurs de jetons.

Qu’est-ce qu’un analyseur personnalisé ?

Les analyseurs intégrés vous offrent de nombreuses options, mais vous pourriez parfois avoir besoin d’un analyseur avec un comportement inhabituel pour un champ. Dans ces cas, vous pouvez créer un analyseur personnalisé.

Un analyseur personnalisé se compose des éléments suivants :

  • Filtres de caractères. Ces filtres traitent une chaîne avant qu’elle atteigne le générateur de jetons.
  • Tokenizers. Ces composants divisent le texte en jetons à ajouter à l’index.
  • Filtres de jetons. Ces filtres suppriment ou modifient les jetons émis par le générateur de jetons.

Examinons ces composants plus en détail.

Filtres de caractères

Certaines opérations doivent peut-être être effectuées sur le texte avant de le fractionner en jetons. Les filtres de caractères permettent ces opérations. Il existe trois filtres de caractères que vous pouvez utiliser :

  • html_strip. Ce filtre supprime les constructions HTML, comme les balises et les attributs.
  • mapping. Ce filtre vous permet de spécifier des mappages qui remplacent une chaîne par une autre. Par exemple, vous pouvez spécifier un mappage qui remplace TX par Texas.
  • pattern_replace. Ce filtre vous permet de spécifier une expression régulière qui identifie les modèles dans le texte d’entrée et comment le texte correspondant doit être remplacé.

Générateurs de jetons

Le générateur de jetons est le composant qui divise le texte en jetons qui seront stockés dans l’index. Les générateurs de jetons décomposent également les mots en leurs formes racines. Souvent, un jeton est un mot unique, mais vous pouvez créer des jetons inhabituels comme :

  • Une adresse postale complète.
  • Une URL ou adresse e-mail complète.
  • Des mots basés sur la grammaire d’une langue spécifique.

Il existe 13 générateurs de jetons différents parmi lesquels choisir. Ces générateurs de jetons sont les suivants :

  • classic. Ce générateur de jetons traite le texte en fonction de la grammaire pour les langues européennes.
  • mot clé. Ce générateur de jetons émet l’entrée entière en tant que jeton unique. Utilisez ce générateur de jetons pour les champs qui doivent toujours être indexés en tant que valeur unique.
  • lowercase. Ce générateur de jetons divise le texte en fonction des caractères hors lettres, puis modifie les jetons résultants en minuscules.
  • microsoft_language_tokenizer. Ce générateur de jetons divise le texte en fonction de la grammaire de la langue que vous spécifiez.
  • modèle. Ce générateur de jetons divise le texte là où il correspond à une expression régulière que vous spécifiez.
  • espace blanc. Ce générateur de jetons divise le texte là où il y a de l’espace blanc.

Remarque

Pour une liste complète des générateurs de jetons, consultez Ajouter des analyseurs personnalisés aux champs de chaîne dans un index Recherche Azure AI dans la section En savoir plus ci-dessous.

Filtres de jeton

Une fois que le générateur de jetons a divisé le texte entrant en jetons, vous pouvez ajouter un traitement supplémentaire, comme la suppression des mots vides ou la suppression des marques de ponctuation. Vous pouvez exécuter ce traitement en spécifiant un filtre de jeton. Il existe quarante filtres de jeton différents disponibles, notamment :

  • Filtres spécifiques à la langue, comme arabic_normalization. Ces filtres appliquent des règles de grammaire propres à la langue pour s’assurer que certaines formes de mots sont supprimées et remplacées par leur racine.
  • apostrophe. Ce filtre supprime toutes les apostrophes d’un jeton et tous les caractères après l’apostrophe.
  • classic. Ce filtre supprime les possessifs et points anglais des acronymes.
  • keep. Ce filtre supprime tout jeton qui n’inclut pas un ou plusieurs mots d’une liste que vous spécifiez.
  • . Ce filtre supprime tout jeton qui est plus long que votre valeur minimale ou inférieure à la valeur maximale spécifiée.
  • trim. Ce filtre supprime tout espace blanc de début et de fin des jetons.

Remarque

Pour une liste complète des filtres de jeton, consultez Ajouter des analyseurs personnalisés aux champs de chaîne dans un index Recherche Azure AI dans la section En savoir plus ci-dessous.

Créer un analyseur personnalisé

Vous créez un analyseur personnalisé en le spécifiant lorsque vous définissez l’index. Pour ce faire, vous devez utiliser du code JSON. Il n’existe aucun moyen de spécifier un index personnalisé dans le portail Azure. Utilisez la section analyzers de l’index au moment de la conception. Vous pouvez inclure un seul générateur de jetons, mais un ou plusieurs filtres de caractères et un ou plusieurs filtres de jetons. Utilisez un nom unique pour votre analyseur et définissez la propriété @odata.type sur Microsoft.Azure.Search.CustomAnalyzer.

Dans cet exemple, un filtre de caractères supprime la mise en forme HTML, un générateur de jetons fractionne le texte en fonction de la grammaire islandaise, et un filtre de jeton supprime les apostrophes :

"analyzers":(optional)[
   {
      "name":"ContosoAnalyzer",
      "@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer",
      "charFilters":[
         "WebContentRemover"
      ],
      "tokenizer":"IcelandicTokenizer",
      "tokenFilters":[
         "ApostropheFilter"
      ]
   }
],
"charFilters":(optional)[
   {
      "name":"WebContentRemover",
      "@odata.type":"#html_strip"
   }
],
"tokenizers":(optional)[
   {
      "name":"IcelandicTokenizer",
      "@odata.type":"#microsoft_language_tokenizer",
      "language":"icelandic",
      "isSearchTokenizer":false,
   }
],
"tokenFilters":(optional)[
   {
      "name":"ApostropheFilter",
      "@odata.type":"#apostrophe"
   }
]

Tester un analyseur personnalisé

Une fois que vous avez défini votre analyseur personnalisé dans le cadre de votre index, vous pouvez utiliser la fonction Analyser le texte de l’API REST pour envoyer du texte de test et vérifier que l’analyseur retourne correctement les jetons. Utilisez n’importe quel outil de test REST pour formuler ces requêtes, comme la populaire application Postman.

Vos requêtes REST de test doivent ressembler à ceci :

POST https://<search service name>.search.windows.net/indexes/<index name>/analyze?api-version=<api-version>
   Content-Type: application/json
   api-key: <api key>

Dans cette requête :

  • Remplacez <search service name> par le nom de votre ressource Recherche AI.
  • Remplacez <index name> par le nom de l’index qui inclut l’analyseur personnalisé.
  • Remplacez <api-version> par le numéro de version de l’API REST.
  • Remplacez <api-key> par la clé d’accès de votre ressource Recherche AI. Vous pouvez obtenir cette clé à partir du portail Azure.

Votre requête doit également inclure un corps JSON comme suit :

{
  "text": "Test text to analyze.",
  "analyzer": "<analyzer name>"
}

Remplacez <analyzer name> par le nom que vous avez spécifié lorsque vous avez défini l’analyseur personnalisé. Veillez à tester avec un grand nombre de valeurs différentes de text jusqu’à ce que vous soyez sûr que l’analyseur personnalisé se comporte comme prévu.

Utiliser un analyseur personnalisé pour un champ

Une fois que vous avez défini et testé un analyseur personnalisé, vous pouvez configurer votre index pour l’utiliser. Vous pouvez spécifier un analyseur pour chaque champ de votre index.

Vous pouvez utiliser le champ analyzer lorsque vous souhaitez utiliser le même analyseur pour l’indexation et la recherche :

"fields": [
 {
   "name": "IcelandicDescription",
   "type": "Edm.String",
   "retrievable": true,
   "searchable": true,
   "analyzer": "ContosoAnalyzer",
   "indexAnalyzer": null,
   "searchAnalyzer": null
 },

Il est également possible d’utiliser un autre analyseur lors de l’indexation du champ et lors de la recherche du champ. Utilisez cette configuration si vous avez besoin d’un ensemble différent d’étapes de traitement lorsque vous indexez un champ quand vous analysez une requête :

"fields": [
 {
   "name": "IcelandicDescription",
   "type": "Edm.String",
   "retrievable": true,
   "searchable": true,
   "analyzer": null,
   "indexAnalyzer": "ContosoIndexAnalyzer",
   "searchAnalyzer": "ContosoSearchAnalyzer"
 },