languagetool-org / languagetool

Style and Grammar Checker for 25+ Languages
https://languagetool.org
GNU Lesser General Public License v2.1
12.42k stars 1.39k forks source link

How to contribute ? We noticed multiple mistakes in French and would like to fix them and future ones. #9846

Closed Sharcoux closed 11 months ago

Sharcoux commented 11 months ago

Hi guys.

We noticed some mistakes in French, like the following sentences being marked as correct, or correct ones are marked as incorrect:

Incorrect marked as correct:

Correct marked as incorrect:

We would like to learn how to fix those in order to fix the future ones we might encounter. Can someone explain us what would be the process to solve that? Which file should we edit and with what kind of fix? We read the documentation but it is still very not clear to me.

LucieSteib commented 11 months ago

Hi @Sharcoux!

Thank you for your interest in LanguageTool! There is indeed a false positive error in

L'eau entre par la bouche du poisson et ressort par les opercules

for which we can make some adjustments. Here are a few links you might not have seen yet, such as the one for the RuleEditor in expert mode or the general documentation (you mentioned reading some documentation; if that one was included, I apologize). The file that would be useful to find new errors (and stop triggering a detection that is a false positive) is grammar.xml. The rule editor can be used to write and test rules. The screenshot below shows a replacement rule for J’ai fée des pâtes (but that won’t yield any results, as the error doesn’t seem to occur naturally). At LT, we try to focus on statistically probable errors and their corrections. It seems that the almost homophonic pair "fée/fait" isn’t a common mistake (to be compared, for example, to the very frequent confusion between "ou/où" or even "amande/amende"). image_720_720

Have a good day, maybe writing some XML rules,

Best, Lucie.

Sharcoux commented 11 months ago

Hi Lucie,

Thanks for you answer. It's a good start but we'd need to go a bit deeper for us to be able to make progress. The rule you suggest is very case specific while the errors at stake here are more general.

After "j'ai" we can expect a few things, but definitely not a noun, which should have raise a grammar error. This error might not seem common to you, but for pupils with dyslexia, it can be more common.

About the false positive on "Entre", I don't understand how I can detect the rule that got triggered, in order to see if it can be fixed.

About the documentation, I've read it, but it becomes quickly confusing when you don't know the project at all at first. But if I can get some help with a few rules at first, I'm sure that we can quickly become autonomous.

Sharcoux commented 11 months ago

I think I succeeded to get the details I needed thanks to ChatGPT. I'll open some PRs to solve "avoir fée" and others. For now, I'm not sure yet about how to handle the false positive on "entre", though.

maphjo commented 11 months ago

Hi @Sharcoux,

Great! We look forward to reviewing your first rules! You can add @LucieSteib or @GillouLT as a reviewer to the PRs.

To find out about the rules which are triggered in certain sentences, you can use the API: https://languagetool.org/http-api/#/default

Cheers

Sharcoux commented 11 months ago

I'm still working on submitting the PR (I need to setup a dev environment for Java), but here is what it should look like:

