Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rejet des abbréviations #21

Open
2 tasks
lissyx opened this issue Mar 5, 2019 · 11 comments
Open
2 tasks

Rejet des abbréviations #21

lissyx opened this issue Mar 5, 2019 · 11 comments
Labels
cvfr-sc Sentence Collector good first issue Good for newcomers help wanted Extra attention is needed

Comments

@lissyx
Copy link
Collaborator

lissyx commented Mar 5, 2019

Il serait efficace pour éviter les situations ambigües de rejeter certaines abbréviations. Le code actuel se limite à celles uniquement en majuscules, potentiellement séparées par des points.

On pourrait vouloir rajouter des choses spécifiques au français: mr, mme, melle, mgr, ch, rte, etc.: https://github.com/Common-Voice/sentence-collector/blob/master/shared/validation/languages/en.js#L16-L20

@lissyx lissyx added cvfr-sc Sentence Collector help wanted Extra attention is needed labels Mar 5, 2019
@Gaet81
Copy link

Gaet81 commented Mar 28, 2019

Bonjour,

Je me trompe ou les abréviations sont gèrées dans utils.py via une regex qui transforme ces abréviations en nom complet? (si je me trompe désolé mais ça manque un peu de documenation. Je veux bien commencer à écrire un peu de doc pour que les nouveaux arrivant sur ce dépôt aient un peu une idée de ce qui se trame et du but de ce dépot)

@lissyx
Copy link
Collaborator Author

lissyx commented Mar 29, 2019

@Gaet81 On a du code ici, utils.py, qui le fait, mais on a pas l'équivalent sur Sentence Collector :). Toute aide de doc est bienvenue !

@lissyx
Copy link
Collaborator Author

lissyx commented Jan 24, 2020

C'est toujours d'actualité, y'a d'autres langages qui l'ont: https://github.com/Common-Voice/sentence-collector/tree/master/shared/validation/languages

@lissyx lissyx added the good first issue Good for newcomers label Mar 10, 2020
@CapitainFlam
Copy link

CapitainFlam commented Sep 6, 2022

Le lien ci dessus est HS. Je pense que le nouveau lien est celui ci :
https://github.com/common-voice/sentence-collector/tree/main/server/lib/validation/languages

On trouve dans ce dossier des règles... de validation.
(exemple : on élimine les chiffres [0..9], qui doivent être écrits en toute lettres, on donne un nombre mini et maxi de mots dans les phrases, etc.)

Je pense d'ailleurs que c'est typiquement dans ce dossier que pourrait aller le résultat des discussions qui ont lieu là :
https://discourse.mozilla.org/t/proportion-de-noms-propres-a-consonnance-etrangere/72887

Full disclamer : j'ai relancé le fil de discussion de ce fil le 5/9/22, je suis donc non neutre.

EDIT : Après une n-ième relecture de tout le fil, la correction#20 #20 s'inscrit toujours, elle aussi, dans cette discussion.

@CapitainFlam
Copy link

Ce qui suit doit être compris comme la suite du message précédent. Je le met dans un deuxième message pour ne pas tout mélanger...
@lissyx, @drzraf, n'hésitez pas à corriger ce que je raconte.

Pour ceux qui comme moi ne comprennent pas tout, voilà ce que j'ai compris :
si https://github.com/common-voice/CorporaCreator est l'outil qui crée les corpus "finaux" à destination des outils de reconnaissance vocal, le sentence collector https://github.com/common-voice/sentence-collector/tree/main/server/lib/validation/languages, comme son nom l'indique, sert à créer les phrases qui seront lues par les personnes.

...Autrement dit 1 :

  • le sentence collector est en AMONT de la lecture orale et de l'enregistrement. Il crée les données à lire.
  • le CorporaCreator est en AVAL de la lecture et de l'enregistrement, il crée les données à analyser pour les chercheurs/les moteurs.

...Autrement dit 2 :
Si on nettoyait la donnée en entrée (dans le sentence collector), on éviterait de la nettoyer en sortie (dans le CorporaCreator).
C'est pour ça (si j'ai bien compris) que @lissyx dit à @Gaet81 On a du code ici, utils.py, qui le fait, mais on a pas l'équivalent sur Sentence Collector :).

