Remarques sur le fichier des affixes fr_FR.dic pour écrire une procédure "munch"

Le fichier des affixes français, tel qu'il est présentement, décrit une liste de drapeaux, qui eux-mêmes définissent les opérations à effectuer sur un lemme et selon quelles conditions. Or, si ce fichier est suffisamment pertinent pour retrouver toutes les déclinaisons d'un lemme donné avec ses drapeaux ("unmunch"), il manque cependant des informations pour faire proprement l'opération inverse ("munch"), c'est-à-dire créer un dictionnaire d'entrées (lemme+drapeaux) à partir de toutes les déclinaisons possibles des verbes, des adjectifs et des noms.

En effet, si vous consultez le fichier des affixes commentés :
http://fr.openoffice.org/Documentation/Guides/fr_FR.aff.document%E9
vous observerez qu'il est précisé régulièrement que tel affixe ne peut s'appliquer que sur des noms uniquement, ou seulement sur les verbes. D'autres cas particuliers sont aussi définis, mais ces informations ne sont pas explicitées dans les définitions pertinentes des affixes, hormis dans les commentaires. C'est pourquoi le programmeur qui veut écrire une fonction "munch" doit nécessairement inclure dans son programme nombre de bidouilles pour tenir compte de certaines conditions non-définies.


On distingue plusieurs types de lacunes d'informations pertinentes :

1. Il est impossible de savoir si un drapeau concerne les verbes seulement, les noms ou les deux, comme le précisent les commentaires du fichier des affixes français. Cela est pourtant important, car la logique des drapeaux définis pour une catégorie entre souvent en conflit avec l'autre.

Par exemple, les drapeaux L et l servent à placer le même préfixe "l'", l'un devant les noms, l'autre devant les verbes. La seule différence entre ces deux drapeaux, c'est que le second permet la combinaison avec les suffixes, l'autre non.
Si nous avons la liste suivante à "muncher":
amour
l'amour
adore
l'adore
Il est impossible donc, sans information complémentaire, de savoir s'il faut choisir:
- amour/L ou amour/l
- adore/L ou adore/l

On observe aussi beaucoup d'interférences entre les drapeaux pour les verbes et les drapeaux pour les noms/adjectifs:
Prenons par exemple la liste suivante:
vomir
vomie
vomies
vomi
vomie

"Munch" va donner
vomir/y
vomie/F

vomie/F est une entrée redondante, car vomir/y permet déjà d'obtenir toutes les déclinaisons de vomie/F. Il est donc obligatoire de faire de nombreuses recherches sur les drapeaux qui entrent en conflit pour trouver la solution correcte.

Le drapeau S notammment, prévu pour le pluriel des noms, est susceptible d'être apposé sur tous les verbes combinant deux formes presque identiques, la seconde ayant juste un 's' ajouté à la fin de la première. Par exemple:
donne donnes    ---> donne/S
tombai tombais  ---> tombai/S
etc.

Il existe d'une manière générale de nombreux cas, difficile à énumérer, où les drapeaux réservés pour les noms et les adjectifs peuvent s'appliquer sur les verbes conjugués, et créent maintes interférences où il est difficile, voire impossible(?), de savoir lequel est le bon.

--

2. Il serait utile d'avoir dans la description d'un affixe, le nombre minimal de déclinaisons qu'il faut trouver pour appliquer un drapeau sur un lemme, ou le nombre maximal de déclinaisons possibles.
Deux raisons à cela:

 a. Connaître le nombre minimal de déclinaisons à trouver pour apposer un
    drapeau est parfois indispensable pour départager plusieurs solutions
    possibles.
    Certains affixes créent un nombre de déclinaisons variable selon
    le lemme sur lequel on les appose.
    Le drapeau F, par exemple, donnera tantôt 3, tantôt 2 déclinaisons,
voire une seule, selon le lemme sur lequel il est apposé. (Cf. le fichier
    des affixes).
    Pourtant, l'utilisation du drapeau F n'est pertinente que si nous
    trouvons au moins deux déclinaisons du lemme sur lequel nous faisons
    un test.
    Le drapeau F, en effet, ne sert que pour décliner les noms communs
    pouvant adopter des formes féminines.
    Exemple: voleuse/F  donne 3 déclinaisons:  voleur / voleurs / voleuses.
    Or, l'apposition du drapeau F, si on se borne aux conditions définies
    par le fichier des affixes, est valable sur de nombreux lemmes.
    Par exemple:
    fraise/F  donne 1 déclinaison: fraises
    Le drapeau F n'a pas été prévu pour gérer les pluriels des noms
    sans formes féminines. C'est le rôle du drapeau S.
    fraise/S donne 1 déclinaison: fraises
Il en va de même pour le drapeau G (servant pour décliner d'autres
    noms à formes féminines).
    fraise/G donne 1 déclinaison: fraises

    Donc, si nous avons la liste de noms à "muncher" (fraise, fraises),
    nous nous retrouvons avec la possibilité d'apposer 3 drapeaux
    tous valides sur "fraise".
    fraise/F donne 1 déclinaison: fraises
    fraise/G donne 1 déclinaison: fraises
    fraise/S donne 1 déclinaison: fraises
    Impossible de départager lequel est nécessaire.
    C'est pourquoi j'ai été obligé, pour éliminer les solutions fausses,
    d'insérer dans le code une heuristique obligeant les drapeaux F et G
    à trouver un nombre de déclinaisons minimal supérieur à 1, afin de ne
    pas être utilisé à la place de S.

 b. Le nombre maximal de déclinaisons possible n'est utile que pour
    optimiser le processus "munch", qui est long et coûteux en ressources.