<rulegroup id="VERBE_SUIVI_D_UN_NOM" name="avoir faim">
    <!-- Source: https://fr.wiktionary.org/w/index.php?title=Cat%C3%A9gorie:Verbes_en_fran%C3%A7ais_suivis_d%E2%80%99un_nom_commun_sans_d%C3%A9terminant&pageuntil=faire+pression#mw-pages -->
    <rule id="ATTENDRE_PLUS_NOM_INCORRECT" name="attendre suivi d'un nom incorrect">
    <pattern>
        <token inflected='yes'>attendre</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
        <exception>famille</exception>
        <exception>godot</exception>
        </token>
    </pattern>
    <message>Après le verbe 'attendre', ce nom n'est généralement pas utilisé.</message>
    <example correction=''>J'attends <marker>famille</marker>.</example>
    <example>J'attends <marker>voiture</marker>.</example>
    </rule>
    <rule id="ATTRAPER_PLUS_NOM_INCORRECT" name="attraper suivi d'un nom incorrect">
    <pattern>
        <token inflected='yes'>attraper</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
        <exception>froid</exception>
        </token>
    </pattern>
    <message>Après le verbe 'attraper', ce nom n'est généralement pas utilisé.</message>
    <example correction=''>J'ai attrapé <marker>froid</marker>.</example>
    <example>J'ai attrapé <marker>froid</marker>.</example>
    </rule>
    <rule id="AVOIR_PLUS_NOM_INCORRECT" name="avoir suivi d'un nom incorrect">
    <pattern>
        <token inflected='yes'>avoir</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
        <exception>accès</exception>
        <exception>affaire</exception>
        <exception>barre</exception>
        <exception>barres</exception>
        <exception>besoin</exception>
        <exception>bobo</exception>
        <exception>carte</exception>
        <exception>cœur</exception>
        <exception>connaissance</exception>
        <exception>cours</exception>
        <exception>coutume</exception>
        <exception>droit</exception>
        <exception>envie</exception>
        <exception>faim</exception>
        <exception>foi</exception>
        <exception>hâte</exception>
        <exception>honte</exception>
        <exception>horreur</exception>
        <exception>idée</exception>
        <exception>lieu</exception>
        <exception>maille</exception>
        <exception>mal</exception>
        <exception>martel</exception>
        <exception>nom</exception>
        <exception>part</exception>
        <exception>peur</exception>
        <exception>pied</exception>
        <exception>pignon</exception>
        <exception>pitié</exception>
        <exception>raison</exception>
        <exception>recours</exception>
        <exception>soif</exception>
        <exception>souci</exception>
        <exception>trait</exception>
        <exception>vent</exception>
        <exception>vent</exception>
        <exception>voix</exception>
        </token>
    </pattern>
    <message>Après le verbe 'avoir', ce nom n'est généralement pas utilisé.</message>
    <example correction=''>J'ai <marker>faim</marker>.</example>
    <example>J'ai <marker>voiture</marker>.</example>
    </rule>
    <rule id="BAISSER_PLUS_NOM_INCORRECT" name="baisser suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>baisser</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>pavillon</exception>
        </token>
        </pattern>
        <message>Après le verbe 'baisser', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>J'ai baissé <marker>pavillon</marker>.</example>
        <example>J'ai baissé <marker>voiture</marker>.</example>
    </rule>
    <rule id="BATTRE_PLUS_NOM_INCORRECT" name="battre suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>battre</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>froid</exception>
            <exception>monnaie</exception>
            <exception>pavillon</exception>
        </token>
        </pattern>
        <message>Après le verbe 'battre', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il bat <marker>monnaie</marker>.</example>
        <example>Il bat <marker>champ</marker>.</example>
    </rule>

    <rule id="BECQUER_PLUS_NOM_INCORRECT" name="becquer suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>becquer</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>bobo</exception>
        </token>
        </pattern>
        <message>Après le verbe 'becquer', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il becque <marker>bobo</marker>.</example>
        <example>Il becque <marker>voiture</marker>.</example>
    </rule>

    <rule id="CASSER_PLUS_NOM_INCORRECT" name="casser suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>casser</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>maison</exception>
        </token>
        </pattern>
        <message>Après le verbe 'casser', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>J'ai cassé <marker>maison</marker>.</example>
        <example>J'ai cassé <marker>fenêtre</marker>.</example>
    </rule>

    <rule id="CHERCHER_PLUS_NOM_INCORRECT" name="chercher suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>chercher</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>chicane</exception>
            <exception>garouille</exception>
            <exception>noise</exception>
        </token>
        </pattern>
        <message>Après le verbe 'chercher', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il cherche <marker>noise</marker>.</example>
        <example>Il cherche <marker>clé</marker>.</example>
    </rule>
    <rule id="COMPENSER_PLUS_NOM_INCORRECT" name="compenser suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>compenser</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>carbone</exception>
        </token>
        </pattern>
        <message>Après le verbe 'compenser', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il compense <marker>carbone</marker>.</example>
        <example>Il compense <marker>énergie</marker>.</example>
    </rule>

    <rule id="CONTER_PLUS_NOM_INCORRECT" name="conter suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>conter</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>fleurette</exception>
            <exception>florette</exception>
        </token>
        </pattern>
        <message>Après le verbe 'conter', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Elle conte <marker>fleurette</marker>.</example>
        <example>Elle conte <marker>histoire</marker>.</example>
    </rule>

    <rule id="CRIER_PLUS_NOM_INCORRECT" name="crier suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>crier</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>famine</exception>
            <exception>gare</exception>
            <exception>grâce</exception>
            <exception>misère</exception>
            <exception>miséricorde</exception>
            <exception>victoire</exception>
        </token>
        </pattern>
        <message>Après le verbe 'crier', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il crie <marker>misère</marker>.</example>
        <example>Il crie <marker>joie</marker>.</example>
    </rule>

    <rule id="DECLARER_PLUS_NOM_INCORRECT" name="déclarer suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>déclarer</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>forfait</exception>
        </token>
        </pattern>
        <message>Après le verbe 'déclarer', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il déclare <marker>forfait</marker>.</example>
        <example>Il déclare <marker>guerre</marker>.</example>
    </rule>

    <rule id="DEMANDER_PLUS_NOM_INCORRECT" name="demander suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>demander</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>asile</exception>
            <exception>pardon</exception>
            <exception>raison</exception>
            <exception>réparation</exception>
        </token>
        </pattern>
        <message>Après le verbe 'demander', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il demande <marker>pardon</marker>.</example>
        <example>Il demande <marker>aide</marker>.</example>
    </rule>

    <rule id="DONNER_PLUS_NOM_INCORRECT" name="donner suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>donner</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>acte</exception>
            <exception>assignation</exception>
            <exception>assurance</exception>
            <exception>attention</exception>
            <exception>barre</exception>
            <exception>carrière</exception>
            <exception>chasse</exception>
            <exception>congé</exception>
            <exception>corps</exception>
            <exception>créance</exception>
            <exception>exemple</exception>
            <exception>haleine</exception>
            <exception>lieu</exception>
            <exception>loisir</exception>
            <exception>occasion</exception>
            <exception>pratique</exception>
            <exception>prise</exception>
            <exception>raison</exception>
            <exception>suite</exception>
            <exception>sujet</exception>
        </token>
        </pattern>
        <message>Après le verbe 'donner', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il donne <marker>raison</marker>.</example>
        <example>Il donne <marker>conférence</marker>.</example>
    </rule>

    <rule id="ENTENDRE_PLUS_NOM_INCORRECT" name="entendre suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>entendre</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>raison</exception>
        </token>
        </pattern>
        <message>Après le verbe 'entendre', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il entend <marker>raison</marker>.</example>
        <example>Il entend <marker>musique</marker>.</example>
    </rule>

    <rule id="FAIRE_PLUS_NOM_INCORRECT" name="faire suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>faire</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>abstraction</exception>
            <exception>acte</exception>
            <exception>alliance</exception>
            <exception>allusion</exception>
            <exception>antichambre</exception>
            <exception>appel</exception>
            <exception>assaut</exception>
            <exception>attention</exception>
            <exception>autorité</exception>
            <exception>babache</exception>
            <exception>banco</exception>
            <exception>banqueroute</exception>
            <exception>barrage</exception>
            <exception>binet</exception>
            <exception>bloc</exception>
            <exception>bombance</exception>
            <exception>boucherie</exception>
            <exception>brèche</exception>
            <exception>buisson</exception>
            <exception>caca</exception>
            <exception>cadeau</exception>
            <exception>carousse</exception>
            <exception>carrière</exception>
            <exception>ceinture</exception>
            <exception>chabrol</exception>
            <exception>chabrot</exception>
            <exception>chaud</exception>
            <exception>chorus</exception>
            <exception>chou</exception>
            <exception>classe</exception>
            <exception>codille</exception>
            <exception>confiance</exception>
            <exception>connaissance</exception>
            <exception>contraste</exception>
            <exception>corps</exception>
            <exception>cortège</exception>
            <exception>côte</exception>
            <exception>coup</exception>
            <exception>crédit</exception>
            <exception>cul</exception>
            <exception>curée</exception>
            <exception>date</exception>
            <exception>débat</exception>
            <exception>défaut</exception>
            <exception>demi-tour</exception>
            <exception>deuil</exception>
            <exception>difficulté</exception>
            <exception>diligence</exception>
            <exception>diversion</exception>
            <exception>divorce</exception>
            <exception>dodo</exception>
            <exception>don</exception>
            <exception>droit</exception>
            <exception>eau</exception>
            <exception>école</exception>
            <exception>écran</exception>
            <exception>effet</exception>
            <exception>effort</exception>
            <exception>envie</exception>
            <exception>erreur</exception>
            <exception>escale</exception>
            <exception>étalage</exception>
            <exception>étape</exception>
            <exception>état</exception>
            <exception>face</exception>
            <exception>faillite</exception>
            <exception>fête</exception>
            <exception>feu</exception>
            <exception>ficelle</exception>
            <exception>figure</exception>
            <exception>flanelle</exception>
            <exception>flèche</exception>
            <exception>flop</exception>
            <exception>florès</exception>
            <exception>foi</exception>
            <exception>fonction</exception>
            <exception>fortune</exception>
            <exception>fricot</exception>
            <exception>frais</exception>
            <exception>froid</exception>
            <exception>front</exception>
            <exception>fureur</exception>
            <exception>gaffe</exception>
            <exception>genre</exception>
            <exception>grâce</exception>
            <exception>grève</exception>
            <exception>grief</exception>
            <exception>halte</exception>
            <exception>honneur</exception>
            <exception>honte</exception>
            <exception>impression</exception>
            <exception>irruption</exception>
            <exception>joujou</exception>
            <exception>justice</exception>
            <exception>levier</exception>
            <exception>loi</exception>
            <exception>marché</exception>
            <exception>merveille</exception>
            <exception>mimi</exception>
            <exception>mine</exception>
            <exception>minette</exception>
            <exception>mouche</exception>
            <exception>mumuse</exception>
            <exception>naufrage</exception>
            <exception>nuit</exception>
            <exception>obstruction</exception>
            <exception>panache</exception>
            <exception>partie</exception>
            <exception>peine</exception>
            <exception>pénitence</exception>
            <exception>peur</exception>
            <exception>pièce</exception>
            <exception>pipi</exception>
            <exception>pitié</exception>
            <exception>place</exception>
            <exception>plaisir</exception>
            <exception>popo</exception>
            <exception>présent</exception>
            <exception>pression</exception>
            <exception>preuve</exception>
            <exception>prime</exception>
            <exception>profession</exception>
            <exception>rage</exception>
            <exception>raison</exception>
            <exception>rasibus</exception>
            <exception>recette</exception>
            <exception>ripaille</exception>
            <exception>risette</exception>
            <exception>route</exception>
            <exception>saillie</exception>
            <exception>sens</exception>
            <exception>sensation</exception>
            <exception>sentinelle</exception>
            <exception>signe</exception>
            <exception>silence</exception>
            <exception>souche</exception>
            <exception>style</exception>
            <exception>surface</exception>
            <exception>table</exception>
            <exception>tache</exception>
            <exception>tampine</exception>
            <exception>tapis</exception>
            <exception>tapisserie</exception>
            <exception>tête</exception>
            <exception>trou</exception>
            <exception>usage</exception>
            <exception>vinaigre</exception>
            <exception>violence</exception>
            <exception>voile</exception>
        </token>
        </pattern>
        <message>Après le verbe 'faire', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il fait <marker>ripaille</marker>.</example>
        <example>Il fait <marker>voiture</marker>.</example>
    </rule>

    <rule id="FAUSSER_PLUS_NOM_INCORRECT" name="fausser suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>fausser</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>compagnie</exception>
        </token>
        </pattern>
        <message>Après le verbe 'fausser', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il fausse <marker>compagnie</marker>.</example>
        <example>Il fausse <marker>route</marker>.</example>
    </rule>

    <rule id="FERMER_PLUS_NOM_INCORRECT" name="fermer suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>fermer</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>boutique</exception>
        </token>
        </pattern>
        <message>Après le verbe 'fermer', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il ferme <marker>boutique</marker>.</example>
        <example>Il ferme <marker>porte</marker>.</example>
    </rule>

    <rule id="GAGNER_PLUS_NOM_INCORRECT" name="gagner suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>gagner</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>chemin</exception>
        </token>
        </pattern>
        <message>Après le verbe 'gagner', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il gagne <marker>chemin</marker>.</example>
        <example>Il gagne <marker>loterie</marker>.</example>
    </rule>

    <rule id="JASPINER_PLUS_NOM_INCORRECT" name="jaspiner suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>jaspiner</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>bigorne</exception>
        </token>
        </pattern>
        <message>Après le verbe 'jaspiner', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il jaspine <marker>bigorne</marker>.</example>
        <example>Il jaspine <marker>histoire</marker>.</example>
    </rule>

    <rule id="JOUER_PLUS_NOM_INCORRECT" name="jouer suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>jouer</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>pièce</exception>
        </token>
        </pattern>
        <message>Après le verbe 'jouer', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il joue <marker>pièce</marker>.</example>
        <example>Il joue <marker>ballon</marker>.</example>
    </rule>

    <rule id="LACHER_PLUS_NOM_INCORRECT" name="lâcher suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>lâcher</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>pied</exception>
            <exception>prise</exception>
        </token>
        </pattern>
        <message>Après le verbe 'lâcher', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il lâche <marker>pied</marker>.</example>
        <example>Il lâche <marker>ballon</marker>.</example>
    </rule>

    <rule id="LIVRER_PLUS_NOM_INCORRECT" name="livrer suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>livrer</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>passage</exception>
        </token>
        </pattern>
        <message>Après le verbe 'livrer', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il livre <marker>passage</marker>.</example>
        <example>Il livre <marker>colis</marker>.</example>
    </rule>

    <rule id="MENACER_PLUS_NOM_INCORRECT" name="menacer suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>menacer</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>ruine</exception>
        </token>
        </pattern>
        <message>Après le verbe 'menacer', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il menace <marker>ruine</marker>.</example>
        <example>Il menace <marker>personne</marker>.</example>
    </rule>

    <rule id="METTRE_PLUS_NOM_INCORRECT" name="mettre suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>mettre</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>fin</exception>
            <exception>habit bas</exception>
            <exception>misère</exception>
            <exception>pavillon bas</exception>
        </token>
        </pattern>
        <message>Après le verbe 'mettre', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il met <marker>fin</marker>.</example>
        <example>Il met <marker>chapeau</marker>.</example>
    </rule>

    <rule id="PARLER_PLUS_NOM_INCORRECT" name="parler suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>parler</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>boutique</exception>
            <exception>chiffon</exception>
            <exception>chiffons</exception>
        </token>
        </pattern>
        <message>Après le verbe 'parler', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il parle <marker>chiffon</marker>.</example>
        <example>Il parle <marker>politique</marker>.</example>
    </rule>

    <rule id="PAYER_PLUS_NOM_INCORRECT" name="payer suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>payer</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>tribut</exception>
        </token>
        </pattern>
        <message>Après le verbe 'payer', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il paie <marker>tribut</marker>.</example>
        <example>Il paie <marker>facture</marker>.</example>
    </rule>

    <rule id="PERDRE_PLUS_NOM_INCORRECT" name="perdre suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>perdre</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>connaissance</exception>
            <exception>conscience</exception>
            <exception>contenance</exception>
            <exception>pied</exception>
            <exception>terre</exception>
        </token>
        </pattern>
        <message>Après le verbe 'perdre', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il perd <marker>connaissance</marker>.</example>
        <example>Il perd <marker>argent</marker>.</example>
    </rule>

    <rule id="PORTER_PLUS_NOM_INCORRECT" name="porter suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>porter</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>abonde</exception>
            <exception>affection</exception>
            <exception>amitié</exception>
            <exception>assistance</exception>
            <exception>bateau</exception>
            <exception>coup</exception>
            <exception>malheur</exception>
            <exception>ombrage</exception>
            <exception>ombre</exception>
            <exception>plainte</exception>
            <exception>préjudice</exception>
        </token>
        </pattern>
        <message>Après le verbe 'porter', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il porte <marker>plainte</marker>.</example>
        <example>Il porte <marker>sac</marker>.</example>
    </rule>

    <rule id="POSER_PLUS_NOM_INCORRECT" name="poser suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>poser</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>culotte</exception>
        </token>
        </pattern>
        <message>Après le verbe 'poser', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il pose <marker>culotte</marker>.</example>
        <example>Il pose <marker>question</marker>.</example>
    </rule>

    <rule id="PRENDRE_PLUS_NOM_INCORRECT" name="prendre suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>prendre</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>femme</exception>
            <exception>langue</exception>
            <exception>occasion</exception>
            <exception>place</exception>
            <exception>plaisir</exception>
            <exception>port</exception>
            <exception>position</exception>
        </token>
        </pattern>
        <message>Après le verbe 'prendre', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il prend <marker>plaisir</marker>.</example>
        <example>Il prend <marker>café</marker>.</example>
    </rule>

    <rule id="PRETER_PLUS_NOM_INCORRECT" name="prêter suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>prêter</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>attention</exception>
            <exception>secours</exception>
            <exception>serment</exception>
        </token>
        </pattern>
        <message>Après le verbe 'prêter', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il prête <marker>attention</marker>.</example>
        <example>Il prête <marker>argent</marker>.</example>
    </rule>

    <rule id="REBROUSSER_PLUS_NOM_INCORRECT" name="rebrousser suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>rebrousser</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>chemin</exception>
        </token>
        </pattern>
        <message>Après le verbe 'rebrousser', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il rebrousse <marker>chemin</marker>.</example>
        <example>Il rebrousse <marker>poil</marker>.</example>
    </rule>

    <rule id="RENDRE_PLUS_NOM_INCORRECT" name="rendre suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>rendre</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>haleine</exception>
            <exception>hommage</exception>
            <exception>service</exception>
        </token>
        </pattern>
        <message>Après le verbe 'rendre', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il rend <marker>hommage</marker>.</example>
        <example>Il rend <marker>monnaie</marker>.</example>
    </rule>

    <rule id="RENOUER_PLUS_NOM_INCORRECT" name="renouer suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>renouer</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>connaissance</exception>
        </token>
        </pattern>
        <message>Après le verbe 'renouer', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il renoue <marker>connaissance</marker>.</example>
        <example>Il renoue <marker>lien</marker>.</example>
    </rule>

    <rule id="REPRENDRE_PLUS_NOM_INCORRECT" name="reprendre suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>reprendre</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>haleine</exception>
            <exception>langue</exception>
            <exception>pied</exception>
        </token>
        </pattern>
        <message>Après le verbe 'reprendre', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il reprend <marker>langue</marker>.</example>
        <example>Il reprend <marker>travail</marker>.</example>
    </rule>

    <rule id="RESTER_PLUS_NOM_INCORRECT" name="rester suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>rester</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>axe</exception>
        </token>
        </pattern>
        <message>Après le verbe 'rester', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il reste <marker>axe</marker>.</example>
        <example>Il reste <marker>calme</marker>.</example>
    </rule>

    <rule id="ROULER_PLUS_NOM_INCORRECT" name="rouler suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>rouler</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>carrosse</exception>
        </token>
        </pattern>
        <message>Après le verbe 'rouler', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il roule <marker>carrosse</marker>.</example>
        <example>Il roule <marker>bille</marker>.</example>
    </rule>

    <rule id="SACRER_PLUS_NOM_INCORRECT" name="sacrer suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>sacrer</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>patience</exception>
        </token>
        </pattern>
        <message>Après le verbe 'sacrer', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il sacre <marker>patience</marker>.</example>
        <example>Il sacre <marker>roi</marker>.</example>
    </rule>

    <rule id="SE_DONNER_PLUS_NOM_INCORRECT" name="se donner suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>se donner</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>carrière</exception>
        </token>
        </pattern>
        <message>Après l'expression 'se donner', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il se donne <marker>carrière</marker>.</example>
        <example>Il se donne <marker>mal</marker>.</example>
    </rule>

    <rule id="TENIR_PLUS_NOM_INCORRECT" name="tenir suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>tenir</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>tête</exception>
        </token>
        </pattern>
        <message>Après le verbe 'tenir', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il tient <marker>tête</marker>.</example>
        <example>Il tient <marker>parole</marker>.</example>
    </rule>

    <rule id="TOURNER_PLUS_NOM_INCORRECT" name="tourner suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>tourner</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>bride</exception>
            <exception>casaque</exception>
        </token>
        </pattern>
        <message>Après le verbe 'tourner', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il tourne <marker>bride</marker>.</example>
        <example>Il tourne <marker>film</marker>.</example>
    </rule>

    <rule id="TROUVER_PLUS_NOM_INCORRECT" name="trouver suivi d'un nom incorrect">
        <pattern>
        <token inflected='yes'>trouver</token>
        <token postag='NOM' postag_regexp='yes' inflected='yes'>
            <exception>grâce</exception>
            <exception>place</exception>
            <exception>preneur</exception>
        </token>
        </pattern>
        <message>Après le verbe 'trouver', ce nom n'est généralement pas utilisé.</message>
        <example correction=''>Il trouve <marker>grâce</marker>.</example>
        <example>Il trouve <marker>objet</marker>.</example>
    </rule>
