Améliorer la détection des conjugaisons dans unknownverb

Issue #30 new
H Labrande created an issue

UnknownVerb a la liste des conjugaisons de tous (?) les verbes définis dans FrenchG. Ainsi, si le joueur tape "frappe troll", la commande est transformée en "frapper troll" et reparsée, et tout va bien. En particulier, on en a besoin pour les ordres vu que la syntaxe naturelle c'est "troll, ouvre la porte".

Actuellement c'est donc un énorme switch, qui est condamné à grossir, prendre de plus en plus de place dans le dictionnaire et dans le code, et condamné aussi à rater des verbes (vu qu'on ne pense pas toujours à ajouter la conjugaison quand on ajoute un verbe).

Il faudrait donc une routine générale qui tente de transformer un verbe conjugué en son infinitif. Ça résoudrait le problème, et ça permettrait d'avoir les conjugaisons sur les verbes définis par l'auteur aussi de façon native (sans que l'auteur ait besoin de penser à écrire MyUnknownVerb).

Je pense que le plus simple c'est : un bout de code pour les verbes du 1er groupe, un autre pour le 2e, un pour le 3e, et un dernier pour les verbes irréguliers.

Comments (4)

  1. Rémi Verschelde

    J'aime bien l'idée - et le challenge afférent. J'imagine qu'il faudrait que l'algorithme puisse établir de lui-même le groupe d'un verbe à partir de sa forme conjuguée, ce qui n'est pas nécessairement trivial.

    [UnknownVerb}(https://bitbucket.org/informfr/i6-french-language/src/6ce454ce98c028c0d50dcc27a0cb7ed379f18f7c/FrenchG.h?fileviewer=file-view-default#FrenchG.h-811) gère actuellement l'impératif présent (2ème personne du singulier, 2ème personne du pluriel et 1ère personne du pluriel) ainsi que l'indicatif présent (uniquement pour "vais (aller)"). On peut sûrement laisser de côté l'indicatif pour l'instant et juste garder l'exception pour "vais" si elle est pertinente.

    En se limitant à l'impératif, on devrait pouvoir dériver le groupe du verbe (et donc son radical --> infinitif) à partir de sa terminaison :

    On a donc pas de conflit entre les terminaisons du 1er groupe et du 2ème groupe, donc c'est jouable. L'algorithme fonctionnerait ainsi :

    1. Comparer la forme conjuguée aux formes irrégulières du 3ème groupe (ce qui inclus peut être de "déconstruire" les verbes de style "abstenir" -> "tenir", "comprendre"/"surprendre" -> "prendre")
    2. Si aucune correspondance n'est trouvée, chercher les terminaisons du 2ème groupe (-is, -issons, -issez)
    3. Si aucune correspondance n'est trouvée, chercher les terminaisons du 1er groupe (-e, -ons, -ez)

    Après les étapes 2 et 3, c'est assez facile, si la terminaison est trouvée, le radical est le verbe conjuguée moins la terminaison, et il suffit de rajouter -ir pour le 2ème groupe et -er pour le 1er groupe et on a notre infinitif.

    Pour l'étape 1, c'est bien sûr plus délicat, et c'est là que ça devrait être fun :) Un peu de recherche devrait pouvoir nous donner des pseudo-algorithmes / méthodes de "déconjugaison" pour ces verbes du 3ème groupe. D'un coup d’œil rapide sur la page wikipédia mentionnée ci-dessus, on repère déjà quelques sous-groupes "réguliers", par exemple :

    • Les verbes dérivés de "tenir" et "venir" : abstenir, advenir, appartenir, circonvenir, contenir, contrevenir, convenir, détenir, devenir, disconvenir, entretenir, intervenir, maintenir, obtenir, obvenir, parvenir, prévenir, provenir, redevenir, retenir, revenir, soutenir, se souvenir, subvenir, survenir, tenir, venir. Les terminaisons pour tous ces verbes sont -iens, -enons, -enez, néanmoins on ne peut pas les isoler tels quels car -enons et -enez sont aussi utilisés pour "prendre" et ses dérivés. Il faut donc bien chercher les formes "tiens", "tenons", "tenez" et "viens", "venons", "venez" à la fin des chaînes de caractères pour pouvoir les cataloguer comme verbes du 3ème groupe de style tenir/venir.
    • Les verbes dérivés de "prendre" : apprendre, comprendre, se déprendre, désapprendre, entreprendre, s'éprendre, se méprendre, prendre, rapprendre, réapprendre, reprendre, surprendre. Conjugaisons : prends, prenons, prenez. Même topo, c'est facile à isoler et a priori unique.
    • Les verbes en "-tir" : partir, repartir, repentir, sentir, sortir, etc. Terminaisons : -s, -tons, -tez. Celui là devrait probablement être vers la fin du switch puisque la terminaison "-s" se retrouve dans de nombreuses autres terminaisons (par exemple "prends" ou "viens"). Heureusement on a pas encore de conflit avec les 1er et 2ème groupes à ce niveau là.
    • etc. pour tous les verbes du 3ème groupe. Une fois tous les schémas de conjugaison listés, il faut les mettre dans le bon ordre pour l'algorithme, et voir comment gérer les potentiels conflits s'il y en a.

    On peut soit faire le travail nous même à partir de la page wikipedia parce que c'est fun, soit faire une petite recherche pour voir qui a déjà fait le boulot ;)

  2. H Labrande reporter

    Ha c'est marrant, j'ai passé ma soirée hier à m'amuser à faire ça :) C'est plein d'exceptions et de chausses-trappe (genre ton "les verbes en tir" marche pas pour fuir ;) ), mais ça va ; j'ai pris tous les verbes explicités dans le wiktionary-troisième-groupe + les verbes dans la lib, et je suis en train de finir ça. Je détecte toutes les personnes au présent (+ 2/3 impératifs spéciaux genre 'sois'), sachant qu'avec 6/12 ça servira peut-être... Ça doit être perfectible et y'a certains verbes (falloir...) que je pourrais laisser tomber, mais bon. Je poste un snippet de pseudocode d'ici 24 ou 48h. Merci ! :)

  3. H Labrande reporter

    J'ai pas envie de pourrir le dépôt avec ça, alors j'ai mis mon travail en ligne : algorithme en pseudo-code, et tableau d'avancement

    Dans l'algorithme en pseudocode, c'est pas du inform du tout, et on suppose qu'on peut avoir les 10 dernières lettres avec lastletters(10)... Bref, à voir comment ça s'implante, c'est pas super facile je pense, et c'est possible que ça prenne plus que les 23ko que prend actuellement UnknownVerb. (Cela étant, on donne de la fonctionnalité en plus ; et c'est possible que ça puisse s'implanter pas trop mal, avec un peu d'astuce.) Sur le tableau d'avancement, j'ai mis tout ce qui était couvert : 1er et 2e groupe, plus plein de verbes importants du troisième groupe. Il me manque 170 conjugaisons à déconjuguer, c'est à dire trouver une règle simple et qui marche uniquement quand il faut qu'elle marche, qui permette de traiter ces formes. Pas évident du tout avec les règles qui restent, je veux bien des suggestions...

    On pourrait déjà essayer d'implanter le pseudocode en I6 pour voir comment ça pourrait se faire ; aussi, si quelqu'un veut bien générer une liste de commandes à tester pour s'assurer que le nouveau code reconnaît au moins les mêmes formes que l'ancien, ça serait utile (c'est relou, alors faites un script pour extraire ça :) ).

    PS: je pense pas que ça ait déjà été fait, alors une fois qu'on a fini il faudrait mettre le pseudocode (et le code résultant sûrement) sur son propre dépôt, histoire que ça soit utile à d'autres potentiellement !

  4. Log in to comment