banniere aubay

< Tous les articles

Juin 9, 2020

GAO² : Gestion des Appels d’Offres Assistés par Ordinateur

 

Pour une ESN d’envergure, comme Aubay, il est important de pouvoir traiter rapidement les Appels d’Offres (AOs) émis par ses clients et d’y apporter une réponse la plus pertinente possible. Pour répondre efficacement aux besoins de chacun, Aubay est divisé en différentes « Business Units (BUs) » qui s’occupent en général d’un secteur bien particulier. Chaque BU est autonome et a sa propre équipe commerciale pour gérer ses AOs.

Cependant il existe une catégorie de BUs qui dépend des autres pour recevoir des AOs, les BUs transverses. Ces BUs ne sont pas rattachées à un secteur d’activité précis mais plutôt à une compétence, comme par exemple la BU Data, la BU Agile, la BU UX/UI. En général, ce sont elles qui vont prendre le relai sur des appels d’offres spécifiques qui font appel à des compétences particulières.Aujourd’hui, ce travail d’aiguillage est essentiellement humain.L’objectif de la classification est d’utiliser le NLP afin de pouvoir traiter les AOs directement à la source sur le portail client, puis de les renvoyer aux BUs transverses qui seront les plus aptes à traiter les AOs concernés.

Cette partie du projet se concentre uniquement sur la classification des Appels d’Offres. Nous vous montrerons d’autres aspects dans nos prochains articles à venir.Avant tout, un petit rappel du NLP s’impose.

Qu’est-ce que le NLP ?

 

Le NLP, ou Natural Language Processing autrement appelé en français TAL, ou Traitement Automatique du Langage naturel, est une branche très importante du monde de l’Intelligence Artificielle. L’Intelligence Artificielle permet de faire apprendre aux machines ce que le cerveau humain peut comprendre facilement. Ici dans le cas du NLP, on donne la capacité à un programme de comprendre le langage humain.

Des exemples valent mieux que des explications. Voici quelques exemples pratiques que nous utilisons chaque jour:

  • Les spams: toutes les boîtes mails utilisent un filtre antispam et cela fonctionne avec le filtrage bayésien en référence au théorème de Bayes. Cette méthode consiste à comparer les mots d’un mail, chaque terme est associé à une probabilité qui correspond au nombre de fois où ce mot apparaît dans un SPAM. Si la probabilité dépasse un certain seuil, alors le message est considéré comme un message indésirable.
  • Google Traduction: vous avez probablement tous utilisé ce système. Cette technologie utilise de nombreux algorithmes dont du NLP. Ici, le défi n’est pas de traduire le mot, mais de garder le sens d’une phrase dans une autre langue.
  • Siri créé par Apple ou Google Assistant utilisent du NLP pour traduire du texte transcrit en du texte analysé afin de vous donner une réponse adaptée à votre demande.

Le NLP couvre de nombreuses disciplines et spécialités qui ont pour but de faire de l’analyse syntaxique et sémantique d’un texte. La partie sémantique du NLP, celle qui cherche à comprendre le sens d’un texte est très souvent appelée Natural Language Understanding, ou NLU.

Figure 2: Les différentes disciplines du NLP

Par ailleurs, il est important de comprendre que pour avoir un algorithme performant, il faut un grand nombre de données afin d’éviter les biais. Il existe en tout 3 types d’ensembles de données :

  • Ensemble de données d’entrainement (training set)
  • Ensemble de données de validation (validation set)
  • Ensemble de données de test (testing set)

On forme notre modèle de Machine Learning avec le jeu d’entrainement, on ajuste les paramètres à l’aide du jeu de validation et on teste les performances avec le jeu de test.

Figure 3: Architecture Générale – Dataset

Implémentation de la classification

 

Pour effectuer la classification nous avons utilisé un pipeline comprenant principalement :

  • Un Lemmatizer français
  • Un filtreur de mots
  • Un Vectorizer de type « bag-of-words »
  • Un Ngram_range
  • Un Stochastic Gradient Descent Classifier (ou SGDClassifier)

 

Qu’est-ce qu’un Pipeline ?

 

Pour faire de la recherche de données dans un document, on passe souvent par une chaîne d’étapes de traitement de données, par exemple, la sélection des fonctionnalités, la normalisation et la classification. C’est là qu’intervient le « pipeline » qui permet de créer un « tuyau » composé des étapes que nous voulons.

Lemmatisation

 

Le texte brut va d’abord être prétraité en étant transformé en tokens (mots). Ces mots vont ensuite être modifiés pour retrouver leur forme canonique, c’est la lemmatisation.Exemple :

  • Luisent -> luire : le verbe conjugué revient à l’infinitif
  • Claires -> clair : on retire le genre et le nombre

Certains mots peuvent avoir plusieurs formes de lemme selon le contexte. Par exemple, porte peut renvoyer au verbe porter, au substantif féminin porte, ou à l’adjectif porte.Avec peu de données, rassembler les mots qui ont la même forme canonique a permis de réduire le nombre de mots avec peu d’occurrences dans nos AOs. La lemmatisation nous a donc permis de gagner beaucoup en performance.*

Filtrage de mot

 

Nous avons ensuite filtré une grande partie des mots présents dans les AOs pour ne garder que les mots dit « pivots ». Ces 350 mots ont été sélectionnés car ils avaient un impact très fort sur la classification et qu’ils n’étaient pas ambigus pour le « classifier ». En effet, avec peu de données, de nombreux mots influençaient le résultat à tort par manque d’exemples.Cette étape pourra probablement être retirée à terme quand il y aura suffisamment d’AOs pour les entrainements.

Vectorizer

 