</rulegroup>

Does that look ok?

About the other rule, thanks to your tool, I got:

  "matches": [
    {
      "message": "Un participe passé semble plus approprié.",
      "shortMessage": "",
      "replacements": [
        {
          "value": "éntré"
        }
      ],
      "offset": 6,
      "length": 5,
      "context": {
        "text": "L'eau entre par la bouche du poisson et ressort par...",
        "offset": 6,
        "length": 5
      },
      "sentence": "L'eau entre par la bouche du poisson et ressort par les opercules.",
      "type": {
        "typeName": "Other"
      },
      "rule": {
        "id": "CONFUSION_ER_E_PAR",
        "subId": "20",
        "sourceFile": "grammar.xml",
        "description": "commencer par (commencé par)",
        "issueType": "uncategorized",
        "category": {
          "id": "CAT_GRAMMAIRE",
          "name": "Grammaire"
        },
        "isPremium": false
      },
      "ignoreForIncompleteSentence": true,
      "contextForSureMatch": 7
    }
  ],

So, I went to the grammar.xml to find "CONFUSION_ER_E_PAR". It's a rulegroup of 22 rules. I'm not comfortable enough with LanguageTool to decide, but most of them seems to assume things that are wrong. At least, the one I understood. For instance, they say that verbs at third personne of singular that ends with "e" and followed by "par" should be past participe. That's just not true. "Il chante par le ventre", "Il entre par la porte", "Il mange par nécessité"... I wonder if the rule should not be completely deleted.

