Grammalecte  Check-in [fe3d698598]

Overview
Comment:[fr] remaniements des pronoms associés, +ajustements et faux positifs [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: fe3d6985983ba32ade5810566d4a8a776b28b39f91577f192b12f584baeac26e
User & Date: olr on 2020-05-09 15:21:35
Other Links: manifest | tags
Context
2020-05-10
08:01
[fr] suppression des espaces insécables fins dans les messages d’erreur, +ajustements, +nr: confusion infi/ppas check-in: b771791846 user: olr tags: fr, trunk
2020-05-09
17:21
merge trunk check-in: 607a6d50af user: olr tags: gcerw
15:21
[fr] remaniements des pronoms associés, +ajustements et faux positifs [core] remove legacy code check-in: fe3d698598 user: olr tags: core, fr, trunk
12:21
[fr] faux positifs check-in: 5dbf99c441 user: olr tags: fr, trunk
Changes

Modified gc_lang/fr/modules-js/gce_analyseur.js from [39d2630e9f] to [1edcbef032].

12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
        else if (oToken["sValue"].search(/-l(?:es?|a)-(?:[mt]oi|nous|leur)$|(?:[nv]ous|lui|leur)-en$/) != -1) {
            nEnd = oToken["sValue"].slice(0,nEnd).lastIndexOf("-");
        }
    }
    return g_morph(oToken, sPattern, sNegPattern, 0, nEnd, false);
}

function rewriteSubject (s1, s2) {
    // s1 is supposed to be prn/patr/npr (M[12P])
    if (s2 == "lui") {
        return "ils";
    }
    if (s2 == "moi") {
        return "nous";
    }
    if (s2 == "toi") {
        return "vous";
    }
    if (s2 == "nous") {
        return "nous";
    }
    if (s2 == "vous") {
        return "vous";
    }
    if (s2 == "eux") {
        return "ils";
    }
    if (s2 == "elle" || s2 == "elles") {
        if (cregex.mbNprMasNotFem(_oSpellChecker.getMorph(s1))) {
            return "ils";
        }
        // si épicène, indéterminable, mais OSEF, le féminin l’emporte
        return "elles";
    }
    return s1 + " et " + s2;
}

function apposition (sWord1, sWord2) {
    // returns true if nom + nom (no agreement required)
    return sWord2.length < 2 || (cregex.mbNomNotAdj(_oSpellChecker.getMorph(sWord2)) && cregex.mbPpasNomNotAdj(_oSpellChecker.getMorph(sWord1)));
}

function g_checkAgreement (oToken1, oToken2, bNotOnlyNames=true) {
    // check agreement between <oToken1> and <oToken2>







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







12
13
14
15
16
17
18






























19
20
21
22
23
24
25
        else if (oToken["sValue"].search(/-l(?:es?|a)-(?:[mt]oi|nous|leur)$|(?:[nv]ous|lui|leur)-en$/) != -1) {
            nEnd = oToken["sValue"].slice(0,nEnd).lastIndexOf("-");
        }
    }
    return g_morph(oToken, sPattern, sNegPattern, 0, nEnd, false);
}































function apposition (sWord1, sWord2) {
    // returns true if nom + nom (no agreement required)
    return sWord2.length < 2 || (cregex.mbNomNotAdj(_oSpellChecker.getMorph(sWord2)) && cregex.mbPpasNomNotAdj(_oSpellChecker.getMorph(sWord1)));
}

