Analyse sémantique des nomenclatures de produits et d’activités

Publié le samedi 13 mars 2021 à 20:38 , mis à jour le lundi 15 mars 2021
5 mins

Comme nous l’évoquions il y a quelques mois, nous explorons le domaine de la sémantique appliquée aux nomenclatures pour calculer des proximités entre les différentes classes. Il existe de nombreuses nomenclatures de produits et d’activités que nous avons détaillées dans un article précédemment, et il nous plait d’imaginer que les descriptions de chaque classe puissent nous guider à calculer des distances entre elles. Nous pourrions ainsi représenter sous la forme d’un graphe les différents produits ou activités et concevoir une table de correspondances universelle.

Choix des nomenclatures

Nous sélectionnons les dernières versions des nomenclatures pour lesquelles nous disposons d’une description de chaque classe en langue anglaise.

NomTypeNb de classesLien
HS 2017Produit5387CSV
PRODCOM 2019Produit3919CSV
CPC Rev. 2.1Produit2887CSV
CPA Rev. 2.1Produit3218CSV
NC 2020Produit9484CSV
NACE Rev. 2Activité615CSV
ISIC Rev. 4Activité419CSV
Nomenclatures utilisées

A partir de ces nomenclatures nous allons construire une table unique dans laquelle chaque ligne correspond à une classe d’une nomenclature.

Plongement lexical (word embedding)

Une première approche consiste à réaliser un plongement des mots présents dans chaque description dans un espace vectoriel de manière à calculer ensuite des distance entre les mots, puis entre les descriptions (pouvant être considérées comme des phrases).

Nous allons utiliser la librairie Word2Vec pour générer un modèle à partir de nos données d’entrée. Le code suivant est dérivé du projet Sentence2Vec.

Python

Visualisation de l’espace des mots

Nous allons utiliser le logiciel Projector pour visualiser l’espace vectoriel que nous venons de construire. Préalablement nous devons convertir le modèle dans le format TSV grâce au script word2vec2tensor.

Shell

Plusieurs modes de visualisation sont possibles, nous choisissons une classique analyse en composante principale (ACP) pour un rendu 2D.

Visualisation en 2D du modèle avec Projector. On a sélectionné une partie du modèle au hasard et on voit que les mots sont proches sémantiquement

Variante avec l’utilisation d’un corpus pré-entraîné

L’utilisation d’un corpus représente une approche complémentaire. Au lieu d’apprendre notre modèle à partir de nos désignations comme nous l’avons fait précédemment, nous chargeons directement un modèle déjà entraîné. Nous trouvons plusieurs modèles en open source construits à partir de corpus conséquents tels que wikipedia. L’intérêt semble être que nous pourrons nous appuyer sur des liens sémantiques plus robustes entre les mots, car ceux-ci auront été appris à partir d’une plus large plage d’utilisation.

Le site NLPL propose un large choix de modèles pré-entraînés. Nous sélectionnons le corpus English CoNLL17.

Calcul des distances entre les descriptions par une approche simple

Maintenant que nos mots sont plongés dans un espace vectoriel nous pouvons calculer des distances. Pour notre étude nous souhaitons mesurer des proximités entre les descriptions (chaînes de caractères formées de plusieurs mots).

Nous obtenons un vecteur pour chaque description formé en calculant la moyenne des vecteurs de chaque mot qui le composent.

Principe de calcul du vecteur moyen deux phrases à partir des vecteurs de chaque mot (source)

Nous réalisons ensuite un calcul de similarité cosinus entre les deux vecteurs moyens et nous retenons les similarités supérieures à 90%.

Python

Pondérer les mots pour chaque désignation

Nous essayons d’améliorer le calcul de similarité en implémentant une méthode différente pour déterminer le vecteur associé à une description. Au lieu de prendre simplement le vecteur moyen comme nous l’avons fait précédemment, nous cherchons à calculer une moyenne pondérée des vecteurs de chaque mot.

L’idée c’est que dans une description, certains mots ont plus de « poids » que d’autres. Nous allons donner plus d’importance aux mots qui sont le moins utilisés dans les nomenclatures.

Nous devons commencer par réaliser une analyse de fréquence des mots utilisés (6187 au total) dans les désignations.

Python

Nous modifions la fonction de calcul du vecteur associé à une désignation pour tenir compte de la pondération (que nous définissons comme l’inverse du log de la fréquence).

Python

Premiers résultats

Nous avons généré en guise de test, plusieurs versions d’une première table de correspondance entre la nomenclature NACE Rev.2 (615 classes) et la nomenclature ISIC Rev. 4 (419 classes).

Il se trouve qu’une table de correspondance équivalente de 615 enregistrements est proposée sur les site des Nations Unies, c’est donc l’occasion pour nous de comparer les résultats que nous avons obtenus avec la correspondance « officielle ».