C'est même une "usine à gaz" et toute astuce pour accélérer le processus
    est la bienvenue.
    Or, avec cette information, on peut réduire le nombre de tests
    à effectuer sur un lemme pour chaque drapeau si on connaît le
    nombre maximal de déclinaisons que celui-ci est censé provoquer
    lorsqu'il sera appliqué sur un lemme.
Exemple avec le drapeau A :
    PFX A Y 10
    PFX A   0             ad            [^bcdfglmnpqrst]
    PFX A   0             a             [bdgm]
    PFX A   0             ac            [cq]
    PFX A   0             af            [f]
    PFX A   0             al            [l]
    PFX A   0             an            [n]
    PFX A   0             ap            [p]
    PFX A   0             ar            [r]
    PFX A   0             as            [s]
    PFX A   0             at            [t]

            ce qui est    ce qui est    condition pour
            ôté au        ajouté        apposer l'affixe
lemme. au lemme 0 = rien ^ signifie "tout sauf"

    Admettons que nous ayons dans notre liste de mots à "muncher":
    "verbe" et "adverbe"
    Pour chaque mot, le programme va essayer d'apposer tous les
    drapeaux, et voir s'il trouve une déclinaison existante dans la
    liste.

    Le programme munch teste le drapeau A sur "verbe", et cherche s'il
    va trouver la déclinaison possible définie par chacun des opérateurs.
    Il trouve donc l'entrée "adverbe", correspondant à la première
    déclinaison possible définie par le premier opérateur de l'affixe A:
    PFX A   0          ad         [^bcdfglmnpqrst]
    (nous ajoutons "ad" à "verbe", parce que la première lettre de "verbe"
     est différente de celles dans "bcdfglmnpqrst" et parce que nous
     avons trouvé dans notre liste de mots, le mot composé par
     "ad"+"verbe" = "adverbe")

    Or, comme la définition de l'affixe ne précise pas combien de
    déclinaisons possibles le drapeau effectue sur un lemme,
    nous ignorons s'il est utile de tester le lemme avec les autres
    opérateurs pour trouver d'autres déclinaisons.
    Pourtant, il est évident que la réponse, dans ce cas, est toujours:
    une seule déclinaison est possible avec l'affixe A.
    Si nous le savions, nous pourrions, en l'occurrence, arrêter les
    essais dès le premier opérateur de cet affixe.

--

3. Certains affixes ne peuvent s'apposer à des lemmes que dans des conditions qui, une fois encore, ne sont expliquées que dans les commentaires. Exemple: les affixes p et q ne servent qu'à conjuguer les verbes réflexifs dans le cas précis de l'élision du pronom se. Plus clairement, ça signifie que ces deux drapeaux ne peuvent théoriquement être placés que sur les lemmes commençant par "s'" Comme une fonction "munch" classique ne peut pas deviner cette condition non-explicitée, elle place ce drapeau sur d'autres verbes respectant les conditions définies par le fichier des affixes. Pour parer cet effet indésirable, il faut donc encore écrire une heuristique.

-----------------------------------------------------------------------------------------

Si nous appliquons brutalement les drapeaux sur les lemmes, sans tenir compte des lacune du fichier des affixes, nous pouvons obtenir des résultats comme suit (j'ai utilisé le "munch" fourni avec MySpell) :

fraise/G         <-- ici, munch ne sait pas s'il faut mettre le drapeau
                    F, G ou S et en a vraisemblablement choisi un au hasard
                    fraise/S est le résultat correct.
sèche/F
sec/F <-- sec/F est une entrée inutile, puisqu'elle peut être obtenue
                    par déclinaison de sèche/F
patine/pGu <-- p est un drapeau théoriquement réservé aux lemmes commençant
                    par "s'". G est un drapeau réservé pour les noms et les
adjectifs, et il est ici combiné avec u, un drapeau pour
                    les verbes.
abaissa/nFlLtm <-- l et L sont apposés sur un même lemme. F est un drapeau qui
                    n'est pas prévu pour les verbes.

-----------------------------------------------------------------------------------------


Suggestions pour remédier à ces problèmes, c'est-à-dire, donner dans le fichier des affixes des informations complémentaires :

- Inclure dans la première ligne de définition d'un affixe le nombre minimal et le nombre maximal de déclinaisons. Ce qui donnerait: PFX/SFX nom Y/N nombre_de_lignes minimum_decl_à_trouver maximum_decl_possibles

- Donner la possibilité de classer les affixes par catégories et définir quels sont les drapeaux incompatibles entre eux.

- (?) Inclure dans la description d'un suffixe une condition décrivant si celui ne peut s'apposer que si le lemme possède un préfixe défini, et réciproquement inclure dans la description d'un préfixe une condition décrivant si celui ne peut s'apposer que si le lemme possède un suffixe défini.


Ce ne sont que des suggestions basées sur le travail que j'ai fait pour écrire une fonction "munch" avec le fichier des affixes français. J'ignore si celles-ci seraient pertinentes pour d'autres langages.


Aubéron

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Répondre à