50 votes

Comment lire les valeurs des nombres écrits sous forme de mots ?

Comme nous le savons tous, les nombres peuvent être écrits soit en chiffres, soit appelés par leur nom. Alors qu'il existe de nombreux exemples pour convertir 123 en cent vingt-trois, je n'ai pas trouvé de bons exemples pour convertir l'inverse.

Quelques mises en garde :

  1. cardinal/nominal ou ordinal : "un" et "premier"
  2. les fautes d'orthographe courantes : "forty"/"fourty"
  3. centaines/milliers : 2100 -> "vingt et cent" et aussi "deux mille et cent".
  4. séparateurs : "onze cent cinquante deux", mais aussi "onze cent cinquante-deux" ou "onze cent cinquante-deux", etc.
  5. les expressions familières : "la trentaine"
  6. des fractions : un tiers, deux cinquièmes
  7. Noms communs : "une douzaine", "la moitié".

Et il existe probablement d'autres réserves possibles qui ne sont pas encore répertoriées. Supposons que l'algorithme doive être très robuste, et même comprendre les fautes d'orthographe.

Quels domaines/articles/études/algorithmes dois-je lire pour apprendre à écrire tout cela ? Où se trouvent les informations ?

PS : Mon analyseur final devrait comprendre 3 langues différentes, l'anglais, le russe et l'hébreu. Et peut-être qu'à un stade ultérieur, d'autres langues seront ajoutées. L'hébreu a aussi des nombres masculins/féminins, comme "un homme" et "une femme" ont un "un" différent - "ehad" et "ahat". Le russe présente également certaines de ses propres complexités.

Google fait un excellent travail dans ce domaine. Par exemple :

http://www.google.com/search?q=two+mille+un+cents+plus+cinq+douze+et+quatre+cinquièmes+en+décimal

