Interprète de texte naturel
- julienmesser
- 1 juin 2024
- 2 min de lecture

J'ai été confronté au problème suivant : 2000 pages de procédures de test sous forme de fichier texte, tellement long que personne ne veut s'en occuper. Je vais présenter ici une approche pour développer un interprète léger et tolérant, on verra aussi quelque chose d'équivalent avec l'intelligence artificielle.
Concept
Chaque fichier est analysé individuellement, ligne par ligne, à l'aide d'une classe Row. Partant du début de la ligne, cette classe Row tente de faire correspondre n'importe quel type d'expression IExpression tant qu'il y a encore du texte à parcourir. Chaque succès produit un nouvel IInterpretedElement, puis l'analyse continue avec le reste du texte de la ligne.

Ci-joint un exemple d'implémentation qui montre l'analyse ("parsing") d'une ligne de texte. On y définit trois expressions de grammaire différentes à l'aide d'un "pattern" Regex: "^Select the menu(.*)$", "^and(.*)$" and "click the button(.*)$".
La chaîne "Select the menu and click the button" est parsée comme il suit:

L'analyse finit après la troisième étape puisqu'il ne reste plus de texte. Dans la réalisation nous avons aussi introduit une classe ExpressionOr qui contient la liste des expressions de la grammaire qui peuvent être permutées. Comme lors de l'analyse, la premiere correspondance est un succès (d'éventuels autres correspondances n'étant pas vérifiés), l'ordre des expressions de la liste est significatif.
Considérations LL(k)
La notation LL(k) est utilisée d'habitude pour qualifier une grammaire et sa complexité, signifiant que l'analyse peut être faite de gauche à la droite. Comme nous utilisons RegEx il est difficile de dire si nous correspondons à la définition mais comme notre grammaire est déterministe (elle permet d'analyser le texte d'une traite) nous pourrions dire qu'il s'agit d'une grammaire LL(1).
Passage à la vitesse suivante: Intelligence Artificielle (IA)
Décrire la grammaire complète devient fastidieux, vérifions si ChatGPT peut nous aider. Pour cela nous allons utiliser le service Azure OpenAI et expérimenter le modèle "completion".
Ici l'approche est différence: dans un premier temps nous allons apprendre l'IA des réponses correctes à une question et ensuite nous laisserons ChatGPT interpréter une ligne de texte. La première étape permet de spécifier la syntaxe de la réponse attendue:

La réponse de GPT est une sorte de format Json pouvant être facilement utilisé dans un programme: { Action: 'Select', Object: 'menu' }, { Action: 'Click', Object: 'button' }.
Vous trouverez le code derrière ce lien: vous aurez besoin de l'adresse URL du serveur ainsi que de la clé Azure.
Conclusion
Comme nous pouvons le voir, il ne faut que quelques lignes de code pour réaliser un interpréteur de texte. Grâce à l'aide de RegEx nul besoin de définir chaque lettre voire chaque mot individuellement. D'une autre part, le modèle de "completion" est encore plus simple à utiliser et produit des résultats spectaculaires.
Comments