Index: compile_rules_graph.py ================================================================== --- compile_rules_graph.py +++ compile_rules_graph.py @@ -55,10 +55,11 @@ sCode = re.sub(r"\bbefore\(\s*", 'look(sSentence[:lToken[1+nTokenOffset]["nStart"]], ', sCode) # before(sCode) sCode = re.sub(r"\bafter\(\s*", 'look(sSentence[lToken[nLastToken]["nEnd"]:], ', sCode) # after(sCode) sCode = re.sub(r"\bbefore0\(\s*", 'look(sSentence0[:lToken[1+nTokenOffset]["nStart"]], ', sCode) # before0(sCode) sCode = re.sub(r"\bafter0\(\s*", 'look(sSentence[lToken[nLastToken]["nEnd"]:], ', sCode) # after0(sCode) sCode = re.sub(r"\banalyseWord[(]", 'analyse(', sCode) + sCode = re.sub(r"\bcheckAgreement[(]\\(\d+), *\\(\d+)", 'g_checkAgreement(lToken[nTokenOffset+\\1], lToken[nTokenOffset+\\2]', sCode) sCode = re.sub(r"[\\](\d+)", 'lToken[nTokenOffset+\\1]["sValue"]', sCode) sCode = re.sub(r"[\\]-(\d+)", 'lToken[nLastToken-\\1+1]["sValue"]', sCode) sCode = re.sub(r">1", 'lToken[nLastToken+1]["sValue"]', sCode) sCode = re.sub(r"<1", 'lToken[nTokenOffset]["sValue"]', sCode) return sCode Index: gc_lang/fr/modules-js/gce_analyseur.js ================================================================== --- gc_lang/fr/modules-js/gce_analyseur.js +++ gc_lang/fr/modules-js/gce_analyseur.js @@ -49,45 +49,10 @@ 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 isAmbiguousNAV (sWord) { - // words which are nom|adj and verb are ambiguous (except être and avoir) - let lMorph = _oSpellChecker.getMorph(sWord); - if (lMorph.length === 0) { - return false; - } - if (!cregex.mbNomAdj(lMorph) || sWord == "est") { - return false; - } - if (cregex.mbVconj(lMorph) && !cregex.mbMG(lMorph)) { - return true; - } - return false; -} - -function isAmbiguousAndWrong (sWord1, sWord2, sReqMorphNA, sReqMorphConj) { - //// use it if sWord1 won’t be a verb; word2 is assumed to be true via isAmbiguousNAV - let lMorph2 = _oSpellChecker.getMorph(sWord2); - if (lMorph2.length === 0) { - return false; - } - if (cregex.checkConjVerb(lMorph2, sReqMorphConj)) { - // verb word2 is ok - return false; - } - let lMorph1 = _oSpellChecker.getMorph(sWord1); - if (lMorph1.length === 0) { - return false; - } - if (cregex.checkAgreement(lMorph1, lMorph2) && (cregex.mbAdj(lMorph2) || cregex.mbAdj(lMorph1))) { - return false; - } - return true; -} - function isVeryAmbiguousAndWrong (sWord1, sWord2, sReqMorphNA, sReqMorphConj, bLastHopeCond) { //// use it if sWord1 can be also a verb; word2 is assumed to be true via isAmbiguousNAV let lMorph2 = _oSpellChecker.getMorph(sWord2); if (lMorph2.length === 0) { return false; @@ -111,10 +76,23 @@ if (bLastHopeCond) { return true; } return false; } + +function g_checkAgreement (oToken1, oToken2) { + // check agreement between and + let lMorph1 = oToken1.hasOwnProperty("lMorph") ? oToken1["lMorph"] : _oSpellChecker.getMorph(oToken1["sValue"]); + if (lMorph1.length === 0) { + return true; + } + let lMorph2 = oToken2.hasOwnProperty("lMorph") ? oToken2["lMorph"] : _oSpellChecker.getMorph(oToken2["sValue"]); + if (lMorph2.length === 0) { + return true; + } + return cregex.checkAgreement(lMorph1, lMorph2); +} function checkAgreement (sWord1, sWord2) { let lMorph2 = _oSpellChecker.getMorph(sWord2); if (lMorph2.length === 0) { return true; Index: gc_lang/fr/modules/gce_analyseur.py ================================================================== --- gc_lang/fr/modules/gce_analyseur.py +++ gc_lang/fr/modules/gce_analyseur.py @@ -38,36 +38,10 @@ 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 isAmbiguousNAV (sWord): - "words which are nom|adj and verb are ambiguous (except être and avoir)" - lMorph = _oSpellChecker.getMorph(sWord) - if not cr.mbNomAdj(lMorph) or sWord == "est": - return False - if cr.mbVconj(lMorph) and not cr.mbMG(lMorph): - return True - return False - - -def isAmbiguousAndWrong (sWord1, sWord2, sReqMorphNA, sReqMorphConj): - "use it if won’t be a verb; is assumed to be True via isAmbiguousNAV" - lMorph2 = _oSpellChecker.getMorph(sWord2) - if not lMorph2: - return False - if cr.checkConjVerb(lMorph2, sReqMorphConj): - # verb word2 is ok - return False - lMorph1 = _oSpellChecker.getMorph(sWord1) - if not lMorph1: - return False - if cr.checkAgreement(lMorph1, lMorph2) and (cr.mbAdj(lMorph2) or cr.mbAdj(lMorph1)): - return False - return True - def isVeryAmbiguousAndWrong (sWord1, sWord2, sReqMorphNA, sReqMorphConj, bLastHopeCond): "use it if can be also a verb; is assumed to be True via isAmbiguousNAV" lMorph2 = _oSpellChecker.getMorph(sWord2) if not lMorph2: @@ -86,10 +60,21 @@ #if cr.isNomAdjVerb(lMorph1): # considered True if bLastHopeCond: return True return False + +def g_checkAgreement (dToken1, dToken2): + "check agreement between and " + lMorph1 = dToken1["lMorph"] if "lMorph" in dToken1 else _oSpellChecker.getMorph(dToken1["sValue"]) + if not lMorph1: + return True + lMorph2 = dToken2["lMorph"] if "lMorph" in dToken2 else _oSpellChecker.getMorph(dToken2["sValue"]) + if not lMorph2: + return True + return cr.checkAgreement(lMorph1, lMorph2) + def checkAgreement (sWord1, sWord2): "check agreement between and " lMorph2 = _oSpellChecker.getMorph(sWord2) if not lMorph2: Index: gc_lang/fr/rules.grx ================================================================== --- gc_lang/fr/rules.grx +++ gc_lang/fr/rules.grx @@ -26943,30 +26943,30 @@ TEST: on va tous manger au resto. TEST: elles vont toutes aller faire un tour __conj_det_plur_nom__ - [ces|mes|tes|ses|nos|vos|leurs|quelques|maints] @:[NA].*:[pi]¬:V0 @:V¬:(?:[13]p|P|Y|G|M|A.*:e:[pi]) + [ces|mes|tes|ses|nos|vos|leurs|quelques|maints] @:[NA].*:[pi]¬:V0 @:V¬:(?:3p|P|Y|G|M|A.*:[pi]) <<- /conj/ morph(<1, ":Cs||>,") and not( morph(\3, ":3s") and before("(?i)\\b(?:l[ea] |l’|une? |ce(?:tte|t|) |[mts](?:on|a) |[nv]otre ).+ entre .+ et ") ) >>> - <<- /conj/ not checkAgreement(\2, \3) -3>> =suggVerb(\3, ":3p") && Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du pluriel. - <<- /conj/ __else__ and isAmbiguousAndWrong(\2, \3, ":p", ":3p") - -3>> =suggVerb(\3, ":3p", suggPlur) && Accord avec « \1 \2… » incorrect. Conjugaison erronée ou accord nom/adjectif incorrect. + <<- /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. + <<- /conj/ __else__ -3>> =suggVerb(\3, ":3p") && Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du pluriel. - [ces|mes|tes|ses|nos|vos|leurs|quelques|maints] @:[NA].*:[pi]¬:V0 qui @:V¬:(?:[13]p|P|Y|G|M|A.*:e:[pi]) + [ces|mes|tes|ses|nos|vos|leurs|quelques|maints] @:[NA].*:[pi]¬:V0 qui @:V¬:(?:3p|P|Y|G|M|A.*:e:[pi]) <<- /conj/ morph(<1, ":Cs||>,") and not( morph(\4, ":3s") and before("(?i)\\b(?:l[ea] |l’|une? |ce(?:tte|t|) |[mts](?:on|a) |[nv]otre ).+ entre .+ et ") ) - -4>> =suggVerb(\4, ":3p") && Conjugaison erronée. Accord avec “\1 \2 \3…”. Le verbe devrait être à la 3ᵉ personne du pluriel. + -4>> =suggVerb(\4, ":3p") && Conjugaison erronée. Accord avec “\1 \2 \3…”. Le verbe devrait être à la 3ᵉ personne du pluriel. TEST: Ses « chiens » {{coure}} sur ma pelouse. TEST: mes filles {{passe}} ce matin TEST: vos filles {{passes}} ce matin TEST: ces travaux qui {{demande}} tant d’efforts. TEST: vos questions ne {{réclame}} aucune réflexion. TEST: Ces attaques à main armée {{donne}} la chair de poule. TEST: Ces marchands {{passe}} leur temps à se quereller. TEST: maints hommes {{oublie}} leurs origines pour mieux se construire un passé glorieux +TEST: nos hommes qui {{repartirons}} demain TEST: le lien entre les agences de renseignement et ces mêmes entreprises pouvait reposer sur des activités de surveillance à proprement parler. TEST: trier les cons et les connes expose à un violent coup de boomerang TEST: Tu penses que quelqu’un qui frappe sa femme et ses enfants est un bon père ?