ModèleType de mesureRéglage du seuil de distance cosinus pour obtenir 615 résultatsRéussiteÉchecTaux de prédiction
Appris à partir des nomenclaturesMoyenne simple84 %29032547 %
Appris à partir des nomenclaturesMoyenne pondérée82 %29032547 %
Corpus pré-entraîné CoNLL17Moyenne simple
92 %
24037539 %
Corpus pré-entraîné CoNLL17Moyenne pondérée
89 %
22638937 %
Résultat des 4 méthodes sur la construction d’une table de correspondance NACE/ISIC

Nous avons également réalisé le même travail sur une conversion difficile entre la nomenclature d’activités (ISIC Rev. 4 contenant 419 classes) et une nomenclature de produits (CPC Rev. 2.1. contenant 2886 classes) que nous avons comparée avec la table de conversion officielle contenant 2663 enregistrements.

ModèleType de mesureRéglage du seuil de distance cosinus pour obtenir 2663 résultatsRéussiteEchecTaux de prédiction
Appris à partir des nomenclaturesMoyenne simple79 %589207422 %
Appris à partir des nomenclaturesMoyenne pondérée78 %630203324 %
Corpus pré-entraîné CoNLL17Moyenne simple89 %449221417 %
Corpus pré-entraîné CoNLL17Moyenne pondérée86 %530213320 %
Résultat des 4 méthodes sur la construction d’une table de correspondance ISIC/CPC

Tenir compte de la relation entre les nomenclatures

Les résultats précédents peuvent être améliorés en prenant en compte le type de relation entre les deux nomenclatures, qui peut être une surjection, une injection ou une bijection.

Surjection Injection Bijection. f,g,h applications, X leur Domaine de définition, Y l’ensemble d’arrivée. Source

Dans le cas de la conversion entre la NACE Rev.2 et ISIC Rev. 4 on passe de 615 à 419 classes, il s’agit d’une surjection. Nous pouvons donc adapter notre code pour tirer profit de cette information.

En revanche pour passer de la nomenclature ISIC Rev.4 à la nomenclature CPC Rev. 2.1 on passe de 419 à 2886 classes. Il suffit alors de considérer le problème à l’envers pour se trouver dans le cas d’une surjection comme précédemment.

Nous allons modifier notre algorithme pour qu’une seule correspondance soit retenue (celle dont la proximité sémantique est la plus haute) pour chaque classe de la nomenclature dont la cardinalité est la plus importante. Il n’est plus nécessaire de fixer un seuil de proximité car nos obtenons directement une table du bon nombre d’enregistrements.

Nous obtenons deux nouvelles tables de correspondances dont nous allons analyser les résultats.

Voici les résultats obtenus pour une prédiction de correspondance entre NACE Rev. 2 et ISIC Rev. 4 :

ModèleType de mesureRéussiteÉchecTaux de prédiction
Appris à partir des nomenclaturesMoyenne simple41819768 %
Appris à partir des nomenclaturesMoyenne pondérée39322264 %
Corpus pré-entraîné CoNLL17Moyenne simple28932647 %
Corpus pré-entraîné CoNLL17Moyenne pondérée26535043 %
Résultat des 4 méthodes sur la construction d’une table de correspondance NACE/ISIC (méthode avec prise en compte des cardinalités)

Voici les résultats obtenus pour une prédiction de correspondance entre ISIC Rev. 4 et CPC Rev. 2.1 :

ModèleType de mesureRéussiteÉchecTaux de prédiction
Appris à partir des nomenclaturesMoyenne simple1002166238 %
Appris à partir des nomenclaturesMoyenne pondérée1009165538%
Corpus pré-entraîné CoNLL17Moyenne simple721194327 %
Corpus pré-entraîné CoNLL17Moyenne pondérée828183631 %
Résultat des 4 méthodes sur la construction d’une table de correspondance ISIC/CPC (méthode avec prise en compte des cardinalités)

Conclusion

Ces résultats sont prometteurs et doivent être prolongés par une mise en œuvre sur d’autres tables de passage. Ils nous serviront de « baseline » pour nos prochaines améliorations.

L’apprentissage d’un modèle a donné de meilleurs résultats que l’utilisation d’un corpus pré-entrainé. Il y a donc semble-t-il un intérêt à réaliser un apprentissage spécifique sur des dictionnaires spécialisés. Nous pourrons creuser ce sujet et rechercher des données métiers à intégrer.

Une solution d’apprentissage supervisé est également envisageable, puisque plusieurs tables de correspondances construites manuellement par des experts sont disponibles pour réaliser les apprentissages.

Au delà du projet de construire de passer automatiquement d’une nomenclature à une autre, nous souhaitons développer sur le même principe des graphes de proximités entre produits, produits et activités et entre activités. Dans cette tâche, les analyses sémantiques nous semblent très intéressantes, en utilisation conjointe avec d’autres méthodes. Les résultats obtenus dans cette étude sont de ces fait, particulièrement encourageants.