Sharcoux commented 11 months ago

I suggest to replace the whole rulegroup with the following rules:

<rulegroup id="CONFUSION_ER_E_PAR" name="commencer par (commencé par)">
            <!-- Règle Générale pour les Verbes en -er suivis de "par" -->
            <rule>
                <pattern>
                    <token postag="[NJ].*" postag_regexp="yes"/>
                    <marker>
                        <token postag="V inf" regexp="yes">.*er$</token>
                    </marker>
                    <token>par</token>
                </pattern>
                <message>Un participe passé semble plus approprié ici.</message>
                <suggestion><match no="2" regexp_match="(?iu)er" regexp_replace="é"/></suggestion>
                <example correction="affiché">Menu <marker>afficher</marker> par erreur.</example>
            </rule>
            <!-- Règle Générale pour les Verbes Conjugués à la 2e Personne Singulier Présent Indicatif se terminant par "es" -->
            <rule>
                <pattern>
                    <token postag="V ind pres 2 s" regexp="yes">.*es$</token>
                    <token postag="P"/>
                </pattern>
                <message>Un participe passé ou une autre forme verbale pourrait être plus appropriée.</message>
                <suggestion><match no="1" postag="(V) (ind) (pres) (2) (s)" postag_regexp="yes" postag_replace="$1 ppa m p"/></suggestion>
                <suggestion><match no="1" postag="(V) (ind) (pres) (2) (s)" postag_regexp="yes" postag_replace="$1 ind pres 3 p"/></suggestion>
                <example correction="envisagés|envisagent">Les cours <marker>envisages</marker> par cet élève ne paraissent pas pertinents.</example>
            </rule>
            <!-- Règle pour les Erreurs d'Orthographe Communes -->
            <rule>
                <pattern>
                    <token postag="P|V.*" postag_regexp="yes"/>
                    <token>les</token>
                    <marker>
                        <token regexp="yes">cameras|tractes|magasines|députes|délègues|cosignes|arrives|jures|immigres|troues|lutes</token>
                    </marker>
                </pattern>
                <message>Un mot correctement orthographié semble plus approprié.</message>
                <suggestion><match no="3" regexp_match="cameras" regexp_replace="caméras"/></suggestion>
                <suggestion><match no="3" regexp_match="tractes" regexp_replace="tracts"/></suggestion>
                <suggestion><match no="3" regexp_match="magasines" regexp_replace="magazines"/></suggestion>
                <suggestion><match no="3" regexp_match="députes" regexp_replace="députés"/></suggestion>
                <suggestion><match no="3" regexp_match="délègues" regexp_replace="délégués"/></suggestion>
                <suggestion><match no="3" regexp_match="cosignes" regexp_replace="consignes"/></suggestion>
                <suggestion><match no="3" regexp_match="arrives" regexp_replace="arrivées"/></suggestion>
                <suggestion><match no="3" regexp_match="jures" regexp_replace="jurés"/></suggestion>
                <suggestion><match no="3" regexp_match="immigres" regexp_replace="immigrés"/></suggestion>
                <suggestion><match no="3" regexp_match="troues" regexp_replace="trous"/></suggestion>
                <suggestion><match no="3" regexp_match="lutes" regexp_replace="luttes"/></suggestion>
                <example correction="caméras">Il fournit les <marker>cameras</marker>.</example>
            </rule>
        </rulegroup>

This should be enough to sum up the 25 rules of the rulegroup.

Sharcoux commented 11 months ago

Fixed in: https://github.com/languagetool-org/languagetool/pull/9875 https://github.com/languagetool-org/languagetool/pull/9876

GillouLT commented 11 months ago

Hello Sharcoux,

We’re in the process of updating our contributing documentation, Jaume already commented on one of the PRs with good insights, here are a few tips that might be missing from the documentation:

Reworking CONFUSION_ER_E_PAR is very ambitious, the current rulegroup has flaws, any attempt on improving it is very well appreciated :)

If you have any technical questions regarding the codebase and rule development in general, feel free to participate in the forum https://forum.languagetool.org/

Enjoy your day!

Sharcoux commented 11 months ago

Thanks a lot for the feedback. I'll keep working on those 2 rules, and I have a few more PRs to open. I suggest that we continue the discussion directly on the respective PRs. Maybe we can close this issue.

GillouLT commented 11 months ago

Sounds great!