Grammalecte  Check-in [d858319927]

Overview
Comment:[fr] ajustements pour conjugaisons [core] remove legacy code
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk | fr | core
Files: files | file ages | folders
SHA3-256: d85831992722c08b358504eb6f2b703c47a88824b0209ab1acd98be2e2bd0439
User & Date: olr on 2020-05-09 07:33:36
Other Links: manifest | tags
Context
2020-05-09
07:51
[core][fr] fix syntax bug check-in: b75424b663 user: olr tags: core, fr, trunk
07:33
[fr] ajustements pour conjugaisons [core] remove legacy code check-in: d858319927 user: olr tags: core, fr, trunk
2020-05-08
19:18
[build] new checkAgreement function, [core] remove legacy code, [fr] clarification conj 3pl check-in: 967fb3887c user: olr tags: build, core, fr, trunk
Changes

Modified gc_lang/fr/modules-js/gce_analyseur.js from [9617baecc3] to [34026241d7].

    47     47   }
    48     48   
    49     49   function apposition (sWord1, sWord2) {
    50     50       // returns true if nom + nom (no agreement required)
    51     51       return sWord2.length < 2 || (cregex.mbNomNotAdj(_oSpellChecker.getMorph(sWord2)) && cregex.mbPpasNomNotAdj(_oSpellChecker.getMorph(sWord1)));
    52     52   }
    53     53   
    54         -function isVeryAmbiguousAndWrong (sWord1, sWord2, sReqMorphNA, sReqMorphConj, bLastHopeCond) {
    55         -    //// use it if sWord1 can be also a verb; word2 is assumed to be true via isAmbiguousNAV
    56         -    let lMorph2 = _oSpellChecker.getMorph(sWord2);
    57         -    if (lMorph2.length === 0) {
    58         -        return false;
    59         -    }
    60         -    if (cregex.checkConjVerb(lMorph2, sReqMorphConj)) {
    61         -        // verb word2 is ok
    62         -        return false;
    63         -    }
    64         -    let lMorph1 = _oSpellChecker.getMorph(sWord1);
    65         -    if (lMorph1.length === 0) {
    66         -        return false;
    67         -    }
    68         -    if (cregex.checkAgreement(lMorph1, lMorph2) && (cregex.mbAdj(lMorph2) || cregex.mbAdjNb(lMorph1))) {
    69         -        return false;
    70         -    }
    71         -    // now, we know there no agreement, and conjugation is also wrong
    72         -    if (cregex.isNomAdj(lMorph1)) {
    73         -        return true;
    74         -    }
    75         -    //if cregex.isNomAdjVerb(lMorph1): # considered true
    76         -    if (bLastHopeCond) {
    77         -        return true;
    78         -    }
    79         -    return false;
    80         -}
    81         -
    82         -function g_checkAgreement (oToken1, oToken2) {
           54  +function g_checkAgreement (oToken1, oToken2, bNotOnlyNames=true) {
    83     55       // check agreement between <oToken1> and <oToken2>
    84     56       let lMorph1 = oToken1.hasOwnProperty("lMorph") ? oToken1["lMorph"] : _oSpellChecker.getMorph(oToken1["sValue"]);
    85     57       if (lMorph1.length === 0) {
    86     58           return true;
    87     59       }
    88     60       let lMorph2 = oToken2.hasOwnProperty("lMorph") ? oToken2["lMorph"] : _oSpellChecker.getMorph(oToken2["sValue"]);
    89     61       if (lMorph2.length === 0) {
    90     62           return true;
           63  +    }
           64  +    if (bNotOnlyNames  &&  not (cregex.mbAdj(lMorph2) || cregex.mbAdjNb(lMorph1))) {
           65  +        return false;
    91     66       }
    92     67       return cregex.checkAgreement(lMorph1, lMorph2);
    93     68   }
    94     69   
    95     70   function checkAgreement (sWord1, sWord2) {
    96     71       let lMorph2 = _oSpellChecker.getMorph(sWord2);
    97     72       if (lMorph2.length === 0) {
................................................................................
   116     91   
   117     92   
   118     93   // Exceptions
   119     94   
   120     95   const aREGULARPLURAL = new Set(["abricot", "amarante", "aubergine", "acajou", "anthracite", "brique", "caca", "café",
   121     96                                   "carotte", "cerise", "chataigne", "corail", "citron", "crème", "grave", "groseille",
   122     97                                   "jonquille", "marron", "olive", "pervenche", "prune", "sable"]);
   123         -const aSHOULDBEVERB = new Set(["aller", "manger"]);

Modified gc_lang/fr/modules/gce_analyseur.py from [8df2416282] to [8b59546a79].

    37     37   
    38     38   
    39     39   def apposition (sWord1, sWord2):
    40     40       "returns True if nom + nom (no agreement required)"
    41     41       return len(sWord2) < 2 or (cr.mbNomNotAdj(_oSpellChecker.getMorph(sWord2)) and cr.mbPpasNomNotAdj(_oSpellChecker.getMorph(sWord1)))
    42     42   
    43     43   
    44         -def isVeryAmbiguousAndWrong (sWord1, sWord2, sReqMorphNA, sReqMorphConj, bLastHopeCond):
    45         -    "use it if <sWord1> can be also a verb; <sWord2> is assumed to be True via isAmbiguousNAV"
    46         -    lMorph2 = _oSpellChecker.getMorph(sWord2)
    47         -    if not lMorph2:
    48         -        return False
    49         -    if cr.checkConjVerb(lMorph2, sReqMorphConj):
    50         -        # verb word2 is ok
    51         -        return False
    52         -    lMorph1 = _oSpellChecker.getMorph(sWord1)
    53         -    if not lMorph1:
    54         -        return False
    55         -    if cr.checkAgreement(lMorph1, lMorph2) and (cr.mbAdj(lMorph2) or cr.mbAdjNb(lMorph1)):
    56         -        return False
    57         -    # now, we know there no agreement, and conjugation is also wrong
    58         -    if cr.isNomAdj(lMorph1):
    59         -        return True
    60         -    #if cr.isNomAdjVerb(lMorph1): # considered True
    61         -    if bLastHopeCond:
    62         -        return True
    63         -    return False
    64         -
    65         -
    66         -def g_checkAgreement (dToken1, dToken2):
           44  +def g_checkAgreement (dToken1, dToken2, bNotOnlyNames=True):
    67     45       "check agreement between <dToken1> and <dToken2>"
    68     46       lMorph1 = dToken1["lMorph"]  if "lMorph" in dToken1  else  _oSpellChecker.getMorph(dToken1["sValue"])
    69     47       if not lMorph1:
    70     48           return True
    71     49       lMorph2 = dToken2["lMorph"]  if "lMorph" in dToken2  else  _oSpellChecker.getMorph(dToken2["sValue"])
    72     50       if not lMorph2:
    73     51           return True
           52  +    if bNotOnlyNames and not (cr.mbAdj(lMorph2) or cr.mbAdjNb(lMorph1)):
           53  +        return False
    74     54       return cr.checkAgreement(lMorph1, lMorph2)
    75     55   
    76     56   
    77     57   def checkAgreement (sWord1, sWord2):
    78     58       "check agreement between <sWord1> and <sWord1>"
    79     59       lMorph2 = _oSpellChecker.getMorph(sWord2)
    80     60       if not lMorph2:
................................................................................
    98     78   
    99     79   
   100     80   #### Exceptions
   101     81   
   102     82   aREGULARPLURAL = frozenset(["abricot", "amarante", "aubergine", "acajou", "anthracite", "brique", "caca", "café", \
   103     83                               "carotte", "cerise", "chataigne", "corail", "citron", "crème", "grave", "groseille", \
   104     84                               "jonquille", "marron", "olive", "pervenche", "prune", "sable"])
   105         -aSHOULDBEVERB = frozenset(["aller", "manger"])

Modified gc_lang/fr/rules.grx from [43d6b2bea4] to [ab9e97d5ae].

 25495  25495       ne [pas|jamais] être @:(?:V(?:1.*:Y|2.*:Ip.*:3s|3.*:Is.*:3s)|2p)
 25496  25496           <<- /ppas/ --1>> =suggVerbPpas(\-1)                                                         && Après “ne \2 être”, il faut un participe passé.
 25497  25497   
 25498  25498       avoir [pu|cru|pensé|imaginé] être @:(?:V(?:1.*:Y|2.*:Ip.*:3s|3.*:Is.*:3s)|2p)
 25499  25499           <<- /ppas/ not value(<1, "|l’|") and not tag_before(\1, "_que_") --1>> =suggVerbPpas(\-1)     && Après le verbe “être”, il faut un participe passé.
 25500  25500   
 25501  25501       >être  ~..er$
 25502         -        <<- /ppas/ not tag(\2, "_upron_") and morph(\1, ":V", ":Q|>soit/") and (morph(\2, ":Y", ":[NAQ]") or \2 in aSHOULDBEVERB)
        25502  +        <<- /ppas/ not tag(\2, "_upron_") and morph(\1, ":V", ":Q|>soit/") and (morph(\2, ":Y", ":[NAQ]") or morph(\2, ">(?:aller|manger)/"))
 25503  25503               and not morph(<1, ":Y|>ce/") and not value(<1, "|c’|") and not value(<2, "|ce|")
 25504  25504               and not tag_before(\1, "_ceque_") and not tag_before(\1, "_sujinfi_")
 25505  25505           -2>> =suggVerbPpas(\2)                                                                      && Après “être”, le verbe ne devrait pas être à l’infinitif.
 25506  25506   
 25507  25507       >être  ~..ez$
 25508  25508           <<- /ppas/ morph(\1, ":V", ":Q|>soit/") and morph(\2, ":2p", ":[NAQ]")
 25509  25509           -2>> =suggVerbPpas(\2)                                                                      && Après “être”, le verbe ne devrait pas être conjugué à la 2ᵉ personne du pluriel.
................................................................................
 26639  26639   TEST: les avoir consultées grâce à une personne y ayant accès sur le plan juridique.
 26640  26640   TEST: Être président d’une association demande beaucoup de temps.
 26641  26641   TEST: Venir vaincue ne lui épargna aucune indignité.
 26642  26642   TEST: Mais migrer un site et ses contenus prend du temps…
 26643  26643   TEST: y être sans ma femme ni les enfants fait monter en moi une certaine nervosité.
 26644  26644   
 26645  26645   
 26646         -__conj_det_sing_nom__
 26647         -    [le|la|l’|un|une|ce|cet|cette|mon|ton|son|ma|ta|sa|notre|votre|leur]  *WORD  @:V¬:(?:3s|P|Q|Y|3p!|G|M)
        26646  +__conj_le_la_leur_nom__
        26647  +    [le|la|l’|leur]  *WORD  @:V¬:(?:3s|P|Y|3p!|G|M)
 26648  26648           <<- /conj/ not tag(\2, "_enum_") and morph(<1, ":C|<start>|>,", ":[YP]") and morph(\2, ":[NA].*:[si]", ":G")
 26649  26649               and not ( (value(\2, "|dizaine|douzaine|quinzaine|vingtaine|trentaine|quarantaine|cinquantaine|soixantaine|centaine|majorité|minorité|millier|partie|poignée|tas|paquet|moitié|")
 26650         -                        or tag_before(\1, "_ni_") or value(<1, "|et|ou|")) and morph(\3, ":3?p") ) >>>
 26651         -        <<- /conj/ not checkAgreement(\2, \3)
 26652         -        -3>> =suggVerb(\3, ":3s")                                       && Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du singulier.
 26653         -        <<- /conj/ __else__ and isVeryAmbiguousAndWrong(\2, \3, ":s", ":3s", value(<1, "|<start>|,|"))
 26654         -        -3>> =suggVerb(\3, ":3s", suggSing)                             && Accord avec “\1 \2…” incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.
        26650  +                        or tag_before(\1, "_ni_") or value(<1, "|et|ou|")) and morph(\3, ":3?p") ) and not checkAgreement(\2, \3)
        26651  +            and not ( morph(\2, "(?:[123][sp]|P)") and not value(<1, "|<start>|,|") ) >>>
        26652  +        <<- /conj/ morph(\3, ":A.*:p") or (morph(\3, ":N.*:p") and morph(\2, ":A")) -3>> =suggVerb(\3, ":3s", suggSing)  && Accord avec “\1 \2…” incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.
        26653  +        <<- /conj/ __else__ -3>> =suggVerb(\3, ":3s")                                               && Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du singulier.
 26655  26654   
 26656         -    [le|la|l’|un|une|ce|cet|cette|mon|ton|son|ma|ta|sa|notre|votre|leur]  *WORD  qui  @:V¬:(?:3s|P|3p!|G|M)
        26655  +    [le|la|l’|leur]  *WORD  qui  @:V¬:(?:3s|P|3p!|G|M)
 26657  26656           <<- /conj/ not tag(\2, "_enum_") and morph(<1, ":C|<start>|>,", ":[YP]") and morph(\2, ":[NA].*:[si]", ":G")
 26658  26657               and not ( (value(\2, "|dizaine|douzaine|quinzaine|vingtaine|trentaine|quarantaine|cinquantaine|soixantaine|centaine|majorité|minorité|millier|partie|poignée|tas|paquet|moitié|")
 26659  26658                           or tag_before(\1, "_ni_") or value(<1, "|et|ou|")) and morph(\4, ":3p") )
 26660         -        -4>> =suggVerb(\4, ":3s")                                       && Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du singulier.
        26659  +        -4>> =suggVerb(\4, ":3s")                                                                   && Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du singulier.
 26661  26660   
 26662  26661   TEST: La {{N.S.A.}} {{espionneras}} toujours tout le monde
 26663  26662   TEST: La suspicion envers les élus {{accroissaient}}…                                               ->> accroissait
 26664  26663   TEST: Le chien n’{{es}} pas mort.
 26665         -TEST: Ce roman-là de Jean-Paul Sartre {{es}} passionnant.
 26666  26664   TEST: Le damné {{donnes}}
 26667         -TEST: Cette confusion qui {{donnent}} le tournis.
 26668  26665   TEST: La Corée {{peux}} gagner.
 26669  26666   TEST: La Corée ne {{pourras}} pas gagner.
 26670         -TEST: une hausse de 2 % {{satisfais}} tout le monde                                                 ->> satisfait
 26671  26667   TEST: L’homme y {{donnes}}
        26668  +TEST: la femme {{pensent}} à ses filles
        26669  +TEST: Le carré {{reviens}} à la mode
 26672  26670   TEST: Le chien y {{viens}}                                                                          ->> vient
 26673  26671   TEST: L’homme le {{deviens}}                                                                        ->> devient
 26674  26672   TEST: La femme la {{prends}}                                                                        ->> prend
 26675  26673   TEST: Le feu nous {{donnes}} chaud.
 26676         -TEST: une petite {{donnes}}
 26677         -TEST: tu vois, leur donne {{donnes}} du fil à retordre
 26678  26674   TEST: tout le monde {{prends}} ses aises                                                            ->> prend
 26679         -TEST: J’aimerais aussi que mon problème {{sois}} réglé.                                             ->> soit
 26680  26675   TEST: La proscription de nager {{pourraient}} nous porter préjudice à long terme                    ->> pourrait
 26681         -TEST: mon chat {{sautes}}
 26682         -TEST: cette fille {{bouffes}} comme mille
 26683         -TEST: cette marchande {{marchandes}}
 26684  26676   TEST: la marchande {{marchandes}}
 26685  26677   TEST: la chatte {{finis}}
 26686  26678   TEST: le chat {{finis}}
 26687         -TEST: une crise {{violent}}
 26688         -TEST: un cri {{violes}}
        26679  +TEST: leur chat qui {{torturent}} une souris
        26680  +TEST: leur homme à tout faire {{oublient}} toujours tout
        26681  +TEST: tu vois, leur donne {{donnes}} du fil à retordre
 26689  26682   TEST: L’homme sur le bateau de Patrick {{viens}} de temps en temps {{mangé}} chez moi.
 26690  26683   TEST: L’hypothétique nouveau président
 26691         -TEST: une majorité de garçons voient mal comment faire
 26692         -TEST: un tas de choses pouvaient aller de travers.
 26693         -TEST: un paquet de gens futés n’y ont vu que du feu.
 26694  26684   TEST: La moitié d’entre elles voient leurs loyers diminuer depuis le début de l’année
 26695         -TEST: Une partie de ces propositions étaient naïves
 26696         -TEST: tu n’acceptais jamais de danser avec quelqu’un si tu avais refusé à quelqu’un d’autre au début
 26697  26685   TEST: le loquet d’une des petites portes.
 26698  26686   TEST: L’électricité, l’hydrogène, l’air comprimé n’existent pas…
 26699  26687   TEST: la Syrie, l’Irak, la Mésopotamie tombaient.
        26688  +TEST: Le sentiment d’humiliation, la colère nous indiquent que…
        26689  +TEST: la majorité survenaient sous la contrainte
        26690  +
        26691  +
        26692  +__conj_det_sing_nom__
        26693  +    [un|ce|cet|mon|ton|son|notre|votre]  *WORD  @:V¬:(?:3s|P|Y|3p!|G|M)
        26694  +        <<- /conj/ not tag(\2, "_enum_") and morph(<1, ":C|<start>|>,", ":[YP]") and morph(\2, ":[NA].*:[me]:[si]", ":G")
        26695  +            and not ( (value(\2, "|dizaine|douzaine|quinzaine|vingtaine|trentaine|quarantaine|cinquantaine|soixantaine|centaine|majorité|minorité|millier|partie|poignée|tas|paquet|moitié|")
        26696  +                        or tag_before(\1, "_ni_") or value(<1, "|et|ou|")) and morph(\3, ":3?p") ) and not checkAgreement(\2, \3) >>>
        26697  +        <<- /conj/ morph(\3, ":A.*:p") or (morph(\3, ":N.*:p") and morph(\2, ":A")) -3>> =suggVerb(\3, ":3s", suggSing) && Accord avec “\1 \2…” incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.
        26698  +        <<- /conj/ __else__ -3>> =suggVerb(\3, ":3s")                                                                   && Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du singulier.
        26699  +
        26700  +    [une|cette|mon|ton|son|ma|ta|sa|notre|votre]  *WORD  @:V¬:(?:3s|P|Y|3p!|G|M)
        26701  +        <<- /conj/ not tag(\2, "_enum_") and morph(<1, ":C|<start>|>,", ":[YP]") and morph(\2, ":[NA].*:[fe]:[si]", ":G")
        26702  +            and not ( (value(\2, "|dizaine|douzaine|quinzaine|vingtaine|trentaine|quarantaine|cinquantaine|soixantaine|centaine|majorité|minorité|millier|partie|poignée|tas|paquet|moitié|")
        26703  +                        or tag_before(\1, "_ni_") or value(<1, "|et|ou|")) and morph(\3, ":3?p") ) and not checkAgreement(\2, \3) >>>
        26704  +        <<- /conj/ morph(\3, ":A.*:p") or (morph(\3, ":N.*:p") and morph(\2, ":A")) -3>> =suggVerb(\3, ":3s", suggSing) && Accord avec “\1 \2…” incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.
        26705  +        <<- /conj/ __else__ -3>> =suggVerb(\3, ":3s")                                                                   && Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du singulier.
        26706  +
        26707  +    [un|une|ce|cet|cette|mon|ton|son|ma|ta|sa|notre|votre]  *WORD  qui  @:V¬:(?:3s|P|3p!|G|M)
        26708  +        <<- /conj/ not tag(\2, "_enum_") and morph(<1, ":C|<start>|>,", ":[YP]") and morph(\2, ":[NA].*:[si]", ":G")
        26709  +            and not ( (value(\2, "|dizaine|douzaine|quinzaine|vingtaine|trentaine|quarantaine|cinquantaine|soixantaine|centaine|majorité|minorité|millier|partie|poignée|tas|paquet|moitié|")
        26710  +                        or tag_before(\1, "_ni_") or value(<1, "|et|ou|")) and morph(\4, ":3p") )
        26711  +        -4>> =suggVerb(\4, ":3s")                                                                                       && Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du singulier.
        26712  +
        26713  +TEST: Tu devrais le savoir, ce roman-là de Jean-Paul Sartre {{es}} passionnant.
        26714  +TEST: Cette confusion qui {{donnent}} le tournis.
        26715  +TEST: tu sais, une hausse de 2 % {{satisfais}} tout le monde                                        ->> satisfait
        26716  +TEST: tu sais, une petite {{donnes}} satisfaction
        26717  +TEST: tu penses mal, cet homme {{mens}}
        26718  +TEST: J’aimerais aussi que mon problème {{sois}} réglé.                                             ->> soit
        26719  +TEST: un grand {{ravis}} tous les prix
        26720  +TEST: mon chat {{sautes}}
        26721  +TEST: cette fille {{bouffes}} comme mille
        26722  +TEST: cette marchande {{marchandes}}
        26723  +TEST: une crise {{violent}}
        26724  +TEST: un cri {{violes}}
        26725  +TEST: ton chien {{bouffent}} sans arrêt
        26726  +TEST: une majorité de garçons voient mal comment faire
        26727  +TEST: un tas de choses pouvaient aller de travers.
        26728  +TEST: un paquet de gens futés n’y ont vu que du feu.
        26729  +TEST: Une partie de ces propositions étaient naïves
        26730  +TEST: tu n’acceptais jamais de danser avec quelqu’un si tu avais refusé à quelqu’un d’autre au début
 26700  26731   TEST: des ruisselets, des arbres, une tonnelle qui rappelaient le temps.
 26701  26732   TEST: son assurance, sa grâce, son sex-appeal nous permettent de passer sans encombre liquides et rasoirs.
 26702  26733   TEST: Son courage, son ardeur étaient immenses,
 26703         -TEST: Le sentiment d’humiliation, la colère nous indiquent que…
 26704         -TEST: la majorité survenaient sous la contrainte
 26705  26734   
 26706  26735   
 26707  26736   __conj_un_une__
 26708  26737       [un|une]  @:V¬:(?:3s|P|G|Q|M|[NA].*:[si])
 26709  26738           <<- /conj/ morph(<1, ":C|<start>|>(?:,|dont)", ":(?:Y|P|Q|[123][sp]|R)̉|>(?:sauf|excepté|et|ou)/")
 26710  26739           --1>> =suggVerb(\-1, ":3s")                             && Conjugaison erronée. Accord avec “\1…”. Le verbe devrait être à la 3ᵉ personne du singulier.
 26711  26740   
................................................................................
 26944  26973   TEST: elles vont toutes aller faire un tour
 26945  26974   
 26946  26975   
 26947  26976   __conj_det_plur_nom__
 26948  26977       [ces|mes|tes|ses|nos|vos|leurs|quelques|maints]  @:[NA].*:[pi]¬:V0  @:V¬:(?:3p|P|Y|G|M|A.*:[pi])
 26949  26978           <<- /conj/ morph(<1, ":Cs|<start>|>,")
 26950  26979               and not( morph(\3, ":3s") and before("(?i)\\b(?:l[ea] |l’|une? |ce(?:tte|t|) |[mts](?:on|a) |[nv]otre ).+ entre .+ et ") ) >>>
 26951         -        <<- /conj/ morph(\3, ":A.*:s") or (morph(\3, ":N") and morph(\2, ":A")) -3>> =suggVerb(\3, ":3p", suggPlur)     && Accord avec « \1 \2… » incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.
        26980  +        <<- /conj/ morph(\3, ":A.*:s") or (morph(\3, ":N.*:s") and morph(\2, ":A")) -3>> =suggVerb(\3, ":3p", suggPlur) && Accord avec « \1 \2… » incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.
 26952  26981           <<- /conj/ __else__ -3>> =suggVerb(\3, ":3p")                                                                   && Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du pluriel.
 26953  26982   
 26954  26983       [ces|mes|tes|ses|nos|vos|leurs|quelques|maints]  @:[NA].*:[pi]¬:V0  qui  @:V¬:(?:3p|P|Y|G|M|A.*:e:[pi])
 26955  26984           <<- /conj/ morph(<1, ":Cs|<start>|>,")
 26956  26985               and not( morph(\4, ":3s") and before("(?i)\\b(?:l[ea] |l’|une? |ce(?:tte|t|) |[mts](?:on|a) |[nv]otre ).+ entre .+ et ") )
 26957  26986           -4>> =suggVerb(\4, ":3p")                                                                                       && Conjugaison erronée. Accord avec “\1 \2 \3…”. Le verbe devrait être à la 3ᵉ personne du pluriel.
 26958  26987   
................................................................................
 26966  26995   TEST: maints hommes {{oublie}} leurs origines pour mieux se construire un passé glorieux
 26967  26996   TEST: nos hommes qui {{repartirons}} demain
 26968  26997   TEST: le lien entre les agences de renseignement et ces mêmes entreprises pouvait reposer sur des activités de surveillance à proprement parler.
 26969  26998   TEST: trier les cons et les connes expose à un violent coup de boomerang
 26970  26999   TEST: Tu penses que quelqu’un qui frappe sa femme et ses enfants est un bon père ?
 26971  27000   
 26972  27001   
 26973         -__conj_det_plur_nom_confusion__
 26974         -    les  @:[NA].*:[pi]¬:V0  @:V¬:(?:3p|P|Y|G|M|A.*:e:[pi])
        27002  +__conj_les_nom__
        27003  +    les  @:[NA].*:[pi]¬:V0  @:V¬:(?:3p|P|Y|G|M)
 26975  27004           <<- /conj/ morph(<1, ":Cs|<start>|>,")
 26976         -            and not( morph(\3, ":3s") and before("(?i)\\b(?:l[ea] |l’|une? |ce(?:tte|t|) |[mts](?:on|a) |[nv]otre ).+ entre .+ et ") ) >>>
 26977         -        <<- /conj/ not checkAgreement(\2, \3)
 26978         -        -3>> =suggVerb(\3, ":3p")                                       && Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du pluriel.
 26979         -        <<- /conj/ __else__ and isVeryAmbiguousAndWrong(\2, \3, ":p", ":3p", value(<1, "|<start>|,|"))
 26980         -        -3>> =suggVerb(\3, ":3p", suggPlur)                             && Accord avec “\1 \2…” incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.
 26981         -
 26982         -    [certains|certaines]  @:[NA].*:[pi]  @:V¬:(?:3p|P|Y|G|M|A.*:e:[pi])
 26983         -        <<- /conj/ morph(<1, ":Cs|<start>|>,")
 26984         -            and not( morph(\3, ":3s") and before("(?i)\\b(?:l[ea] |l’|une? |ce(?:tte|t|) |[mts](?:on|a) |[nv]otre ).+ entre .+ et ") ) >>>
 26985         -        <<- /conj/ not checkAgreement(\2, \3)
 26986         -        -3>> =suggVerb(\3, ":3p")                                       && Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du pluriel.
 26987         -        <<- /conj/ __else__ and isVeryAmbiguousAndWrong(\2, \3, ":m:p", ":3p", value(<1, "|<start>|,|"))
 26988         -        -3>> =suggVerb(\3, ":3p", suggMasPlur)                          && Accord avec “\1 \2…” incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.
 26989         -        <<- /conj/ __else__ and isVeryAmbiguousAndWrong(\2, \3, ":f:p", ":3p", value(<1, "|<start>|,|"))
 26990         -        -3>> =suggVerb(\3, ":3p", suggFemPlur)                          && Accord avec “\1 \2…” incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.
 26991         -
 26992         -    plusieurs  @:[NA].*:[pi]  @:V¬:(?:3p|P|Y|G|M|A.*:e:[pi])
 26993         -        <<- /conj/ morph(<1, ":Cs|<start>|>,")
 26994         -            and not( morph(\3, ":3s") and before("(?i)\\b(?:l[ea] |l’|une? |ce(?:tte|t|) |[mts](?:on|a) |[nv]otre ).+ entre .+ et ") )
        27005  +            and not ( morph(\3, ":3s") and before("(?i)\\b(?:l[ea] |l’|une? |ce(?:tte|t|) |[mts](?:on|a) |[nv]otre ).+ entre .+ et ") )
 26995  27006               and not checkAgreement(\2, \3)
 26996         -        -3>> =suggVerb(\3, ":3p")                                       && Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du pluriel.
        27007  +            and not ( morph(\2, "(?:[123][sp]|P)") and not value(<1, "|<start>|,|") ) >>>
        27008  +        <<- /conj/ morph(\3, ":A.*:s") or (morph(\3, ":N.*:s") and morph(\2, ":A")) -3>> =suggVerb(\3, ":3p", suggPlur) && Accord avec “\1 \2…” incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.
        27009  +        <<- /conj/ __else__ -3>> =suggVerb(\3, ":3p")                                                                   && Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du pluriel.
 26997  27010   
 26998         -    [les|certains|certaines|plusieurs]  @:[NA].*:[pi]  qui  @:V¬:(?:[13]p|P|Y|G|M)
        27011  +    les  @:[NA].*:[pi]  qui  @:V¬:(?:3p|P|Y|G|M)
 26999  27012           <<- /conj/ morph(<1, ":Cs|<start>|>,")
 27000  27013               and not( morph(\4, ":3s") and before("(?i)\\b(?:l[ea] |l’|une? |ce(?:tte|t|) |[mts](?:on|a) |[nv]otre ).+ entre .+ et ") )
 27001  27014           -4>> =suggVerb(\4, ":3p")                                       && Conjugaison erronée. Accord avec “\1 \2 \3…”. Le verbe devrait être à la 3ᵉ personne du pluriel.
 27002  27015   
 27003  27016   TEST: Les abstentions {{est}} présumée manifester un défaut d’opinion marquée
 27004  27017   TEST: Les cours de culture générale nous {{apporte}} de l’ouverture d’esprit.
 27005  27018   TEST: Les hommes ne le lui {{pardonnes}} pas.
................................................................................
 27018  27031   TEST: il prétendait que les banques universelles « à la française » s’{{était}} très honorablement comportées
 27019  27032   TEST: les marchands {{paye}}
 27020  27033   TEST: les marchands {{marchande}}
 27021  27034   TEST: les marchandes {{paie}}
 27022  27035   TEST: les marchandes {{marchande}}
 27023  27036   TEST: les chattes {{finis}}
 27024  27037   TEST: les chattes {{manges}}
 27025         -TEST: Les tests grand public de Jean-Paul {{montre}} des résultats surprenants.
 27026         -TEST: les chattes {{danse}}
 27027         -TEST: certains hommes {{marchande}} sans cesse
 27028         -TEST: tu sais, certains filtres {{donnes}} de mauvais résultats
 27029         -TEST: certaines femmes {{danse}} beaucoup
 27030         -TEST: tu sais, certaines danses {{dérive}} d’autres
 27031         -TEST: certaines demandes qui {{donne}} le tournis.
 27032         -TEST: plusieurs personnes {{devienne}} des robots
 27033         -TEST: plusieurs pressions qui ne {{donne}} pas les résultats attendus.
        27038  +TEST: les religieux qui n’en {{finisse}} pas de mentir.
        27039  +TEST: Les tests grand public de Jean-Paul {{montre}} des résultats surprenants.I
 27034  27040   TEST: les malades que tu as servis {{outrepasse}} leur droit
 27035  27041   TEST: l’écart entre les riches et les pauvres n’était pas si grand.
 27036  27042   TEST: Les grands hommes politiques
 27037  27043   TEST: les charmantes petites mines de toutes les jeunes filles
 27038  27044   TEST: Les pauvres petites dames sont folles
 27039  27045   TEST: Sauf que l’un comme l’autre avaient dû y renoncer.
 27040  27046   TEST: L’un comme l’autre devaient y renoncer.
 27041  27047   TEST: Les écrivaines Marie Darrieussecq et Annie Ernaux
 27042  27048   TEST: Les femmes candidates à ce poste doivent se présenter cet après-midi.
 27043  27049   TEST: Toutes les personnes candidates seront évaluées plusieurs fois.
 27044  27050   TEST: il les a sélectionnés, les a améliorées pour accroître leur rendement
 27045  27051   
        27052  +
        27053  +__conj_certains_certaines_plusieurs_nom__
        27054  +    certains  @:[NA].*:[pi]  @:V¬:(?:3p|P|Y|G|M)
        27055  +        <<- /conj/ morph(<1, ":Cs|<start>|>,")
        27056  +            and not( morph(\3, ":3s") and before("(?i)\\b(?:l[ea] |l’|une? |ce(?:tte|t|) |[mts](?:on|a) |[nv]otre ).+ entre .+ et ") )
        27057  +            and not checkAgreement(\2, \3)
        27058  +            and not ( morph(\2, "(?:[123][sp]|P)") and not value(<1, "|<start>|,|") ) >>>
        27059  +        <<- /conj/ morph(\3, ":A.*:s") or (morph(\3, ":N.*:s") and morph(\2, ":A")) -3>> =suggVerb(\3, ":3p", suggMasPlur)  && Accord avec “\1 \2…” incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.
        27060  +        <<- /conj/ __else__ -3>> =suggVerb(\3, ":3p")                                                                   && Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du pluriel.
        27061  +
        27062  +    certaines  @:[NA].*:[pi]  @:V¬:(?:3p|P|Y|G|M)
        27063  +        <<- /conj/ morph(<1, ":Cs|<start>|>,")
        27064  +            and not( morph(\3, ":3s") and before("(?i)\\b(?:l[ea] |l’|une? |ce(?:tte|t|) |[mts](?:on|a) |[nv]otre ).+ entre .+ et ") )
        27065  +            and not checkAgreement(\2, \3)
        27066  +            and not ( morph(\2, "(?:[123][sp]|P)") and not value(<1, "|<start>|,|") ) >>>
        27067  +        <<- /conj/ morph(\3, ":A.*:s") or (morph(\3, ":N.*:s") and morph(\2, ":A")) -3>> =suggVerb(\3, ":3p", suggFemPlur)  && Accord avec “\1 \2…” incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.
        27068  +        <<- /conj/ __else__ -3>> =suggVerb(\3, ":3p")                                                                   && Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du pluriel.
        27069  +
        27070  +    plusieurs  @:[NA].*:[pi]  @:V¬:(?:3p|P|Y|G|M)
        27071  +        <<- /conj/ morph(<1, ":Cs|<start>|>,")
        27072  +            and not( morph(\3, ":3s") and before("(?i)\\b(?:l[ea] |l’|une? |ce(?:tte|t|) |[mts](?:on|a) |[nv]otre ).+ entre .+ et ") )
        27073  +            and not checkAgreement(\2, \3)
        27074  +            and not ( morph(\2, "(?:[123][sp]|P)") and not value(<1, "|<start>|,|") ) >>>
        27075  +        <<- /conj/ morph(\3, ":A.*:s") or (morph(\3, ":N.*:s") and morph(\2, ":A")) -3>> =suggVerb(\3, ":3p", suggPlur) && Accord avec “\1 \2…” incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.
        27076  +        <<- /conj/ __else__ -3>> =suggVerb(\3, ":3p")                                                                   && Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du pluriel.
        27077  +
        27078  +    [certains|certaines|plusieurs]  @:[NA].*:[pi]  qui  @:V¬:(?:3p|P|Y|G|M)
        27079  +        <<- /conj/ morph(<1, ":Cs|<start>|>,")
        27080  +            and not( morph(\4, ":3s") and before("(?i)\\b(?:l[ea] |l’|une? |ce(?:tte|t|) |[mts](?:on|a) |[nv]otre ).+ entre .+ et ") )
        27081  +        -4>> =suggVerb(\4, ":3p")                                       && Conjugaison erronée. Accord avec “\1 \2 \3…”. Le verbe devrait être à la 3ᵉ personne du pluriel.
        27082  +
        27083  +TEST: les chattes {{danse}}
        27084  +TEST: certains hommes {{marchande}} sans cesse
        27085  +TEST: tu sais, certains filtres {{donnes}} de mauvais résultats
        27086  +TEST: certaines femmes {{danse}} beaucoup
        27087  +TEST: tu sais, certaines danses {{dérive}} d’autres
        27088  +TEST: certaines demandes qui {{donne}} le tournis.
        27089  +TEST: certaines petites {{fatigue}}
        27090  +TEST: plusieurs personnes {{devienne}} des robots
        27091  +TEST: plusieurs pressions qui ne {{donne}} pas les résultats attendus.
        27092  +TEST: plusieurs petites {{actionne}} le levier ensemble.
        27093  +TEST: plusieurs femmes {{marchande}}
        27094  +TEST: j’en connais plusieurs soumises à de très fortes pressions
        27095  +TEST: certaines femmes prises par leur travail n’ont plus le temps pour rien d’autre.
        27096  +TEST: certains imbéciles passés à l’ennemi feraient mieux de se taire.
        27097  +
 27046  27098   
 27047  27099   __conj_des_nom__
 27048  27100       [<start>|,|(]  des  @:[NA].*:[pi]  @:V¬:(?:3p|P|G|Q|Y|A.*:[pi]|V[23].*:Y)
 27049  27101           <<- /conj/ morph(>1, ":(?:R|D.*:p)|>au/|<end>|>,") >>>
 27050  27102           <<- /conj/ not morph(\4, ":[NA]") -4>> =suggVerb(\4, ":3p")                                 && Conjugaison erronée. Accord avec “\2 \3…”. Le verbe devrait être à la 3ᵉ personne du pluriel.
 27051  27103           <<- /conj/ __else__ and not checkAgreement(\3, \4) -4>> =suggVerb(\4, ":3p", suggPlur)      && Conjugaison erronée. Accord avec “\2 \3…”. Le verbe devrait être à la 3ᵉ personne du pluriel.
 27052  27104