Nous ne pouvons pas travailler directement avec du texte lorsque nous utilisons des algorithmes de Machine Learning. Au lieu de cela, nous devons convertir le texte en chiffres. Pour cela nous avons utilisé la technique du « Bag-of-words »Le modèle du « Bag-of-words » est couramment utilisé dans les méthodes de classification des documents. Ici, c’est la fréquence d’occurrence de chaque mot qui est utilisée comme une « feature » pour entrainer un « classifier ».Les 3 principaux vectorizer sont :

  • Hashing Vectorizer: convertit une collection de texte en matrice d’occurrence de mots. Il est très utile car il prend peu de mémoire sur un large dataset et n’a donc pas besoin de stocker un dictionnaire de vocabulaire en mémoire. A la place, il applique un « hashing » pour encoder les mots en index numériques.
  • Count Vectorizer: convertit une collection de texte en matrice de mots comptés. Pour résumer, il compte le nombre de fois qu’il voit un mot dans le document et utilise cette valeur en tant que poids.
  • TF-IDF vectorizer: convertit une collection de texte brute en matrice TF-IDF. TF-IDF, signifie « Term Frequency times Inverse Document Frequency ». C’est une méthode de pondération souvent utilisée pour fouiller un texte en profondeur. Concrètement, cette méthode évalue l’importance d’un mot contenu dans un document. Le poids du mot augmentant proportionnellement au nombre d’occurrences du mot dans le document et varie en fonction de la fréquence du mot dans le corpus.

Figure 4: Exemple de Count Vectorizer

Dans notre implémentation, nous avons utilisé l’HashingVectorizer de Scikit-Learn (Bibliothèque libre Python) qui a l’avantage d’être très peu demandeur en mémoire.Ngram_rangeUn Ngram_range correspond à la longueur d’une séquence et donc de la longueur de la séquence sur laquelle le modèle va apprendre. Par exemple, ngram_range=(1,2) pour la phrase « Je mange une pomme » donnerait 7 séquences qui sont les suivantes :

  • Je
  • Je mange
  • Mange
  • Mange une
  • Une
  • Une pomme
  • Pomme

 

SGDClassifier

 

Une fois les mots tokenisés, lemmatisés, filtrés, puis transformés en features nous avons utilisé le Stochastic Gradient Descent Classifier de Scikit-learn pour effectuer la classification à proprement parlé.Nous avons choisi ce « classifier » car il faisait déjà partie d’un ensemble d’algorithmes connus pour leurs performances dans un contexte de classification de texte. Ensuite, lors de nos tests en interne, il s’est révélé comme étant le plus efficace et aussi l’un des plus rapide (avec nos données).

Figure 5: Exemple de résultat du classifier

Explication des prédictions du modèle

 

Nous avons utilisé Eli5 (Explain me like i’m 5) pour mapper les coefficients du « classifier » sur les noms des features afin d’obtenir une explication des décisions de l’algorithme.Eli5 nous permet d’obtenir un classement des mots les plus impactant par BU, très utile pour avoir une idée globale du fonctionnement de notre « classifier ». On peut voir par exemple que les mots « Scrum » et « Master » ont beaucoup d’importance pour la BU Agile et que le mot « Hadoop » est très souvent utilisé dans les AOs de la BU Data. Ces résultats font sens car, en effet, ces mots permettent de facilement lever l’ambiguïté concernant la nature d’un AO.

Figure 6: Poids des mots pour chaque Bus

Plus le mot est vert, plus il influe positivement sur la BU correspondante. Inversement, plus le mot est rouge, plus il influe négativement sur la BU correspondante.Pour chacun des AOs, on additionne les poids des mots pour cet AO pour chaque BU puis on désigne celui qui est le plus apte à recevoir l’AO par la valeur de cette somme. Si tous les poids sont négatifs, alors c’est un AO divers (BUs « classiques »), sinon on prend la BU dont la somme est la plus positive.

Figure 7: Somme de tous les poids de chaques AOs « test » pour chaque BUs

Par ailleurs, Eli5 nous permet d’avoir le détail d’une prédiction en particulier. Ici on peut retrouver tous les mots qui ont influé sur la décision de notre « classifier » (positivement comme négativement) et à quel degré

.

Dans l’exemple de l’AO de la figure 8, on retrouve de nombreuses fois le terme « architecture » (en vert). Cependant, on retrouve aussi des mots clefs souvent utilisés dans le contexte d’un AO Data (en rouge). Comme le « classifier » a calculé que le mot « architecture » avait un plus gros poids que les autres mots, le modèle va placer l’AO dans la BU architecture.Pouvoir expliquer le raisonnement et le fonctionnement des algorithmes était essentiel. Être capable d’identifier les failles et les erreurs de nos modèles nous a permis de gagner beaucoup de temps lors du développement. Cette fonctionnalité est aussi très rassurante pour l’utilisateur final qui sera plus enclin à faire confiance à notre module de classification.

RPA

 

Nous avons travaillé conjointement avec l’équipe RPA (Robotic Process Automation) pour que cet outil de classification voit le jour en production. Il fallait pouvoir automatiser le processus de collecte des AOs et gérer leur distribution une fois la prédiction effectuée.Pour cela, il faut que le robot puisse utiliser notre module. Le modèle final a été exporté dans une API REST.Au final, le robot RPA peut se connecter aux différents portails client Aubay, récupérer les AOs du jour, utiliser l’API REST de notre module de classification, et envoyer un mail à la BU concernée par l’AO.

Conclusion

 

Compte tenu des bons résultats obtenus grâce à nos différents modèles, la partie classification couplée au RPA est passé en production en Octobre 2019. Ce module sera amélioré au fil du temps afin de s’étendre à l’ensemble des BUs.

Partagez cet article
Pascal

Pascal

Ingénieur NLP

< Retour à tous les articles

Aller au contenu principal