Question bête : Si quelqu'un (moâ ?!) récupérait le travail de #20, et le mettait dans un fichier dans https://github.com/common-voice/sentence-collector/tree/main/server/lib/validation/languages, est ce que cela ferait de la bouillie ?!

@lissyx
Copy link
Collaborator Author

lissyx commented Sep 6, 2022

  • le sentence collector est en AMONT de la lecture orale et de l'enregistrement. Il crée les données à lire.

  • le CorporaCreator est en AVAL de la lecture et de l'enregistrement, il crée les données à analyser pour les chercheurs/les moteurs.

Oui, c'est ça

Si on nettoyait la donnée en entrée (dans le sentence collector), on éviterait de la nettoyer en sortie (dans le CorporaCreator).

ça ne sera valable que pour les nouvelles additions à Sentence Collector, l'existant nécessiterait soit d'être nettoyé dans la DB (compliqué) soit dans Corpora Collector

Question bête : Si quelqu'un (moâ ?!) récupérait le travail de #20, et le mettait dans un fichier dans https://github.com/common-voice/sentence-collector/tree/main/server/lib/validation/languages, est ce que cela ferait de la bouillie ?!

Pas nécessairement, je pense que ce serait un bon point de départ

@CapitainFlam
Copy link

Bon, j'ai avancé le sujet, et ai fait une ébauche de commit pour les rules FR...

...Il faudrait corriger aussi les "Mr, Mrs, M. Mme, etc. "
Je n'y ai plus pensé. Ce sera à faire :)

please have a look at :
CapitainFlam/Common-Voice-sentence-collector@db15ee1

@drzraf
Copy link

drzraf commented Sep 10, 2022

Bon début !
Je vous suggère de soumettre une pull-request de votre branche, même si c'est encore en cours, et de l'indiquer en préfixant le titre par [WIP] , ainsi nous pourrons effectuer des reviews au fil de l'eau.

Au niveau de la forme, je vous conseille dès à présent de limiter les changements de fichier qui ne soient strictement nécessaires (introduction ou changements de lignes blanches ou vides, commentaires superflus, ...), de rendre les commentaires introduits le moins verbeux possibles. Par exemple based on common-voice/CorporaCreator#87 (au lieu de 5 lignes) et de respecter l'alignement du code (indentation).

Au niveau du fond:

  • La suppression des dates (comme d'autres suppressions) est susceptible de rendre les phrases incompréhensible aux locuteurs. Exemple typique : Il à commencé le alors personne ne le savait (date supprimée entre "le" et "alors".
  • L'utilité de transformer certains acronymes sous forme de lettres distinctes ne m'apparaît pas. En quoi "U D I" est-il meilleur que "UDI" (@lissyx ?)
  • Jean-Paul II me paraît un peu spécifique :) Une regexp pour tester les nombres romains (en cas de majuscule au mot précédent) pourrait s'avérer plus générique et bénéfique.
  • Un fichier de test existe déjà main/server/tests/lib/cleanup/languages/fr.test.js. La PR pourrait s'inspirer des tests prévus dans setup basic FR preprocessing CorporaCreator#87 pour l'intégrer à votre PR sur Common-Voice-sentence-collector et valider ainsi le bon fonctionnement de ces nouvelles règles de substitution.

Je vous adjoint ici quelques regexp additionnelles (en Python) que j'avais utilisées pour un projet personnel :

