menu icon

Quand les requêtes sont très verbeuses

Dans cet article, nous présentons une méthode simple pour réécrire les requêtes utilisateurs afin qu'un moteur de recherche basé sur des mots clés puisse mieux les comprendre. Cette méthode est très utile dans le contexte d'une recherche vocale ou une conversation avec un chatbot, contexte dans lequel les requêtes utilisateur sont généralement plus verbeuses.

Quand les requêtes sont très verbeuses

Il arrive que les requêtes qu’un moteur de recherche reçoit soient très verbeuses. Dans le contexte d’une recherche vocale ou d’une conversation avec un chatbot les requêtes reçues par le système ne sont plus de mots clés, comme habituellement dans la barre de recherche, mais des questions posées en langage parlé.

Dans ce contexte, une requête aussi simple que chocolat peut être posée de la manière, beaucoup plus verbeuses, suivante : Je recherche du chocolat s'il vous plaît. Pouvez-vous m'aider avec cela ?. Si nous utilisons un moteur de recherche classique, fonctionnant avec des mots clés, nous avons a faire à beaucoup de mots de liaison ou de “bruit” dans la requête. Il faut donc idéalement réécrire la requête afin d’obtenir des résultats pertinents et non pas du “bruit” en tant que réponse de la part du moteur.

Je recherche du chocolat s’il vous plaît. Pouvez-vous m’aider avec cela ?

=

text: chocolat

Il existe plusieurs manières pour traiter ces cas. Nous pouvons, bien entendu, utiliser des algorithmes et technologies très avancées dans le domaine de l’apprentissage automatique (machine learning) ou du traitement automatique du langage naturel (NLP). Mais nous pouvons également faire plus simple et parfois tout aussi efficace avec quelques astuces, bases de données et technologies Open Source.

Nous avons mis en place et retenu chez Adelean deux méthodes basées sur la technologie Elasticsearch. Une première à l’aide de la base de connaissances Wikidata et du Percolator que nous présenté au Meetup Search & Data, à la conférence Haystack et à la conférence Elastic Community Conference et allons détailler dans un article séparé.

La deuxième, encore plus simple, est détaillée ici et est basée sur Elasticsearch et les analyseurs de texte disponibles dans Elasticsearch et Apache Lucene. Nous avons utilisé cette méthode pour interfacer un moteur de recherche avec un assistant vocal et l’avons présentée à la conférence Berlin Buzzwords et à Elastic Community Conference

Voici les prérequis pour faire fonctionner cette méthode :

  • Indexer toutes les requêtes utilisateur et construire ainsi une base de connaissances avec la typologie de toutes les requêtes que le moteur a vu en entrée
  • Configurer Elasticsearch de manière à identifier les tokens les plus fréquents dans les requêtes utilisateurs. Les tokens peuvent être des mots ou même des expressions. Ces tokens les plus fréquents sont souvent les fameux mots de liaison qu’on cherche à supprimer de la requête initiale.
  • Prévoir un parseur ou une étape préliminaire de réécriture de la requête utilisateur avant l’envoi à votre moteur de recherche

Dans notre exemple (voir la photo) nous avons mis en évidence les tokens (mots ou expressions) dans les situations suivantes :

Illustration du dashboard Kibana

  1. Dans la première colonne, les requêtes utilisateur sont indexées sans traitement des mots de liaison (stop words). Sans surprise, les mots comme du, de, des remontent en premier et sont donc candidats à la liste des mots à exclure.
  2. Dans la deuxième colonne, nous avons appliqué l’exclusion des mots de liaison standard pour le français. Nous voyons apparaître des mots s’apparentant à des mots de liaison dans notre contexte. Notre contexte étant un assistant vocal pour le e-commerce, des mots comme cherche, voudrais, acheter, besoin ressortent.
  3. Une fois notre liste de mots de liaison “métier” appliqués à la configuration, nous commençons à retrouver les mots “pertinents” à envoyer au moteur de recherche.
  4. Et pour finir, dans cette quatrième colonne nous avons appliqué un analyseur de type “shingle” pour identifier les expressions de liaison les plus fréquentes. Nous retrouvons, toujours sans surprise étant donné notre contexte, des expressions comme je cherche, je voudrais, j'ai besoin.