(l'inverse est également possible http://www.google.com/search?q=999999999999+en+francais )

0 votes

Cela ne s'applique peut-être pas autant aux recettes, mais n'oubliez pas les mots comme score, décennie, siècle, etc. Similaire à douzaine, brut, moitié comme vous l'avez déjà noté.

0 votes

"fourty" n'est pas un mot dans aucune variante de l'anglais ! L'OED a quelques mentions de l'orthographe "fourty", mais elles datent de 1707 ou avant.

2 votes

Même si "quarante" n'est pas un mot, les gens le confondent souvent avec un mot. Et je dois analyser ce que les gens écrivent, pas les mots "appropriés".

46voto

MarkusQ Points 15612

J'étais en train de jouer avec un analyseur PEG pour faire ce que vous voulez (et je le posterai peut-être plus tard comme réponse séparée) quand j'ai remarqué qu'il y a un algorithme très simple qui fait un travail remarquable avec les formes communes de nombres en anglais, espagnol et allemand, au moins.

En travaillant avec l'anglais par exemple, vous avez besoin d'un dictionnaire qui associe les mots aux valeurs de la manière la plus évidente :

"one" -> 1, "two" -> 2, ... "twenty" -> 20,
"dozen" -> 12, "score" -> 20, ...
"hundred" -> 100, "thousand" -> 1000, "million" -> 1000000

...et ainsi de suite

L'algorithme est juste :

total = 0
prior = null
for each word w
    v <- value(w) or next if no value defined
    prior <- case
        when prior is null:       v
        when prior > v:     prior+v
        else                prior*v
        else
    if w in {thousand,million,billion,trillion...}
        total <- total + prior
        prior <- null
total = total + prior unless prior is null

Par exemple, cela se déroule comme suit :

total    prior      v     unconsumed string
    0      _              four score and seven 
                    4     score and seven 
    0      4              
                   20     and seven 
    0     80      
                    _     seven 
    0     80      
                    7 
    0     87      
   87

total    prior      v     unconsumed string
    0        _            two million four hundred twelve thousand eight hundred seven
                    2     million four hundred twelve thousand eight hundred seven
    0        2
                  1000000 four hundred twelve thousand eight hundred seven
2000000      _
                    4     hundred twelve thousand eight hundred seven
2000000      4
                    100   twelve thousand eight hundred seven
2000000    400
                    12    thousand eight hundred seven
2000000    412
                    1000  eight hundred seven
2000000  412000
                    1000  eight hundred seven
2412000     _
                      8   hundred seven
2412000     8
                     100  seven
2412000   800
                     7
2412000   807
2412807

Et ainsi de suite. Je ne dis pas que c'est parfait, mais pour un travail rapide et sale, ça marche plutôt bien.


Je réponds à votre liste spécifique sur l'édition :

  1. cardinal/nominal ou ordinal : "un" et "premier" -- il suffit de les mettre dans le dictionnaire
  2. anglais/britannique : "fourty"/"forty" -- idem
  3. des centaines/milliers : 2100 -> "vingt et cent" et aussi "deux mille et cent" -- fonctionne tel quel
  4. séparateurs : "onze cent cinquante-deux", mais aussi "onze-cent cinquante-deux" ou "onze-cent cinquante-deux", et ainsi de suite définissez simplement le "mot suivant" comme étant le plus long préfixe qui correspond à un mot défini, ou jusqu'au prochain non-mot si aucun ne correspond, pour commencer
  5. les colloques : "trentenaire" travaux
  6. fragments : "un tiers", "deux cinquièmes" Euh, pas encore...
  7. Noms communs : "une douzaine", "la moitié" fonctionne ; vous pouvez même faire des choses comme "une demi-douzaine".

Le numéro 6 est le seul pour lequel je n'ai pas de réponse toute faite, et ce à cause de l'ambiguïté entre les ordinaux et les fractions (en anglais du moins), ajoutée au fait que ma dernière tasse de café a été beaucoup de il y a quelques heures.

0 votes

Si vous ajoutez un code pour signaler les mots non définis, vous pouvez améliorer la situation au fil du temps. Mais, qu'en est-il du milliard, qui, je pense, est défini comme un nombre différent aux États-Unis et en Europe ? 1.000.000.000 pour les Etats-Unis.

0 votes

Il n'y a pas de bon moyen programmatique de gérer un milliard à partir d'un corpus limité. Si vous extrayez un nombre d'un plus grand corpus de texte, vous pouvez chercher des corrélations (par exemple, "couleur" ou "mètres"), mais en général, vous vous retrouvez dans une impasse.

0 votes

@MarkusQ : Regarder l'ensemble du texte ne fonctionne pas toujours. Par exemple, de nombreux Canadiens utilisent les orthographes britanniques, mais utilisent les définitions américaines de million, milliard, etc.

11voto

Ce n'est pas une question facile, et je ne connais pas de bibliothèque pour le faire. Je pourrais m'asseoir et essayer d'écrire quelque chose comme ça un jour. Je le ferais en Prolog, Java ou Haskell, cependant. Pour autant que je puisse voir, il y a plusieurs problèmes :

  • Tokenisation : parfois, les chiffres sont écrits onze cent cinquante-deux, mais j'ai vu onze cent cinquante-deux ou onze cent cinquante-deux et ainsi de suite. Il faudrait mener une enquête sur les formes réellement utilisées. Cela pourrait être particulièrement délicat pour l'hébreu.
  • Fautes d'orthographe : ce n'est pas si difficile. Vous disposez d'un nombre limité de mots, et un peu de magie de la distance de Levenshtein devrait faire l'affaire.
  • Des formes alternatives, comme vous l'avez déjà mentionné, existent. Cela inclut les nombres ordinaux/cardinaux, ainsi que quarante/quarante et...
  • ... des noms communs ou des phrases couramment utilisées et des NE (entités nommées). Voulez-vous extraire 30 de la guerre de Trente Ans ou 2 de la Seconde Guerre mondiale ?
  • Les chiffres romains, aussi ?
  • Des colloques, tels que "trente et quelques" et "trois euros et des éclats d'obus", que je ne saurais pas comment traiter.

Si cela vous intéresse, je pourrais faire un essai ce week-end. Mon idée est probablement d'utiliser UIMA et de faire de la tokénisation avec, puis de poursuivre la tokénisation/désambiguïsation et enfin de traduire. Il pourrait y avoir d'autres problèmes, voyons si je peux trouver d'autres choses intéressantes.

Désolé, ce n'est pas encore une vraie réponse, juste une extension à votre question. Je vous ferai savoir si je trouve/écris quelque chose.

Au fait, si vous vous intéressez à la sémantique des chiffres, je viens de trouver une article intéressant par Friederike Moltmann, discutant de certaines questions concernant l'interprétation logique des chiffres.

0 votes

Merci ! Beaucoup d'informations très utiles. J'utilise Treetop PEG pour commencer à écrire un analyseur syntaxique, j'ai d'abord commencé avec des regexps mais c'était trop limitatif. C'est principalement pour analyser des recettes de cuisine, comme : "deux cuillères à soupe de sel"

0 votes

En ce qui concerne la distance levenshtein, excellente idée. je me demande si je dois lui faire connaître le clavier qwerty pour les quatre langues différentes ...

0 votes

Cet article est un non-sens, ou du moins relève plus de la philosophie que de la linguistique. Il confond grammaire et sémantique, pose la question et contourne largement les problèmes intéressants pour étayer sa "théorie". Par exemple, le simple fait de remplacer "planètes" par "chaises" a des effets étonnants sur certains de ses exemples.

11voto

Greg Hewgill Points 356191

J'ai un peu de code que j'ai écrit il y a un moment : texte2num . Cela fait un peu ce que vous voulez, sauf que cela ne gère pas les nombres ordinaux. Je n'ai pas encore utilisé ce code pour quoi que ce soit, il n'a donc pas été testé !

1 votes

J'ai fini par utiliser une légère modification du code de Greg avec de bons résultats, donc il est quelque peu testé ;-)

1 votes

Ce lien est cassé. Lorsque vous créez un lien vers une ressource externe, pensez à inclure le code correspondant dans votre réponse afin qu'il reste disponible.

1 votes

@recursive merci, j'ai mis à jour le lien vers une ressource permanente. C'est probablement un peu trop long pour être inclus dans la réponse.

7voto

hulkingtickets Points 598

Utilisez le programme Python pattern-en bibliothèque :

>>> from pattern.en import number
>>> number('two thousand fifty and a half') => 2050.5

0 votes

La question est étiquetée "agnostique". Une bibliothèque python n'est pas une solution agnostique au niveau du langage.

1 votes

Malheureusement, il n'est pas compatible avec Python 3, et il ne semble pas qu'il le sera.

5voto

fmsf Points 13399

Vous devez garder à l'esprit que l'Europe et l'Amérique comptent différemment.

Norme européenne :

One Thousand
One Million
One Thousand Millions (British also use Milliard)
One Billion
One Thousand Billions
One Trillion
One Thousand Trillions

Ici est une petite référence à ce sujet.


Une façon simple de voir la différence est la suivante :

(American counting Trillion) == (European counting Billion)

2 votes

J'ai juste pensé que je devais signaler que les Britanniques n'utilisent pas le Milliard, ce sont les Français. Nous (les Britanniques) n'utilisons pas non plus Million, Billion etc. au pluriel. "Il y avait des millions d'enquiquineurs !"

0 votes

Toutes les références que j'ai trouvé à milliard étaient pour l'anglais britannique, désolé alors.

0 votes

Milliard est un vieux mot que personne n'utilise dans la pratique. on le trouve occasionnellement dans certains vieux livres.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X