Skip to main content

La sortie des systèmes de conversion de la parole en texte est entièrement constituée de mots, sans ponctuation ni majuscules. Cela rend le balayage visuel des nombres assez fastidieux, surtout dans les transcriptions de dialogues réels car elles contiennent également beaucoup de mots sans signification – comme « heu, ben, bah… » – et la syntaxe ou la grammaire n’est pas toujours correcte. En outre, les outils et techniques de fouille de texte s’attendent souvent, sinon toujours, à ce que les nombres soient représentés par des chiffres décimaux.

C’est pourquoi nous avons décidé d’ajouter une étape de transformation à notre moteur de conversion de la parole en texte afin de convertir tous les nombres prononcés en leur écriture en chiffres.

Ici chez Allo-Media, nous sommes adeptes des logiciels Open Source. Nous avons donc d’abord examiné l’état de l’art des bibliothèques Python pour analyser les mots en nombres. Il y en avait au moins une pour la langue anglaise, mais nous n’en avons trouvé aucune pour le français. Par conséquent, nous avons décidé de construire notre propre bibliothèque et de la contribuer à la communauté.

Nous aurions pu porter la bibliothèque Word2number, mais elle présente quelques défauts :

  • Elle est incapable de détecter par elle-même les limites d’une expression numérique ;
  • Son algorithme est faible (par exemple : w2n.word_to_num(‘hundred five fifty’) == 550) ;
  • Le français présente certaines particularités comme « quatre-vingt-dix-neuf » vs « nonante-neuf ».


Nous avons donc commencé à partir de zéro un analyseur linguistique capable d’identifier les nombres et d’isoler correctement ceux qui se suivent dans une séquence. De plus, nous voulions qu’il soit capable d’analyser différents types de français (par exemple, « soixante-dix » et « septante » pour 70, etc.).

Si vous vous intéressez à la linguistique, « septante » pour 70 et « nonante » pour 90 sont utilisés en Belgique, en Suisse, au Luxembourg, dans la vallée d’Aoste, en français de Jersey et dans une moindre mesure dans les régions françaises de Savoie, de Franche-Comté et même parfois en Lorraine et en Provence (source Wikipedia). Le reste du monde francophone utilise respectivement « soixante-dix » et « quatre-vingt-dix ». L’utilisation de « huitante » et « octante » au lieu de « quatre-vingts » est encore plus restreinte.

Comme l’orthographe française est un sujet délicat, l’analyseur est tolérant et accepte à la fois la réforme orthographique de 1990 et les règles antérieures. Il dispose même d’un mode relaxé optionnel qui analyse « quatre vingt » comme « quatre-vingt » dans les cas où vous préférez utiliser une ponctuation ou des informations de synchronisation pour aider à dissiper les ambiguïtés et compenser une transcription hésitante.

Voici deux exemples de ce à quoi vous pouvez vous attendre :

Python
from text_to_num import text2num
text2num('quatre-vingt-quinze')
95

text2num('nonante-cinq')
95

text2num('mille neuf cent quatre-vingt dix-neuf')
1999

text2num("cinquante et un million cinq cent soixante dix-huit mille trois cent deux")
51578302

text2num('cent cinq cinquante')
AssertionError
Python
from text_to_num import alpha2digit
alpha2digit('cent cinq cinquante')
'105 50'

sentence = (
... "Huit cent quarante-deux pommes, vingt-cinq chiens, mille trois chevaux, "
... "douze mille six cent quatre-vingt-dix-huit clous.\n"
... "Quatre-vingt-quinze vaut nonante-cinq. On tolère l'absence de tirets avant les unités : "
... "soixante seize vaut septante six.\n"
... "Nombres en série : douze quinze zéro zéro quatre vingt cinquante-deux cent trois cinquante deux "
... "trente et un.\n"
... "Ordinaux: cinquième troisième vingt et unième centième mille deux cent trentième.\n"
... "Décimaux: douze virgule quatre-vingt dix-neuf, cent vingt virgule zéro cinq ; "
... "mais soixante zéro deux."
... )
print(alpha2digit(sentence))

Python
842 pommes, 25 chiens, 1003 chevaux, 12698 clous.
95 vaut 95. On tolère l'absence de tirets avant les unités : 76 vaut 76.
Nombres en série : 12 15 004 20 52 103 52 31.
Ordinaux: 5ème 3ème 21ème 100ème 1230ème.
Décimaux: 12,99, 120,05 ; mais 60 02.

Comme vous pouvez le constater, nous prenons en charge les nombres décimaux ainsi que les nombres ordinaux.

L’algorithme est assez robuste et repose sur l’observation que les grands nombres sont structurés comme une somme de puissances décroissantes de mille dans la langue, chaque puissance de mille étant multipliée par un nombre de 1 (peut-être omis) à 999. Le problème est donc « réduit » à reconnaître les puissances de mille (mille, million, milliard) et à pouvoir analyser les nombres de 1 à 999.

Example: trois millions cinq cent vingt-trois mille deux cent quarante -> 3 × 1 000 000 + 523 × 1000 + 240

L’analyse des nombres entre 1 et 999 est plus difficile. L’idée de base est que nous nous attendons à avoir entre 0 et 9 centaines, suivies d’une expression de dizaine (vingt, trente, …) ou pas du tout et de quelques unités facultatives (de 1 à 9) ou d’unités étendues (de 1 à 19). La « partie difficile » consiste à détecter les combinaisons illégales et la fin du nombre.

Au fur et à mesure des besoins, nous pouvons développer des analyseurs pour d’autres langues sur cette base, y compris un analyseur anglais robuste avec toutes les fonctionnalités souhaitées.

La bibliothèque est distribuée sous licence MIT.

Si vous souhaitez obtenir plus de détails ou contribuer, vous pouvez consulter les sources sur GitHub et le guide de contribution.

Si vous voulez simplement l’utiliser, il vous suffit de faire un pip install text2num et la documentation est sur ReadTheDocs.

Profitez-en !

Leave a Reply

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.