Voici maintenant quelques détails techniques sur l’implémentation de ce système.

Requête Elasticsearch

La requête Elasticsearch derrière le dashboard de l’image est similaire à celle-ci :

POST test_query_rewriting/_search
{
  "size": 0,
  "aggs": {
    "top_terms_texte": {
      "terms": {
        "field": "texte",
        "size": 10
      }
    },
    "top_terms_texte_standard_stopwords": {
      "terms": {
        "field": "texte.standard_stopwords",
        "size": 10
      }
    },
    "top_terms_texte_extra_stopwords": {
      "terms": {
        "field": "texte.extra_stopwords",
        "size": 10
      }
    },
    "shingles": {
      "terms": {
        "field": "texte.shingles",
        "size": 10
      }
    }
  }
}

Pour qu’une requête de ce type puisse fonctionner, il faut indiquer "fielddata": true dans les différents mapping, comme nous allons le voir par la suite. Nous sommes en sécurité pour le faire car il s’agit d’un index relativement petit, contenant les requêtes utilisateur. Si nous avons beaucoup d’utilisateurs, nous pouvons mettre en place des stratégies de segmentation ou d'échantillonnage.

Le mapping Elasticsearch

Nos quelques champs indexés sont définis de la manière suivante :

{
...
"mappings": {
  "_doc": {
    "properties": {
      "texte": {
        "type": "text",
        "analyzer": "rebuilt_french",
        "fielddata": true,
        "fields": {
          "standard_stopwords": {
            "type": "text",
            "analyzer": "rebuilt_french_stop",
            "fielddata": true
          },
          "extra_stopwords": {
            "type": "text",
            "analyzer": "rebuilt_french_stop_extra",
            "fielddata": true
          },
          "shingles": {
            "type": "text",
            "analyzer": "shingles",
            "fielddata": true
          }
        }
      }
    }
  }
}
...
}

Vous remarquerez la précision "fielddata": true, dont vous trouverez plus d’explications dans la documentation de référence Elasticsearch.

La définition des analyseurs

Et voici pour finir la définition des différents analyseurs :

{
...
"analysis": {
  "filter": {
	"french_elision": {
	  "type": "elision",
	  "articles_case": true,
	  "articles": [
		"l", "m", "t", "qu", "n", "s", "j", "d", "c",
		"jusqu", "quoiqu", "lorsqu", "puisqu"
	  ]
	},
	"french_stop": {
	  "type": "stop",
	  "stopwords": "_french_"
	},
	"extra_stop": {
	  "type": "stop",
	  "stopwords": [
		"cherche",
		"acheter",
		"besoin",
		"voudrais",
		"kilo"
	  ]
	},
	"shingle": {
	  "type": "shingle",
	  "min_shingle_size": 2,
	  "max_shingle_size": 2,
	  "output_unigrams": false
	}
  },
  "analyzer": {
	"rebuilt_french": {
	  "tokenizer": "standard",
	  "filter": [
		"french_elision",
		"lowercase",
		"asciifolding"
	  ]
	},
	"rebuilt_french_stop": {
	  "tokenizer": "standard",
	  "filter": [
		"french_elision",
		"lowercase",
		"asciifolding",
		"french_stop"
	  ]
	},
	"rebuilt_french_stop_extra": {
	  "tokenizer": "standard",
	  "filter": [
		"french_elision",
		"lowercase",
		"asciifolding",
		"french_stop",
		"extra_stop"
	  ]
	},
	"shingles": {
	  "tokenizer": "standard",
	  "filter": [
		"french_elision",
		"lowercase",
		"asciifolding",
		"shingle"
	  ]
	}
  }
}
...
}