# 3 groupes, selon le contexte (suffixé par un ".", n'importe quoi ou un espace ou tiret)
abbreviations_fr = [
    (re.compile("\\b%s\\." % x[0], re.IGNORECASE), x[1])
    for x in [
        ("M", "monsieur"),
        ("Mlle", "mademoiselle"),
        ("Mlles", "mesdemoiselles"),
        ("Mme", "Madame"),
        ("Mmes", "Mesdames"),
        ("N.B", "nota bene"),
        ("M", "monsieur"),
        ("p.c.q", "parce que"),
        ("Pr", "professeur"),
        ("qqch", "quelque chose"),
        ("rdv", "rendez-vous"),
        ("max", "maximum"),
        ("min", "minimum"),
        ("no", "numéro"),
        ("adr", "adresse"),
        ("dr", "docteur"),
        ("st", "saint"),
        ("co", "companie"),
        ("jr", "junior"),
        ("sgt", "sergent"),
        ("capt", "capitaine"),
        ("col", "colonel"),
        ("av", "avenue"),
        ("av. J.-C", "avant Jésus-Christ"),
        ("apr. J.-C", "après Jésus-Christ"),
        ("art", "article"),
        ("boul", "boulevard"),
        ("c.-à-d", "c’est-à-dire"),
        ("etc", "et cetera"),
        ("ex", "exemple"),
        ("excl", "exclusivement"),
        ("boul", "boulevard"),
    ]
] + [
    (re.compile("\\b%s" % x[0]), x[1])
    for x in [
        ("Mlle", "mademoiselle"),
        ("Mlles", "mesdemoiselles"),
        ("Mme", "Madame"),
        ("Mmes", "Mesdames"),
    ]
] + [
    (re.compile("\\b%s\\b" % x[0]), x[1])
    for x in [
        ("1ers?", "premier"),
        ("1e?res?", "première"),
        ("2nd", "second"),
        ("2n?de", "seconde"),
        ("([12]?[0-9])h([0-5][0-9])?", "\1 heure \2"),
        ("([0-9]+)m", "\1 mètres"),
        ("([0-9]+)kms?", "\1 kilomètres"),
        ("([0-9]+)mn", "\1 minutes"),
    ]
]

Python dispose aussi d'une librairie bien pratique (num2words), qui permet de convertir les numéros proprement (ordinaux ou non):

def _conv_num(match):
    return num2words(match.group(), lang='fr')

def _conv_ord(match):
    return num2words(match.group(1), to='ordinal', lang='fr')

text = re.sub(r'\b\d+\b', _conv_num, text).
             sub(r"\b([1-9][0-9]*)(ème|eme|e)\b", _conv_ord, text)

@drzraf
Copy link

drzraf commented Sep 10, 2022

@lissyx concernant les suppressions, je pourrais, à l'avenir, grep'per les correspondances et soumettre une autre PR de suppression.

@CapitainFlam
Copy link

Bon début ! Je vous suggère de soumettre une pull-request de votre branche, même si c'est encore en cours, et de l'indiquer en préfixant le titre par [WIP] , ainsi nous pourrons effectuer des reviews au fil de l'eau.

Au niveau de la forme, je vous conseille dès à présent de limiter les changements de fichier qui ne soient strictement nécessaires (introduction ou changements de lignes blanches ou vides, commentaires superflus, ...), de rendre les commentaires introduits le moins verbeux possibles. Par exemple based on common-voice/CorporaCreator#87 (au lieu de 5 lignes) et de respecter l'alignement du code (indentation).

Tout ça, c'est fait 😁

La suppression des dates (comme d'autres suppressions) est susceptible de rendre les phrases incompréhensible aux locuteurs. Exemple typique : Il à commencé le alors personne ne le savait (date supprimée entre "le" et "alors".

Pour la suppression des dates, je suis d'accord que c'est moche.
Il y a d'ailleurs une issue sur ce sujet qui a été ouverte ! cf : common-voice/common-voice#3792

  • convertir les dates, nombres et numéros en texte (je sais pas faire ça !)

L'utilité de transformer certains acronymes sous forme de lettres distinctes ne m'apparaît pas. En quoi "U D I" est-il meilleur que "UDI" (@lissyx ?)
Deux (bonnes ?) raison pour ça :

  • CoporaCreator va shooter les acronymes avec des lettres accolées (UDI, RPR...) car c'est un pattern qui est détecté. (...Je ne sais pas s'il détecte les pattern avec un espace au milieu ?!)
  • en séparant les lettres, on présuppose que les locuteurs vont bien enregistrer "Uh, Dé, I", et non Unified Display Interface.

...on va tout convertir, cela va simplifier les choses. J'ai shooté tous les accronymes, il n'y a plus que du verbeux.

