Index: gc_lang/fr/modules-js/conj.js ================================================================== --- gc_lang/fr/modules-js/conj.js +++ gc_lang/fr/modules-js/conj.js @@ -87,62 +87,34 @@ return null; } return this._lVtyp[this._dVerb[sVerb][0]]; }, - getSimil: function (sWord, sMorph, bSubst=false) { - if (!sMorph.includes(":V")) { - return new Set(); - } - let sInfi = sMorph.slice(1, sMorph.indexOf("/")); - let aSugg = new Set(); - let tTags = this._getTags(sInfi); - if (tTags) { - if (!bSubst) { - // we suggest conjugated forms - if (sMorph.includes(":V1")) { - aSugg.add(sInfi); - aSugg.add(this._getConjWithTags(sInfi, tTags, ":Ip", ":3s")); - aSugg.add(this._getConjWithTags(sInfi, tTags, ":Ip", ":2p")); - aSugg.add(this._getConjWithTags(sInfi, tTags, ":Iq", ":1s")); - aSugg.add(this._getConjWithTags(sInfi, tTags, ":Iq", ":3s")); - aSugg.add(this._getConjWithTags(sInfi, tTags, ":Iq", ":3p")); - } else if (sMorph.includes(":V2")) { - aSugg.add(this._getConjWithTags(sInfi, tTags, ":Ip", ":1s")); - aSugg.add(this._getConjWithTags(sInfi, tTags, ":Ip", ":3s")); - } else if (sMorph.includes(":V3")) { - aSugg.add(this._getConjWithTags(sInfi, tTags, ":Ip", ":1s")); - aSugg.add(this._getConjWithTags(sInfi, tTags, ":Ip", ":3s")); - aSugg.add(this._getConjWithTags(sInfi, tTags, ":Is", ":1s")); - aSugg.add(this._getConjWithTags(sInfi, tTags, ":Is", ":3s")); - } else if (sMorph.includes(":V0a")) { - aSugg.add("eus"); - aSugg.add("eut"); - } else { - aSugg.add("étais"); - aSugg.add("était"); - } - aSugg.delete(""); - } else { - if (this._dVerbNames.hasOwnProperty(sInfi)) { - // there are names derivated from the verb - aSugg.gl_update(this._dVerbNames[sInfi]); - } else { - // we suggest past participles - aSugg.add(this._getConjWithTags(sInfi, tTags, ":PQ", ":Q1")); - aSugg.add(this._getConjWithTags(sInfi, tTags, ":PQ", ":Q2")); - aSugg.add(this._getConjWithTags(sInfi, tTags, ":PQ", ":Q3")); - aSugg.add(this._getConjWithTags(sInfi, tTags, ":PQ", ":Q4")); - aSugg.delete(""); - // if there is only one past participle (epi inv), unreliable. - if (aSugg.size === 1) { - aSugg.clear(); - } - } - } - } - return aSugg; + getNamesFrom: function (sVerb) { + // returns a list of names derivating from + if (this._dVerbNames.hasOwnProperty(sVerb)) { + // there are names derivated from the verb + return this._dVerbNames[sVerb]; + } else { + // we suggest past participles + let tTags = this._getTags(sVerb); + if (tTags) { + let aSugg = [ this._getConjWithTags(sVerb, tTags, ":PQ", ":Q1") ]; + if (this._hasConjWithTags(tTags, ":PQ", ":Q2")) { + aSugg.push(this._getConjWithTags(sVerb, tTags, ":PQ", ":Q2")); + } + if (this._hasConjWithTags(tTags, ":PQ", ":Q3")) { + aSugg.push(this._getConjWithTags(sVerb, tTags, ":PQ", ":Q3")); + } + if (this._hasConjWithTags(tTags, ":PQ", ":Q4")) { + aSugg.push(this._getConjWithTags(sVerb, tTags, ":PQ", ":Q4")); + } + // if there is only one past participle (epi inv), unreliable. + return (aSugg.length > 1) ? aSugg : []; + } + return []; + } }, _getTags: function (sVerb) { // returns tuple of tags (usable with functions _getConjWithTags and _hasConjWithTags) if (!this._dVerb.hasOwnProperty(sVerb)) { @@ -636,12 +608,12 @@ exports._dTenseIdx = conj._dTenseIdx; exports.isVerb = conj.isVerb; exports.getConj = conj.getConj; exports.hasConj = conj.hasConj; exports.getVtyp = conj.getVtyp; - exports.getSimil = conj.getSimil; + exports.getNamesFrom = conj.getNamesFrom; exports._getTags = conj._getTags; exports._getConjWithTags = conj._getConjWithTags; exports._hasConjWithTags = conj._hasConjWithTags; exports._modifyStringWithSuffixCode = conj._modifyStringWithSuffixCode; exports.Verb = Verb; } Index: gc_lang/fr/modules-js/gce_suggestions.js ================================================================== --- gc_lang/fr/modules-js/gce_suggestions.js +++ gc_lang/fr/modules-js/gce_suggestions.js @@ -605,20 +605,31 @@ function hasSimil (sWord, sPattern=null) { return phonet.hasSimil(sWord, sPattern); } function suggSimil (sWord, sPattern=null, bSubst=false, bVC=false) { - // return list of words phonetically similar to sWord and whom POS is matching sPattern + // return list of words phonetically similar to and whom POS is matching let sSfx; if (bVC) { [sWord, sSfx] = splitVerb(sWord); } let aSugg = phonet.selectSimil(sWord, sPattern); - if (aSugg.size === 0 || !bSubst) { + if (aSugg.size === 0 && bSubst) { for (let sMorph of gc_engine.oSpellChecker.getMorph(sWord)) { - for (let e of conj.getSimil(sWord, sMorph, bSubst)) { - aSugg.add(e); + if (sMorph.includes(":V")) { + let sInfi = sMorph.slice(1, sMorph.indexOf("/")); + if (sPattern) { + for (let sName of conj.getNamesFrom(sInfi)) { + if (_oSpellChecker.getMorph(sName).some(sMorph => (sMorph.search(sPattern) !== -1))) { + aSugg.add(sName); + } + } + } + else { + conj.getNamesFrom(sInfi).forEach(sName => aSugg.add(sName)); + } + break; } } } if (aSugg.size > 0) { if (bVC) { Index: gc_lang/fr/modules/conj.py ================================================================== --- gc_lang/fr/modules/conj.py +++ gc_lang/fr/modules/conj.py @@ -58,90 +58,51 @@ if sVerb not in _dVerb: return None return _lVtyp[_dVerb[sVerb][0]] -def getSimil (sWord, sMorph, bSubst=False): - "returns a list of verbal forms similar to , according to " - if ":V" not in sMorph: - return [] - sInfi = sMorph[1:sMorph.find("/")] - aSugg = [] - tTags = _getTags(sInfi) - if tTags: - if not bSubst: - # we suggest conjugated forms - if ":V1" in sMorph: - aSugg.append(sInfi) - if _hasConjWithTags(tTags, ":Ip", ":3s"): - aSugg.append(_getConjWithTags(sInfi, tTags, ":Ip", ":3s")) - if _hasConjWithTags(tTags, ":Ip", ":2p"): - aSugg.append(_getConjWithTags(sInfi, tTags, ":Ip", ":2p")) - if _hasConjWithTags(tTags, ":Iq", ":1s"): - aSugg.append(_getConjWithTags(sInfi, tTags, ":Iq", ":1s")) - if _hasConjWithTags(tTags, ":Iq", ":3s"): - aSugg.append(_getConjWithTags(sInfi, tTags, ":Iq", ":3s")) - if _hasConjWithTags(tTags, ":Iq", ":3p"): - aSugg.append(_getConjWithTags(sInfi, tTags, ":Iq", ":3p")) - elif ":V2" in sMorph: - if _hasConjWithTags(tTags, ":Ip", ":1s"): - aSugg.append(_getConjWithTags(sInfi, tTags, ":Ip", ":1s")) - if _hasConjWithTags(tTags, ":Ip", ":3s"): - aSugg.append(_getConjWithTags(sInfi, tTags, ":Ip", ":3s")) - elif ":V3" in sMorph: - if _hasConjWithTags(tTags, ":Ip", ":1s"): - aSugg.append(_getConjWithTags(sInfi, tTags, ":Ip", ":1s")) - if _hasConjWithTags(tTags, ":Ip", ":3s"): - aSugg.append(_getConjWithTags(sInfi, tTags, ":Ip", ":3s")) - if _hasConjWithTags(tTags, ":Is", ":1s"): - aSugg.append(_getConjWithTags(sInfi, tTags, ":Is", ":1s")) - if _hasConjWithTags(tTags, ":Is", ":3s"): - aSugg.append(_getConjWithTags(sInfi, tTags, ":Is", ":3s")) - elif ":V0a" in sMorph: - aSugg.append("eus") - aSugg.append("eut") - else: - aSugg.append("étais") - aSugg.append("était") - else: - if sInfi in _dVerbNames: - # there are names derivated from the verb - aSugg.extend(_dVerbNames[sInfi]) - else: - # we suggest past participles - aSugg.append(_getConjWithTags(sInfi, tTags, ":PQ", ":Q1")) - if _hasConjWithTags(tTags, ":PQ", ":Q2"): - aSugg.append(_getConjWithTags(sInfi, tTags, ":PQ", ":Q2")) - if _hasConjWithTags(tTags, ":PQ", ":Q3"): - aSugg.append(_getConjWithTags(sInfi, tTags, ":PQ", ":Q3")) - if _hasConjWithTags(tTags, ":PQ", ":Q4"): - aSugg.append(_getConjWithTags(sInfi, tTags, ":PQ", ":Q4")) - # if there is only one past participle (epi inv), unreliable. - if len(aSugg) == 1: - return [] - return aSugg +def getNamesFrom (sVerb): + "returns a list of names derivating from " + if sVerb in _dVerbNames: + # there are names derivated from the verb + return list(_dVerbNames[sVerb]) + else: + # we suggest past participles + tTags = _getTags(sVerb) + if tTags: + aSugg = [ _getConjWithTags(sVerb, tTags, ":PQ", ":Q1") ] + if _hasConjWithTags(tTags, ":PQ", ":Q2"): + aSugg.append(_getConjWithTags(sVerb, tTags, ":PQ", ":Q2")) + if _hasConjWithTags(tTags, ":PQ", ":Q3"): + aSugg.append(_getConjWithTags(sVerb, tTags, ":PQ", ":Q3")) + if _hasConjWithTags(tTags, ":PQ", ":Q4"): + aSugg.append(_getConjWithTags(sVerb, tTags, ":PQ", ":Q4")) + # if there is only one past participle (epi inv), unreliable. + return aSugg if len(aSugg) > 1 else [] + return [] def getConjSimilInfiV1 (sInfi): "returns verbal forms phonetically similar to infinitive form (for verb in group 1)" if sInfi not in _dVerb: return [] aSugg = [] tTags = _getTags(sInfi) if tTags: + # example: arriver, arrivais, arrivait, arrivai, arrivez, arriviez if _hasConjWithTags(tTags, ":Iq", ":2s"): - aSugg.add(_getConjWithTags(sInfi, tTags, ":Iq", ":2s")) + aSugg.append(_getConjWithTags(sInfi, tTags, ":Iq", ":2s")) if _hasConjWithTags(tTags, ":Iq", ":3s"): - aSugg.add(_getConjWithTags(sInfi, tTags, ":Iq", ":3s")) + aSugg.append(_getConjWithTags(sInfi, tTags, ":Iq", ":3s")) if _hasConjWithTags(tTags, ":Iq", ":3p"): - aSugg.add(_getConjWithTags(sInfi, tTags, ":Iq", ":3p")) + aSugg.append(_getConjWithTags(sInfi, tTags, ":Iq", ":3p")) if _hasConjWithTags(tTags, ":Is", ":1s"): - aSugg.add(_getConjWithTags(sInfi, tTags, ":Is", ":1s")) + aSugg.append(_getConjWithTags(sInfi, tTags, ":Is", ":1s")) if _hasConjWithTags(tTags, ":Ip", ":2p"): - aSugg.add(_getConjWithTags(sInfi, tTags, ":Ip", ":2p")) + aSugg.append(_getConjWithTags(sInfi, tTags, ":Ip", ":2p")) if _hasConjWithTags(tTags, ":Iq", ":2p"): - aSugg.add(_getConjWithTags(sInfi, tTags, ":Iq", ":2p")) + aSugg.append(_getConjWithTags(sInfi, tTags, ":Iq", ":2p")) return aSugg def _getTags (sVerb): "returns tuple of tags (usable with functions _getConjWithTags and _hasConjWithTags)" Index: gc_lang/fr/modules/gce_suggestions.py ================================================================== --- gc_lang/fr/modules/gce_suggestions.py +++ gc_lang/fr/modules/gce_suggestions.py @@ -462,18 +462,25 @@ "return True if there is words phonetically similar to (according to if required)" return phonet.hasSimil(sWord, sPattern) def suggSimil (sWord, sPattern=None, bSubst=False, bVC=False): - "return list of words phonetically similar to sWord and whom POS is matching sPattern" + "return list of words phonetically similar to and whom POS is matching " if bVC: sWord, sSfx = splitVerb(sWord) aSugg = phonet.selectSimil(sWord, sPattern) - if not aSugg or not bSubst: + if not aSugg and bSubst: for sMorph in _oSpellChecker.getMorph(sWord): - aSugg.extend(conj.getSimil(sWord, sMorph, bSubst)) - break + if ":V" in sMorph: + sInfi = sMorph[1:sMorph.find("/")] + if sPattern: + for sName in conj.getNamesFrom(sInfi): + if any(re.search(sPattern, sMorph2) for sMorph2 in _oSpellChecker.getMorph(sName)): + aSugg.append(sName) + else: + aSugg.extend(conj.getNamesFrom(sInfi)) + break if aSugg: if bVC: aSugg = [ joinVerbAndSuffix(sSugg, sSfx) for sSugg in aSugg ] return "|".join(aSugg) return "" Index: gc_lang/fr/rules.grx ================================================================== --- gc_lang/fr/rules.grx +++ gc_lang/fr/rules.grx @@ -7352,12 +7352,12 @@ TEST: {{Ont}} viens ! ->> On TEST: {{Ont}} ne sait pas comment faire. ->> On TEST: ce livre qu’{{ont}} t’apporte ->> on TEST: ouais, c’est ça, {{ont}} t’assure que c’est vrai ->> on TEST: {{Ont}} lui avait donné du temps ->> On -TEST: {{Ont}} leur {{prendra}} tout ->> On|||prise|prises -TEST: Qu’importe, {{ont}} leur {{prend}} tout ->> on|||prise|prises +TEST: {{Ont}} leur {{prendra}} tout ->> On|||prise +TEST: Qu’importe, {{ont}} leur {{prend}} tout ->> on|||prise TEST: {{peut-ont}} y arriver avec si peu de moyens ? ->> peut-on TEST: {{peut ont}} y arriver ? ->> peut-on TEST: comme ce que l’{{ont}} {{voit}} dans le lien entre polygynie et guerre. ->> on|||vu TEST: Tout à fait, {{ont}} peut même dire qu’à l’adolescence, ce sont les problèmes de l’enfance qui ressortent. ->> on TEST: pour le verbe avoir, écrivez “ont”. @@ -8053,11 +8053,11 @@ TEST: ledit {{soutient}} ne vaut rien ->> soutien TEST: {{ce}} {{rappelle}} n’en finit pas. ->> se|||rappel TEST: mon {{rackette}} n’a pas porté les fruits espérés. ->> racket TEST: mon {{impacte}} ->> impact TEST: ton {{recèle}} avait été dévoilé ->> recel -TEST: un verbe au {{passait}} simple ->> passé|passés|passée|passées|passe|passes|passant|passions +TEST: un verbe au {{passait}} simple ->> passé|passe|passant TEST: quel {{impacte}} cela aura-t-il ? ->> impact TEST: chaque {{désire}} importe. ->> désir TEST: l’attuque du {{briguant}} ->> brigand TEST: quelqu’un arrive. TEST: Belle qui tient mon vit captif entre tes doigts. @@ -8141,17 +8141,17 @@ à une @:V¬:[GNAWMB] <<- /conf/ not value(<1, "|une|") -3>> =suggSimil(\3, ":[NA].*:[fe]:[si]", True) && Incohérence : après “\1 \2”, on devrait trouver un substantif féminin. TEST: à le {{poussait}} ->> pousser -TEST: à la {{finit}} ->> finie|finir|finis|fini|finies +TEST: à la {{finit}} ->> finie|finir TEST: à l’{{imaginions}} ->> TEST: à son {{impacte}} ->> impact TEST: à leur {{profile}} ->> profil|profiler -TEST: à un {{employer}} ->> employé|employée|employés|employées -TEST: à une {{employer}} ->> employée|employé|employés|employées -TEST: à leurs {{finissions}} ->> fini|finie|finis|finies +TEST: à un {{employer}} ->> employé +TEST: à une {{employer}} ->> employée +TEST: à leurs {{finissions}} ->> finis|finies TEST: on les voit un par un devenir prendre un chemin de predition TEST: une référence à l’astuce de base qui permet d’outrepasser ses droits. TEST: Le mari répète à l’envi qu’il a découvert la France à travers les mots de sa femme. TEST: Il reste de nombreux militants sincères à la FI. @@ -8166,11 +8166,11 @@ [de|d’] [l’|leur] @:[123][sp]¬:[GNAQ] <<- /conf/ not \3.istitle() and not \3.isupper() -3>> =suggSimil(\3, ":[NA].*:[si]", True) && Incohérence avec « \1 \2 » : “\3” est une forme verbale conjuguée. -TEST: de l’{{arrivait}} ->> arrivée|arrivées|arrivant +TEST: de l’{{arrivait}} ->> arrivée|arrivant TEST: la production d’électricité par des énergies renouvelables aurait encore augmenté de 7 %, selon les calculs de l’AIE [de|d’] le *WORD <<- /conf/ space(\1, 0, 1) and morph(\3, ":[NAQ].*:[me]", ":[YG]") and not \3.istitle() @@ -8206,11 +8206,11 @@ d’ une @:[123][sp]¬:[GNA] <<- /conf/ not \3.istitle() and not value(<1, "|plus|moins|") -3>> =suggSimil(\3, ":[NA].*:[fe]:[si]", True) && Incohérence avec “\1\2” : “\3” est une forme verbale. TEST: d’un {{œillait}} ->> œillet -TEST: d’une {{habille}} de femme ->> habillé|habillée|habillés|habillées +TEST: d’une {{habille}} de femme ->> habillée TEST: plus d’un ont été traumatisés TEST: Plus d’une sont parties aussi vite qu’elles étaient venues __conf_par_vconj__ @@ -8224,13 +8224,13 @@ par une @:V¬:[GNA] <<- /conf/ not \3.istitle() and not value(<1, "|une|") -3>> =suggSimil(\3, ":[NA].*:[fe]:[si]", True) && Incohérence avec “\1 \2” : “\3” est une forme verbale. TEST: par {{bloque}} de données ->> bloc|blocs -TEST: par une {{donnait}} sans importance ->> donne|donnes|donnée|données +TEST: par une {{donnait}} sans importance ->> donne|donnée TEST: par un {{bloque}} de donnée ->> bloc -TEST: conçu par un {{employer}} très compétent ->> employé|employés|employée|employées +TEST: conçu par un {{employer}} très compétent ->> employé TEST: pour les insulter au sortir du seul troquet dispensateur d’oubli liquide du coin TEST: ce peut être un matériau à part entière pour alimenter discussions et délibérations. __conf_préposition_det_verbe__ @@ -8244,11 +8244,11 @@ <<- /conf/ not \-1.istitle() -3>> =suggSimil(\3, ":[NA].*:[si]", True) && Incohérence : après « \1 \2 », on devrait trouver un groupe nominal. [malgré|dès] [les|leurs] @:V¬:[GNAWMB] <<- /conf/ not \-1.istitle() -3>> =suggSimil(\3, ":[NA].*:[pi]", True) && Incohérence : après « \1 \2 », on devrait trouver un groupe nominal. -TEST: malgré un {{employer}} peu dévoué ->> employé|employés|employée|employées +TEST: malgré un {{employer}} peu dévoué ->> employé TEST: dès le {{commencent}}, j’ai vu le problème. ->> commençant TEST: dès la {{posent}} ->> pause|pose TEST: malgré l’{{arrête}} qui interdisait le port ->> arête TEST: malgré les {{arrêtes}} ->> arêtes TEST: malgré les deux précédentes erreurs @@ -8388,11 +8388,11 @@ TEST: et avec ça seulement elle aussi {{mangées}}. ->> mangée|mangeait __conf_en_tant_que_subst__ en tant [que|qu’] @:V¬:[NAG] - <<- /conf/ --1>> =suggSimil(\-1, ":[NA]") + <<- /conf/ --1>> =suggSimil(\-1, ":[NA]", True) && Confusion probable. Après « en tant que », il faut un substantif, pas un verbe. Exemples : en tant que femme, en tant que patron, en tant que trentenaire… TEST: en tant qu’{{abaisse}} ->> TEST: en tant que tel @@ -11629,11 +11629,11 @@ TEST: il {{ma}} tuée ->> m’a TEST: cette femme ne {{ma}} prise que deux fois ->> m’a TEST: {{on}} {{ma}} dézinguée ->> ont|||m’a TEST: ça {{ma}} {{foutu}} en l’air ->> m’a|||foutue TEST: cet homme {{ma}} succédé à ce poste ->> m’a -TEST: {{ma}} {{donner}} la nausée, ce con ->> m’a|||donnée|données|donne|donnes +TEST: {{ma}} {{donner}} la nausée, ce con ->> m’a|||donnée|donne TEST: c’est ça qui {{ma}} forcée à poursuivre ->> m’a TEST: ça ma grande, c’est mon secret # m’ont / mon