Nous retrouvons notamment notre définition de mots de liaison “métier” dans le token filter extra_stop ainsi que notre configuration du token filter shingle

Nous avons décrit dans cet article une méthode simple pour identifier les mots de liaison (“stop words” ou “bruit”) dans les requêtes provenant d’un assistant vocal ou d’un chatbot et à destination d’un moteur de recherche classique basé sur les mots clés.

Nous vous avons partagé tous les détails et références pour l’implémentation d’un prototype dans votre environnement, mais si vous souhaitez avoir notre accompagnement n’hésitez pas à nous solliciter via l’onglet Contact. Les consultants et développeurs Adelean peuvent vous accompagner pour tous vos projets moteur de recherche dans le cadre d’un assistant vocal, d’un chatbot ou dans un contexte général.

Assurer la scalabilité d’un moteur de recherche pour des milliers de magasins en ligne – retour sur la conférence ElasticON

10/03/2023

Retour sur la présentation Assurer la scalabilité d’un moteur de recherche pour des milliers de magasins en ligne par Roudy Khoury et Aline Paponaud à ElasticON 2023

Lire l'article

Question answering, une approche plus humaine à nos recherches sur all.site.

19/01/2023

Tout sur les Question-Answering et comment l'implémenter en utilisant flask et elasticsearch.

Lire l'article

Retour d’Expérience - Fine-tuning d’un modèle VOSK

05/01/2022

all.site est un moteur de recherche collaboratif. Il fonctionne comme Bing ou Google mais il a l’avantage de pouvoir aller plus loin en indexant par exemple les contenus média et en organisant les données de systèmes comme Slack, Confluence ou l’ensemble des informations présentes dans l’intranet d’une entreprise.

Lire l'article

Retour d’Expérience - Indexation des transcriptions de fichiers média

17/12/2021

all.site est un moteur de recherche collaboratif. Il fonctionne comme Bing ou Google mais il a l’avantage de pouvoir aller plus loin en indexant par exemple les contenus média et en organisant les données de systèmes comme Slack, Confluence ou l’ensemble des informations présentes dans l’intranet d’une entreprise.

Lire l'article

De la voix au texte, la puissance de l'écosystème Open Source - retour sur la conférence OSXP

01/12/2021

Retour sur la présentation "De la voix au texte, la puissance de l'écosystème Open Source", donnée à la conférence OSXP (Open Source Experience) par Lucian Precup et Aline Paponaud: lien de l'enregistrement vidéo et résumé des idées présentées.

Lire l'article

La revue de presse du 25 Novembre 2021

25/11/2021

Bientôt le weekend, bientôt l'hiver, alors une petite revue de presse pour occuper vos longues soirées...

Lire l'article

Nouveau meetup Search & Data - E-Commerce Search et Open Source

28/10/2021

La cinquième édition du meetup Search and Data est dédiée au search e-commerce et à l'open source. Un bel agenda pour cette édition de rentrée et de reprise.

Lire l'article

Expédition vers Synonym Graph dans Elasticsearch

21/04/2021

Dans cet article, nous expliquons comment nous sommes passés des anciens filtres de synonymes d'Elasticsearch aux nouveaux filtres de type graphe, les Synonym Graph Token Filter.

Lire l'article

Enrichir les données et réécrire les requêtes avec le percolator Elasticsearch

26/04/2019

Cet article est une transcription de notre intervention cette semaine à Haystack - une conférence sur l'amélioration de la pertinence des moteurs de recherche. Nous avons montré une méthode permettant d'enrichir et de réécrire les requêtes des utilisateurs en utilisant Wikidata et le percolator Elasticsearch.

Lire l'article

A2 le moteur qui sublime Elasticsearch

13/06/2018

Elasticsearch est une technologie ouverte qui permet aux intégrateurs de construire des solutions toujours plus innovantes et puissantes.

Lire l'article