* `Jean-Paul II` me paraît un peu spécifique :) Une regexp pour tester les nombres romains (en cas de majuscule au mot précédent) pourrait s'avérer plus générique et bénéfique.

Yep... J'ai juste repris ce qu'avait fait Nicolas 😄
...J'en ai profité pour rajouter tout une tartine sur la conversion des chiffres romains, et en passant, je me suis dis qu'on ne convertissait pas les siècles, donc j'ai aussi en amont converti les siècles !

* Un fichier de test existe déjà `main/server/tests/lib/cleanup/languages/fr.test.js`. La PR pourrait s'inspirer des tests prévus dans [setup basic FR preprocessing CorporaCreator#87](https://github.com/common-voice/CorporaCreator/pull/87) pour l'intégrer à votre PR sur `Common-Voice-sentence-collector`  et valider ainsi le bon fonctionnement de ces nouvelles règles de substitution.

C'est complètement hors de ma portée 😓

  • intégrer les tests de CoporaCreator dans le PR.

Je vous adjoint ici quelques regexp additionnelles (en Python) que j'avais utilisées pour un projet personnel :

# 3 groupes, selon le contexte (suffixé par un ".", n'importe quoi ou un espace ou tiret)
abbreviations_fr = [
    (re.compile("\\b%s\\." % x[0], re.IGNORECASE), x[1])
    for x in [
        ("M", "monsieur"),
        ("Mlle", "mademoiselle"),
        ("Mlles", "mesdemoiselles"),
        ("Mme", "Madame"),
        ("Mmes", "Mesdames"),
        ("N.B", "nota bene"),
        ("M", "monsieur"),
        ("p.c.q", "parce que"),
        ("Pr", "professeur"),
        ("qqch", "quelque chose"),
        ("rdv", "rendez-vous"),
        ("max", "maximum"),
        ("min", "minimum"),
        ("no", "numéro"),
        ("adr", "adresse"),
        ("dr", "docteur"),
        ("st", "saint"),
        ("co", "companie"),
        ("jr", "junior"),
        ("sgt", "sergent"),
        ("capt", "capitaine"),
        ("col", "colonel"),
        ("av", "avenue"),
        ("av. J.-C", "avant Jésus-Christ"),
        ("apr. J.-C", "après Jésus-Christ"),
        ("art", "article"),
        ("boul", "boulevard"),
        ("c.-à-d", "c’est-à-dire"),
        ("etc", "et cetera"),
        ("ex", "exemple"),
        ("excl", "exclusivement"),
        ("boul", "boulevard"),
    ]
] + [
    (re.compile("\\b%s" % x[0]), x[1])
    for x in [
        ("Mlle", "mademoiselle"),
        ("Mlles", "mesdemoiselles"),
        ("Mme", "Madame"),
        ("Mmes", "Mesdames"),
    ]
] + [
    (re.compile("\\b%s\\b" % x[0]), x[1])
    for x in [
        ("1ers?", "premier"),
        ("1e?res?", "première"),
        ("2nd", "second"),
        ("2n?de", "seconde"),
        ("([12]?[0-9])h([0-5][0-9])?", "\1 heure \2"),
        ("([0-9]+)m", "\1 mètres"),
        ("([0-9]+)kms?", "\1 kilomètres"),
        ("([0-9]+)mn", "\1 minutes"),
    ]
]

cool ! je vais m'en inspirer !

Python dispose aussi d'une librairie bien pratique (num2words), qui permet de convertir les numéros proprement (ordinaux ou non):

def _conv_num(match):
    return num2words(match.group(), lang='fr')

def _conv_ord(match):
    return num2words(match.group(1), to='ordinal', lang='fr')

text = re.sub(r'\b\d+\b', _conv_num, text).
             sub(r"\b([1-9][0-9]*)(ème|eme|e)\b", _conv_ord, text)

encore une fois, c'est largement hors de ma portée !

  • implémenter une librairie JS pour convertir les nombres en TXT

@CapitainFlam
Copy link

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
cvfr-sc Sentence Collector good first issue Good for newcomers help wanted Extra attention is needed
Projects
None yet
Development

No branches or pull requests

4 participants