function g_checkAgreement (oToken1, oToken2, bNotOnlyNames=true) {
    // check agreement between <oToken1> and <oToken2>

Modified gc_lang/fr/modules/gce_analyseur.py from [e1e5c27c19] to [577ebd9866].

9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
    if dToken["sValue"].count("-") > 1:
        if "-t-" in dToken["sValue"]:
            nEnd = nEnd - 2
        elif re.search("-l(?:es?|a)-(?:[mt]oi|nous|leur)$|(?:[nv]ous|lui|leur)-en$", dToken["sValue"]):
            nEnd = dToken["sValue"][0:nEnd].rfind("-")
    return g_morph(dToken, sPattern, sNegPattern, 0, nEnd, False)


def rewriteSubject (s1, s2):
    "rewrite complex subject: <s1> a prn/patr/npr (M[12P]) followed by “et” and <s2>"
    if s2 == "lui":
        return "ils"
    if s2 == "moi":
        return "nous"
    if s2 == "toi":
        return "vous"
    if s2 == "nous":
        return "nous"
    if s2 == "vous":
        return "vous"
    if s2 == "eux":
        return "ils"
    if s2 in ("elle", "elles"):
        if cr.mbNprMasNotFem(_oSpellChecker.getMorph(s1)):
            return "ils"
        # si épicène, indéterminable, mais OSEF, le féminin l’emporte
        return "elles"
    return s1 + " et " + s2


def apposition (sWord1, sWord2):
    "returns True if nom + nom (no agreement required)"
    return len(sWord2) < 2 or (cr.mbNomNotAdj(_oSpellChecker.getMorph(sWord2)) and cr.mbPpasNomNotAdj(_oSpellChecker.getMorph(sWord1)))


def g_checkAgreement (dToken1, dToken2, bNotOnlyNames=True):







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







9
10
11
12
13
14
15






















16
17
18
19
20
21
22
    if dToken["sValue"].count("-") > 1:
        if "-t-" in dToken["sValue"]:
            nEnd = nEnd - 2
        elif re.search("-l(?:es?|a)-(?:[mt]oi|nous|leur)$|(?:[nv]ous|lui|leur)-en$", dToken["sValue"]):
            nEnd = dToken["sValue"][0:nEnd].rfind("-")
    return g_morph(dToken, sPattern, sNegPattern, 0, nEnd, False)
























def apposition (sWord1, sWord2):
    "returns True if nom + nom (no agreement required)"
    return len(sWord2) < 2 or (cr.mbNomNotAdj(_oSpellChecker.getMorph(sWord2)) and cr.mbPpasNomNotAdj(_oSpellChecker.getMorph(sWord1)))


def g_checkAgreement (dToken1, dToken2, bNotOnlyNames=True):

Modified gc_lang/fr/rules.grx from [3b0f370a66] to [0a8c74f5cd].

1922
1923
1924
1925
1926
1927
1928








1929
1930
1931
1932
1933
1934
1935
.....
13256
13257
13258
13259
13260
13261
13262

13263
13264
13265
13266
13267
13268
13269
.....
15387
15388
15389
15390
15391
15392
15393
15394
15395
15396
15397
15398
15399
15400
15401
15402
15403
15404
15405
15406
15407
15408
.....
16072
16073
16074
16075
16076
16077
16078

















16079
16080
16081
16082
16083
16084
16085
.....
20055
20056
20057
20058
20059
20060
20061

20062
20063
20064
20065
20066

20067
20068
20069
20070
20071
20072
20073
20074
20075
20076
20077
20078
.....
20081
20082
20083
20084
20085
20086
20087

20088
20089
20090
20091
20092
20093
20094
20095
20096
20097
20098
20099
20100
20101
20102
20103
20104
20105
20106
20107
20108
20109
.....
20121
20122
20123
20124
20125
20126
20127



20128
20129
20130
20131
20132
20133
20134
.....
22163
22164
22165
22166
22167
22168
22169
22170
22171
22172
22173
22174
22175
22176
22177
22178
22179
.....
22410
22411
22412
22413
22414
22415
22416


22417
22418
22419
22420
22421
22422
22423
.....
26811
26812
26813
26814
26815
26816
26817
26818
















26819








26820
26821
26822
26823
26824
26825
26826
.....
26832
26833
26834
26835
26836
26837
26838
26839
26840
26841
26842
26843
26844
26845
26846
        <<- ~>> seras


__da_été__
    >avoir ?@:[WX]¿ été
        <<- =>> select(\-1, ":Q")










__da_prépositions__
    dans
        <<- not morph(<1, ":D.*:p|>[a-z]+ième/") =>> select(\1, ":R")

    passé  [<end>|,|$:R]
        <<- =>> exclude(\1, ":G")
................................................................................
    à juste [raison|titre]
    à l’ [accoutumée|amiable|arrache|arrachée|avance|avenant|aveuglette|emporte-pièce|envi|évidence|étouffée|improviste|inverse|unanimité|unisson]
    à l’ air libre
    à l’ avenir ?[incertain|prometteur]¿
    à l’ échelon [local|cantonal|départemental|régional|national|européen|américain|africaine|asiatique|continental|international|planétaire|galactique|universel]
    à l’ échelle [locale|cantonale|départementale|régionale|nationale|européenne|américaine|africaine|asiatique|continentale|internationale|planétaire|galactique|universelle]
    à l’ en croire

    à l’ état pur
    à l’ exclusion de toute autre chose
    à l’ extrémité [est|ouest|nord|sud]
    à l’ ordre du jour
    à l’ un d’ entre [nous|vous|eux|iels]
    à l’ une d’ entre [nous|vous|elles|iels]
    à l’ échelle [nationale|mondiale|régionale|départementale|cantonale|locale|galactique|universelle]
................................................................................
    [le|ce|du]  [baron|docteur|député|duc|frère|ministre|prince|professeur|président|roi|sénateur|mir]  @:M[12]
    [la|cette]  [baronne|docteur|docteure|députée|duchesse|ministre|sœur|princesse|présidente|professeure|reine|sénatrice]  @:M[12]
        <<- ~3>> *

    [Mr|Mlle|Mme|Mgr|miss]  ~^[A-ZÉÈÊ]
        <<- ~2>> *

    $:Cs  ~^[A-ZÉÈÊ]  et  [moi|toi|lui|elle|nous|vous|eux|elles]
        <<- morph(\2, ":M") and not before("\\b(?:plus|moins|aussi) .* que +$")
        ~2:4>> =rewriteSubject(\2,\4) + "||"

    <start>  ~^[A-ZÉÈÊ]  et  [moi|toi|lui|elle|nous|vous|eux|elles]
        <<- morph(\2, ":M")
        ~2:0>> =rewriteSubject(\2,\4) + "||"


__purge_pronom_aussi__
    [j’|je] *WORD  moi aussi
        <<- morph(\2, ":1s") ~3:0>> *

    tu      *WORD  toi aussi
        <<- morph(\2, ":2s") ~3:0>> *
................................................................................
@@@@
@@@@
@@@@GRAPH: purge_passe3|pp3                                                                        _
@@@@
@@@@
@@@@
@@@@


















__da_le_la_les_leur2__
    [<start>|,|(]  c’                                                 ?[ne|n’]¿  >être   [le|la|l’|les]  @:[NA]¬:G
    [<start>|,|(]  ?[je|tu|il|elle|on|nous|vous|ils|elles|iel|iels]¿  ?[ne|n’]¿  ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  *WORD  [le|la|l’|les]  @:[NA]¬:[YG]
    [<start>|,|(]  ?[je|tu|il|elle|on|nous|vous|ils|elles|iel|iels]¿  ?[ne|n’]¿  [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         *WORD  [le|la|l’|les]  @:[NA]¬:[YG]
    [<start>|,|(]  ?[je|tu|il|elle|on|nous|vous|ils|elles|iel|iels]¿  ?[ne|n’]¿  [le|la|l’|les]                  [lui|leur|en|y]             *WORD  [le|la|l’|les]  @:[NA]¬:[YG]
    [<start>|,|(]  ?[je|tu|il|elle|on|nous|vous|ils|elles|iel|iels]¿  ?[ne|n’]¿  [lui|leur|y]                    en                          *WORD  [le|la|l’|les]  @:[NA]¬:[YG]
................................................................................
TEST: celles {{perdue}} aura une pénalité
TEST: celles venues chanter doivent se rendre là-bas.


## Nombres
__gn_nombre_lettres_1m__
    $:B:e:p  *WORD

        <<- /gn/ not value(\1, "|neuf|mille|") and morph(\2, ":[NA].*:s", "*") and not value(\2, "|maximum|minimum|multiplié|divisé|janvier|février|mars|avril|mai|juin|juillet|août|aout|septembre|octobre|novembre|décembre|rue|route|ruelle|place|boulevard|avenue|allée|chemin|sentier|square|impasse|cour|quai|chaussée|côte|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor|")
            and not re.search("^[IVXLDM]+$", \1)
        -2>> =suggPlur(\2)                                                                  && Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.

    neuf  *WORD

        <<- /gn/ morph(\2, ":[NA].*:s", "*") and not morph(<1, ":N.*:m:[is]") and not value(\2, "|maximum|minimum|multiplié|divisé|janvier|février|mars|avril|mai|juin|juillet|août|aout|septembre|octobre|novembre|décembre|rue|route|ruelle|place|boulevard|avenue|allée|chemin|sentier|square|impasse|cour|quai|chaussée|côte|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor|")
        -2>> =suggPlur(\2)                                                                  && Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.

    mille  *WORD
        <<- /gn/ not value(\2, "|maximum|minimum|multiplié|divisé|") and morph(\2, ":[NA].*:s", "*") and not value(<1, "|le|un|ce|du|")
        -2>> =suggPlur(\2)                                                                  && Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.

TEST: ce sont trois {{idiot}} pas foutus de trouver leur chemin avec un GPS.        ->> idiots
TEST: Il a abandonné neuf {{enfant}}.                                               ->> enfants
TEST: On peut trouver mille {{travailleur}} d’un claquement de doigts.              ->> travailleurs
TEST: Il y a quatre cents {{mot}} dans la phrase.                                   ->> mots
TEST: cent {{mot}}                                                                  ->> mots
................................................................................
TEST: deux {{tête}}                                                                 ->> têtes
TEST: un logement neuf bâti par des professionnels.
TEST: un mille marin.
TEST: L’article VII mentionné dans la revue
TEST: Le produit de cinq multiplié par trois.
TEST: deux divisé par douze
TEST: il en faut trois minimum, cinq maximum



__gn_nombre_chiffres_1m__
    [0|1|01]  @:[NAQ].*:p¬*
        <<- /gn/ space_after(\1, 1, 1) and not value(\2, "|Rois|Corinthiens|Thessaloniciens|")
        -2>> =suggSing(\2)                                                                  && Accord de nombre erroné avec « \1 » : « \2 » devrait être au singulier.

    *NUM  *WORD
        <<- /gn/ space_after(\1, 1, 1) and not value(<1, "|/|") and not re.search("^0*[01](?:,[0-9]+|)$", \1) and not morph(<1, ":N")
            and morph(\2, ":[NA].*:s", "*") and not value(\2, "|maximum|minimum|multiplié|divisé|janvier|février|mars|avril|mai|juin|juillet|août|aout|septembre|octobre|novembre|décembre|rue|route|ruelle|place|boulevard|avenue|allée|chemin|sentier|square|impasse|cour|quai|chaussée|côte|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor|")
        -2>> =suggPlur(\2)                                                                  && Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.

    *NUM  *WORD  *WORD
        <<- /gn/ not value(\2, "|maximum|minimum|fois|multiplié|divisé|janvier|février|mars|avril|mai|juin|juillet|août|aout|septembre|octobre|novembre|décembre|rue|route|ruelle|place|boulevard|avenue|allée|chemin|sentier|square|impasse|cour|quai|chaussée|côte|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor|")
            and not re.search("^0*[01](?:,[0-9]+|)$", \1) and not value(<1, "|et|ou|de|d’|") and not morph(\3, ">(?:seule|maximum|minimum)/") >>>
        <<- /gn/ ((morph(\2, ":[NA].*:m", ":(?:B|e|G|V0|f)") and morph(\3, ":[NA].*:f", "*")) or (morph(\2, ":[NA].*:f", ":(?:B|e|G|V0|m)") and morph(\3, ":[NA].*:m", "*")))
            and not apposition(\2, \3)
        -3>> =switchGender(\3, True)                                                                && Accord de genre erroné entre « \2 » et « \3 ».
        <<- /gn/ __also__ and hasFemForm(\2) -2>> =switchGender(\2, True)                           && Accord de genre erroné avec « \3 ».
        <<- /gn/ morph(\2, ":[NA].*:[pi]", "*") and morph(\3, ":[NA].*:s", "*") and not apposition(\2, \3) and not (value(>1, "|et|,|") and morph(>2, ":A"))
        -3>> =suggPlur(\3)                                                                          && Accord de nombre erroné avec « \1 \2 » : « \3 » devrait être au pluriel.

................................................................................
TEST: elles furent le 18 janvier décorées
TEST: en quantité 2 fois moindre
TEST: 1 La Mort
TEST: L’année 2019 a commencé à le montrer
TEST: La « première génération » d’ordinateurs des années 1950 a déjà largement cédé la place à une deuxième (transistorisée)
TEST: Au sein du club des pays les plus prospères, la richesse par habitant est néanmoins 52 fois supérieure à celle des pays à faibles revenus, d’après la Banque mondiale.
TEST: 1 à 2 comprimés par jour voire 2 à 3 maximum





##  trouver ça/ceci/cela + adj
__gn_trouver_ça_adj__
    >trouver  [ça|cela|ceci]  @:A.*:(?:f|m:p)¬:(?:G|3[sp]|M)
        <<- /gn/ -3>> =suggMasSing(\3)                                              && Trouver \2 + [adjectif] : l’adjectif s’accorde avec “\2” (au masculin singulier).

................................................................................

!!!
!!!
!!! Processeur: simplification des substantifs                                                    !!
!!!
!!!


### Simplification des groupes nominaux

__purge_prépositions_pronoms__
    à part [cela|ceci|ça]
    à [cela|ceci|ça] près
        <<- ~>> *

    [à|après|avant|avec|par|pour|contre|sans|envers|chez|de|d’|en|malgré|selon] ?tout¿ [cela|ceci|ça]   [<end>|,|@:[VXG]¬>qui/]
        <<- ~1:-2>> *
................................................................................

    [un|une] de [nous|vous]
    [un|une] d’ [eux|elles]
    [un|une] d’ entre [nous|vous|eux|elles]
    [un|une] des [nôtres|vôtres]
        <<- ~2:0>> *




__purge_syntagmes_nominaux__
    [à|au|aux|avec|en|lors|ayant]  [de|d’]  [un|une|la|l’|leur|leurs|ce|cet|cette|ces|mon|ton|son|ma|ta|sa|mes|tes|ses|notre|votre|nos|vos|quelques|certains|certaines]  @:[NAM]  <end>
    [à|au|aux|avec|en|lors|ayant]  [de|d’]  [un|une|la|l’|leur|leurs|ce|cet|cette|ces|mon|ton|son|ma|ta|sa|mes|tes|ses|notre|votre|nos|vos|quelques|certains|certaines]  @:[NA]   ?,¿  [ne|n’|me|m’|te|t’|se|s’|nous|vous|y|c’|ça|ç’|je|j’|tu|il|elle|on|ils|elles|iel|iels|le|la|l’|les|mon|ma|ta|sa|notre|votre|leur|mes|tes|ses|nos|vos|leurs|ce|cet|cette|ces|quel|quels|quelle|quelles]
    [à|au|aux|avec|en|lors|ayant]  [de|d’]  [un|une|la|l’|leur|leurs|ce|cet|cette|ces|mon|ton|son|ma|ta|sa|mes|tes|ses|notre|votre|nos|vos|quelques|certains|certaines]  @:[NA]   @:[VR]¬:[NAP]
    [à|au|aux|avec|en|lors|ayant]  [de|d’]  [un|une|la|l’|leur|leurs|ce|cet|cette|ces|mon|ton|son|ma|ta|sa|mes|tes|ses|notre|votre|nos|vos|quelques|certains|certaines]  @:[NAM]  ,  @¬:[NA]
        <<- ~1:4>> *
................................................................................
        --1>> =suggVerb(\-1, ":3s")                                     && Conjugaison erronée. Accord avec “\1 \2 \3 \4…”. Le verbe devrait être à la 3ᵉ personne du singulier.

TEST: ce qu’ils font me {{donnent}} la nausée.                              ->> donne
TEST: tu ne sais pas, mais ce que tu fais {{deviens}} plus facile           ->> devient
TEST: ceux contre ce que nous faisons deviennent hargneux.
TEST: ce qu’elles accomplissent est formidable.


















## 3pl








__conj_elles__
    elles  @:V¬:(?:3p|P|G|M|A.*:f:p)
        <<- /conj/ not morph(<1, ":R") and not (morph(\2, ":Q") and morph(<1, ":V0.*:3p"))
        -2>> =suggVerb(\2, ":3p")                                       && Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du pluriel.
        <<- /conj/ __also__ and morph(\2, ":3s") -1>> elle              && Accord avec “\2”.

    elles  qui  @:V¬:(?:3p|P|G|M)
................................................................................
TEST: {{elles}} qui s’{{amuse}} comme des folles
TEST: L’expérience sensible qu’il nous restera bientôt d’elles est à peu près
TEST: eux attaqués par des mécanoïdes, elles attaquées par des insectoïdes.
TEST: tout ce qui vient d’elles sera écarté.


__conj_iels__
    iels  @:V¬:(?:3p|P|G|M|A.*:f:p)
        <<- /conj/ not morph(<1, ":R") and not (morph(\2, ":Q") and morph(<1, ":V0.*:3p"))
        -2>> =suggVerb(\2, ":3p")                                       && Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du pluriel.
        <<- /conj/ __also__ and morph(\2, ":3s") -1>> iel               && Accord avec “\2”.

    iels  qui  @:V¬:(?:3p|P|G|M)
        <<- /conj/ -3>> =suggVerb(\3, ":3p")                            && Conjugaison erronée. Accord avec “\1 \2”. Le verbe devrait être à la 3ᵉ personne du pluriel.
        <<- /conj/ morph(\3, ":3s") -1>> iel                            && Accord avec “\3”.







>
>
>
>
>
>
>
>







 







>







 







<
<
<
<
<
<
<
<







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







 







>
|




>
|



|







 







>








|
|




|







 







>
>
>







 







<
<
<







 







>
>







 








>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

>
>
>
>
>
>
>
>







 







|







1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
.....
13264
13265
13266
13267
13268
13269
13270
13271
13272
13273
13274
13275
13276
13277
13278
.....
15396
15397
15398
15399
15400
15401
15402








15403
15404
15405
15406
15407
15408
15409
.....
16073
16074
16075
16076
16077
16078
16079
16080
16081
16082
16083
16084
16085
16086
16087
16088
16089
16090
16091
16092
16093
16094
16095
16096
16097
16098
16099
16100
16101
16102
16103
.....
20073
20074
20075
20076
20077
20078
20079
20080
20081
20082
20083
20084
20085
20086
20087
20088
20089
20090
20091
20092
20093
20094
20095
20096
20097
20098
.....
20101
20102
20103
20104
20105
20106
20107
20108
20109
20110
20111
20112
20113
20114
20115
20116
20117
20118
20119
20120
20121
20122
20123
20124
20125
20126
20127
20128
20129
20130
.....
20142
20143
20144
20145
20146
20147
20148
20149
20150
20151
20152
20153
20154
20155
20156
20157
20158
.....
22187
22188
22189
22190
22191
22192
22193



22194
22195
22196
22197
22198
22199
22200
.....
22431
22432
22433
22434
22435
22436
22437
22438
22439
22440
22441
22442
22443
22444
22445
22446
.....
26834
26835
26836
26837
26838
26839
26840
26841
26842
26843
26844
26845
26846
26847
26848
26849
26850
26851
26852
26853
26854
26855
26856
26857
26858
26859
26860
26861
26862
26863
26864
26865
26866
26867
26868
26869
26870
26871
26872
26873
.....
26879
26880
26881
26882
26883
26884
26885
26886
26887
26888
26889
26890
26891
26892
26893
        <<- ~>> seras


__da_été__
    >avoir ?@:[WX]¿ été
        <<- =>> select(\-1, ":Q")


__da_adverbes__
    environ  [$:B|*NUM]
        <<- not value(<1, "|l’|un|cet|quel|") =>> exclude(\1, ":N")

    grave
        <<- morph(<1, ":D") =>> (\1, ":W")


__da_prépositions__
    dans
        <<- not morph(<1, ":D.*:p|>[a-z]+ième/") =>> select(\1, ":R")

    passé  [<end>|,|$:R]
        <<- =>> exclude(\1, ":G")
................................................................................
    à juste [raison|titre]
    à l’ [accoutumée|amiable|arrache|arrachée|avance|avenant|aveuglette|emporte-pièce|envi|évidence|étouffée|improviste|inverse|unanimité|unisson]
    à l’ air libre
    à l’ avenir ?[incertain|prometteur]¿
    à l’ échelon [local|cantonal|départemental|régional|national|européen|américain|africaine|asiatique|continental|international|planétaire|galactique|universel]
    à l’ échelle [locale|cantonale|départementale|régionale|nationale|européenne|américaine|africaine|asiatique|continentale|internationale|planétaire|galactique|universelle]
    à l’ en croire
    à l’ environ
    à l’ état pur
    à l’ exclusion de toute autre chose
    à l’ extrémité [est|ouest|nord|sud]
    à l’ ordre du jour
    à l’ un d’ entre [nous|vous|eux|iels]
    à l’ une d’ entre [nous|vous|elles|iels]
    à l’ échelle [nationale|mondiale|régionale|départementale|cantonale|locale|galactique|universelle]
................................................................................
    [le|ce|du]  [baron|docteur|député|duc|frère|ministre|prince|professeur|président|roi|sénateur|mir]  @:M[12]
    [la|cette]  [baronne|docteur|docteure|députée|duchesse|ministre|sœur|princesse|présidente|professeure|reine|sénatrice]  @:M[12]
        <<- ~3>> *

    [Mr|Mlle|Mme|Mgr|miss]  ~^[A-ZÉÈÊ]
        <<- ~2>> *










__purge_pronom_aussi__
    [j’|je] *WORD  moi aussi
        <<- morph(\2, ":1s") ~3:0>> *

    tu      *WORD  toi aussi
        <<- morph(\2, ":2s") ~3:0>> *
................................................................................
@@@@
@@@@
@@@@GRAPH: purge_passe3|pp3                                                                        _
@@@@
@@@@
@@@@
@@@@

__fusions_noms_propres_et_pronoms__
    [<start>|,|(|$:Cs]  [moi|toi|lui|elle|iel|nous|vous|eux|elles|iels|$:M]  et  [moi|nous]
    [<start>|,|(|$:Cs]  [moi|nous]  et  [moi|toi|lui|elle|iel|nous|vous|eux|elles|iels|$:M]
        <<- not value(\1, "|que|qu’|") ~2:0>> ␣
        <<- __also__ /2>> _eq_nous_

    [<start>|,|(|$:Cs]  [toi|lui|elle|iel|vous|eux|elles|iels|$:M]  et  [toi|vous]
    [<start>|,|(|$:Cs]  [toi|vous]  et  [toi|lui|elle|iel|vous|eux|elles|iels|$:M]
        <<- not value(\1, "|que|qu’|") ~2:0>> ␣
        <<- __also__ /2>> _eq_vous_

    [<start>|,|(|$:Cs]  [lui|elle|iel|eux|elles|iels|$:M]  et  [lui|elle|iel|eux|elles|iels]
    [<start>|,|(|$:Cs]  [lui|elle|iel|eux|elles|iels]  et  [lui|elle|iel|eux|elles|iels|$:M]
        <<- not value(\1, "|que|qu’|") ~2:0>> ␣
        <<- __also__ /2>> _eq_iels_


__da_le_la_les_leur2__
    [<start>|,|(]  c’                                                 ?[ne|n’]¿  >être   [le|la|l’|les]  @:[NA]¬:G
    [<start>|,|(]  ?[je|tu|il|elle|on|nous|vous|ils|elles|iel|iels]¿  ?[ne|n’]¿  ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  *WORD  [le|la|l’|les]  @:[NA]¬:[YG]
    [<start>|,|(]  ?[je|tu|il|elle|on|nous|vous|ils|elles|iel|iels]¿  ?[ne|n’]¿  [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         *WORD  [le|la|l’|les]  @:[NA]¬:[YG]
    [<start>|,|(]  ?[je|tu|il|elle|on|nous|vous|ils|elles|iel|iels]¿  ?[ne|n’]¿  [le|la|l’|les]                  [lui|leur|en|y]             *WORD  [le|la|l’|les]  @:[NA]¬:[YG]
    [<start>|,|(]  ?[je|tu|il|elle|on|nous|vous|ils|elles|iel|iels]¿  ?[ne|n’]¿  [lui|leur|y]                    en                          *WORD  [le|la|l’|les]  @:[NA]¬:[YG]
................................................................................
TEST: celles {{perdue}} aura une pénalité
TEST: celles venues chanter doivent se rendre là-bas.


## Nombres
__gn_nombre_lettres_1m__
    $:B:e:p  *WORD
        <<- /gn/ not value(\1, "|neuf|mille|") and morph(\2, ":[NA].*:s", "*") and not morph(<1, ":D.*:s")
            and not value(\2, "|maximum|minimum|multiplié|divisé|janvier|février|mars|avril|mai|juin|juillet|août|aout|septembre|octobre|novembre|décembre|rue|route|ruelle|place|boulevard|avenue|allée|chemin|sentier|square|impasse|cour|quai|chaussée|côte|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor|")
            and not re.search("^[IVXLDM]+$", \1)
        -2>> =suggPlur(\2)                                                                  && Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.

    neuf  *WORD
        <<- /gn/ morph(\2, ":[NA].*:s", "*") and not morph(<1, ":N.*:m:[is]") and not morph(<1, ":D.*:s")
            and not value(\2, "|maximum|minimum|multiplié|divisé|janvier|février|mars|avril|mai|juin|juillet|août|aout|septembre|octobre|novembre|décembre|rue|route|ruelle|place|boulevard|avenue|allée|chemin|sentier|square|impasse|cour|quai|chaussée|côte|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor|")
        -2>> =suggPlur(\2)                                                                  && Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.

    mille  *WORD
        <<- /gn/ not value(\2, "|maximum|minimum|multiplié|divisé|") and morph(\2, ":[NA].*:s", "*") and not morph(<1, ":D.*:s")
        -2>> =suggPlur(\2)                                                                  && Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.

TEST: ce sont trois {{idiot}} pas foutus de trouver leur chemin avec un GPS.        ->> idiots
TEST: Il a abandonné neuf {{enfant}}.                                               ->> enfants
TEST: On peut trouver mille {{travailleur}} d’un claquement de doigts.              ->> travailleurs
TEST: Il y a quatre cents {{mot}} dans la phrase.                                   ->> mots
TEST: cent {{mot}}                                                                  ->> mots
................................................................................
TEST: deux {{tête}}                                                                 ->> têtes
TEST: un logement neuf bâti par des professionnels.
TEST: un mille marin.
TEST: L’article VII mentionné dans la revue
TEST: Le produit de cinq multiplié par trois.
TEST: deux divisé par douze
TEST: il en faut trois minimum, cinq maximum
TEST: il vit dans un vingt-quatre mètre carré.


__gn_nombre_chiffres_1m__
    [0|1|01]  @:[NAQ].*:p¬*
        <<- /gn/ space_after(\1, 1, 1) and not value(\2, "|Rois|Corinthiens|Thessaloniciens|")
        -2>> =suggSing(\2)                                                                  && Accord de nombre erroné avec « \1 » : « \2 » devrait être au singulier.

    *NUM  *WORD
        <<- /gn/ space_after(\1, 1, 1) and not value(<1, "|/|") and not re.search("^0*[01](?:,[0-9]+|)$", \1) and morph(\2, ":[NA].*:s", "*") and not morph(<1, ":(?:N|D.*:s)")
            and not value(\2, "|maximum|minimum|multiplié|divisé|janvier|février|mars|avril|mai|juin|juillet|août|aout|septembre|octobre|novembre|décembre|rue|route|ruelle|place|boulevard|avenue|allée|chemin|sentier|square|impasse|cour|quai|chaussée|côte|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor|")
        -2>> =suggPlur(\2)                                                                  && Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.

    *NUM  *WORD  *WORD
        <<- /gn/ not value(\2, "|maximum|minimum|fois|multiplié|divisé|janvier|février|mars|avril|mai|juin|juillet|août|aout|septembre|octobre|novembre|décembre|rue|route|ruelle|place|boulevard|avenue|allée|chemin|sentier|square|impasse|cour|quai|chaussée|côte|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor|")
            and not re.search("^0*[01](?:,[0-9]+|)$", \1) and not morph(<1, ">(?:et|ou)/|:(?:N|D.*:[si])") and not morph(\3, ">(?:seul|maximum|minimum)/|:(?:[BG]|V0)") >>>
        <<- /gn/ ((morph(\2, ":[NA].*:m", ":(?:B|e|G|V0|f)") and morph(\3, ":[NA].*:f", "*")) or (morph(\2, ":[NA].*:f", ":(?:B|e|G|V0|m)") and morph(\3, ":[NA].*:m", "*")))
            and not apposition(\2, \3)
        -3>> =switchGender(\3, True)                                                                && Accord de genre erroné entre « \2 » et « \3 ».
        <<- /gn/ __also__ and hasFemForm(\2) -2>> =switchGender(\2, True)                           && Accord de genre erroné avec « \3 ».
        <<- /gn/ morph(\2, ":[NA].*:[pi]", "*") and morph(\3, ":[NA].*:s", "*") and not apposition(\2, \3) and not (value(>1, "|et|,|") and morph(>2, ":A"))
        -3>> =suggPlur(\3)                                                                          && Accord de nombre erroné avec « \1 \2 » : « \3 » devrait être au pluriel.

................................................................................
TEST: elles furent le 18 janvier décorées
TEST: en quantité 2 fois moindre
TEST: 1 La Mort
TEST: L’année 2019 a commencé à le montrer
TEST: La « première génération » d’ordinateurs des années 1950 a déjà largement cédé la place à une deuxième (transistorisée)
TEST: Au sein du club des pays les plus prospères, la richesse par habitant est néanmoins 52 fois supérieure à celle des pays à faibles revenus, d’après la Banque mondiale.
TEST: 1 à 2 comprimés par jour voire 2 à 3 maximum
TEST: elle vit dans un 24 m carré.
TEST: elle vit dans un 24 m² triste de la banlieue de Paris.
TEST: dans son 240 m2 lumineux, c’est la belle vie.


##  trouver ça/ceci/cela + adj
__gn_trouver_ça_adj__
    >trouver  [ça|cela|ceci]  @:A.*:(?:f|m:p)¬:(?:G|3[sp]|M)
        <<- /gn/ -3>> =suggMasSing(\3)                                              && Trouver \2 + [adjectif] : l’adjectif s’accorde avec “\2” (au masculin singulier).

................................................................................

!!!
!!!
!!! Processeur: simplification des substantifs                                                    !!
!!!
!!!




__purge_prépositions_pronoms__
    à part [cela|ceci|ça]
    à [cela|ceci|ça] près
        <<- ~>> *

    [à|après|avant|avec|par|pour|contre|sans|envers|chez|de|d’|en|malgré|selon] ?tout¿ [cela|ceci|ça]   [<end>|,|@:[VXG]¬>qui/]
        <<- ~1:-2>> *
................................................................................

    [un|une] de [nous|vous]
    [un|une] d’ [eux|elles]
    [un|une] d’ entre [nous|vous|eux|elles]
    [un|une] des [nôtres|vôtres]
        <<- ~2:0>> *


### Simplification des syntagmes nominaux

__purge_syntagmes_nominaux__
    [à|au|aux|avec|en|lors|ayant]  [de|d’]  [un|une|la|l’|leur|leurs|ce|cet|cette|ces|mon|ton|son|ma|ta|sa|mes|tes|ses|notre|votre|nos|vos|quelques|certains|certaines]  @:[NAM]  <end>
    [à|au|aux|avec|en|lors|ayant]  [de|d’]  [un|une|la|l’|leur|leurs|ce|cet|cette|ces|mon|ton|son|ma|ta|sa|mes|tes|ses|notre|votre|nos|vos|quelques|certains|certaines]  @:[NA]   ?,¿  [ne|n’|me|m’|te|t’|se|s’|nous|vous|y|c’|ça|ç’|je|j’|tu|il|elle|on|ils|elles|iel|iels|le|la|l’|les|mon|ma|ta|sa|notre|votre|leur|mes|tes|ses|nos|vos|leurs|ce|cet|cette|ces|quel|quels|quelle|quelles]
    [à|au|aux|avec|en|lors|ayant]  [de|d’]  [un|une|la|l’|leur|leurs|ce|cet|cette|ces|mon|ton|son|ma|ta|sa|mes|tes|ses|notre|votre|nos|vos|quelques|certains|certaines]  @:[NA]   @:[VR]¬:[NAP]
    [à|au|aux|avec|en|lors|ayant]  [de|d’]  [un|une|la|l’|leur|leurs|ce|cet|cette|ces|mon|ton|son|ma|ta|sa|mes|tes|ses|notre|votre|nos|vos|quelques|certains|certaines]  @:[NAM]  ,  @¬:[NA]
        <<- ~1:4>> *
................................................................................
        --1>> =suggVerb(\-1, ":3s")                                     && Conjugaison erronée. Accord avec “\1 \2 \3 \4…”. Le verbe devrait être à la 3ᵉ personne du singulier.

TEST: ce qu’ils font me {{donnent}} la nausée.                              ->> donne
TEST: tu ne sais pas, mais ce que tu fais {{deviens}} plus facile           ->> devient
TEST: ceux contre ce que nous faisons deviennent hargneux.
TEST: ce qu’elles accomplissent est formidable.


## 1pl
__conj_eq_nous__
    [<start>|,|(|$:Cs]  /_eq_nous_  @:V¬:(?:G|Y|P|1p|M|A.*:p)
        <<- /conj/ -3>> =suggVerb(\3, ":1p")                                                        && Conjugaison probablement erronée. Accord avec “\2”. Le verbe devrait être à la 1ʳᵉ personne du pluriel.

TEST: vous et nous {{iront}} dans la forêt


## 2pl
__conj_eq_vous__
    [<start>|,|(|$:Cs]  /_eq_vous_  @:V¬:(?:G|P|2p|M|A.*:p)
        <<- /conj/ -3>> =suggVerb(\3, ":2p")                                                        && Conjugaison probablement erronée. Accord avec “\2”. Le verbe devrait être à la 2ᵉ personne du pluriel.

TEST: vous et eux {{partirait}} ensemble.


## 3pl
__conj_eq_iels__
    /_eq_iels_  @:V¬:(?:3p|P|G|M|A.*:p)
        <<- /conj/ not morph(<1, ":R") and not (morph(\2, ":Q") and morph(<1, ":V0.*:3p"))
        -2>> =suggVerb(\2, ":3p")                                       && Conjugaison probablement erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du pluriel.

TEST: lui et elle {{était}} dans l’affliction


__conj_elles__
    elles  @:V¬:(?:3p|P|G|M|A.*:f:p)
        <<- /conj/ not morph(<1, ":R") and not (morph(\2, ":Q") and morph(<1, ":V0.*:3p"))
        -2>> =suggVerb(\2, ":3p")                                       && Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du pluriel.
        <<- /conj/ __also__ and morph(\2, ":3s") -1>> elle              && Accord avec “\2”.

    elles  qui  @:V¬:(?:3p|P|G|M)
................................................................................
TEST: {{elles}} qui s’{{amuse}} comme des folles
TEST: L’expérience sensible qu’il nous restera bientôt d’elles est à peu près
TEST: eux attaqués par des mécanoïdes, elles attaquées par des insectoïdes.
TEST: tout ce qui vient d’elles sera écarté.


__conj_iels__
    iels  @:V¬:(?:3p|P|G|M|A.*:p)
        <<- /conj/ not morph(<1, ":R") and not (morph(\2, ":Q") and morph(<1, ":V0.*:3p"))
        -2>> =suggVerb(\2, ":3p")                                       && Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du pluriel.
        <<- /conj/ __also__ and morph(\2, ":3s") -1>> iel               && Accord avec “\2”.

    iels  qui  @:V¬:(?:3p|P|G|M)
        <<- /conj/ -3>> =suggVerb(\3, ":3p")                            && Conjugaison erronée. Accord avec “\1 \2”. Le verbe devrait être à la 3ᵉ personne du pluriel.
        <<- /conj/ morph(\3, ":3s") -1>> iel                            && Accord avec “\3”.