Overview
Comment: | [fr] oops, option conjugaison réactivée pour Writer +détails mineurs |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk | fr | v0.5.17.2 |
Files: | files | file ages | folders |
SHA3-256: |
7e75e7a4d45f242c1704db8bfd272446 |
User & Date: | olr on 2017-07-04 15:50:07 |
Other Links: | manifest | tags |
Context
2017-07-05
| ||
11:22 | [core] sort suggestions with distance of Damerau-Levenshtein + variables renaming check-in: 44cb3f4d52 user: olr tags: trunk, core | |
2017-07-04
| ||
15:50 | [fr] oops, option conjugaison réactivée pour Writer +détails mineurs check-in: 7e75e7a4d4 user: olr tags: trunk, fr, v0.5.17.2 | |
2017-07-03
| ||
09:30 | [core] ibdawg: suggest() seeks for tails check-in: e07a5e6edb user: olr tags: trunk, core | |
Changes
Modified gc_core/py/char_player.py from [5cd093adaf] to [9837f292f2].
︙ | ︙ | |||
26 27 28 29 30 31 32 | # Similar chars d1to1 = { "1": "li", "2": "z", "3": "e", "4": "aà", | | | | < < | | | | | | < < | < < | < < | | 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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | # Similar chars d1to1 = { "1": "li", "2": "z", "3": "e", "4": "aà", "5": "sg", "6": "bdg", "7": "lt", "8": "b", "9": "gbd", "0": "o", "a": "aàâáäæ", "à": "aàâáäæ", "â": "aàâáäæ", "á": "aàâáäæ", "ä": "aàâáäæ", "æ": "æéa", "c": "cçskqśŝ", "ç": "cçskqśŝ", "e": "eéèêëœ", "é": "eéèêëœ", "ê": "eéèêëœ", "è": "eéèêëœ", "ë": "eéèêëœ", "g": "gj", "i": "iîïyíìÿ", "î": "iîïyíìÿ", "ï": "iîïyíìÿ", "í": "iîïyíìÿ", "ì": "iîïyíìÿ", "j": "jg", "k": "kcq", "n": "nñ", "o": "oôóòöœ", "ô": "oôóòöœ", "ó": "oôóòöœ", "ò": "oôóòöœ", "ö": "oôóòöœ", "œ": "œoôeéèêë", "q": "qck", "s": "sśŝcç", "ś": "sśŝcç", "ŝ": "sśŝcç", "u": "uûùüú", "û": "uûùüú", "ù": "uûùüú", "ü": "uûùüú", "ú": "uûùüú", "v": "vw", "w": "wv", "x": "xck", "y": "yÿiîŷýỳ", "ÿ": "yÿiîŷýỳ", |
︙ | ︙ |
Modified gc_core/py/ibdawg.py from [540dfd31d3] to [af23fd019b].
︙ | ︙ | |||
187 188 189 190 191 192 193 | def suggest (self, sWord): "returns a set of similar words" # first, we check for similar words #return self._suggestWithCrushedUselessChars(cp.clearWord(sWord)) aSugg = self._suggest(sWord) if not aSugg: aSugg.update(self._suggest(sWord[1:])) | < < > | 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 | def suggest (self, sWord): "returns a set of similar words" # first, we check for similar words #return self._suggestWithCrushedUselessChars(cp.clearWord(sWord)) aSugg = self._suggest(sWord) if not aSugg: aSugg.update(self._suggest(sWord[1:])) if not aSugg: aSugg.update(self._suggestWithCrushedUselessChars(cp.clearWord(sWord))) return aSugg def _suggest (self, sWord, nDeep=0, iAddr=0, sNewWord="", bAvoidLoop=False): "returns a set of suggestions for <sWord>" # recursive function aSugg = set() if not sWord: if int.from_bytes(self.byDic[iAddr:iAddr+self.nBytesArc], byteorder='big') & self._finalNodeMask: #show(nDeep, "___" + sNewWord + "___") aSugg.add(sNewWord) for sTail in self._getTails(iAddr): |
︙ | ︙ | |||
226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 | if len(sWord) == 2: for sRepl in cp.dFinal2.get(sWord, ()): #show(nDeep, sRepl) aSugg.update(self._suggest(sRepl, nDeep+1, iAddr, sNewWord, True)) elif len(sWord) == 1: #show(nDeep, ":end of word:") # end of word for sRepl in cp.dFinal1.get(sWord, ()): #show(nDeep, sRepl) aSugg.update(self._suggest(sRepl, nDeep+1, iAddr, sNewWord, True)) return aSugg def _getSimilarArcs (self, cChar, iAddr): "generator: yield similar char of <cChar> and address of the following node" for c in cp.d1to1.get(cChar, [cChar]): if c in self.dChar: jAddr = self._lookupArcNode(self.dChar[c], iAddr) if jAddr: yield (c, jAddr) def _getTails (self, iAddr, sTail="", n=2): "return a list of suffixes ending at a distance of <n> from <iAddr>" aTails = set() for nVal, jAddr in self._getArcs(iAddr): if nVal < self.nChar: if int.from_bytes(self.byDic[jAddr:jAddr+self.nBytesArc], byteorder='big') & self._finalNodeMask: aTails.add(sTail + self.dCharVal[nVal]) | > | | 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 | if len(sWord) == 2: for sRepl in cp.dFinal2.get(sWord, ()): #show(nDeep, sRepl) aSugg.update(self._suggest(sRepl, nDeep+1, iAddr, sNewWord, True)) elif len(sWord) == 1: #show(nDeep, ":end of word:") # end of word aSugg.update(self._suggest("", nDeep+1, iAddr, sNewWord, True)) for sRepl in cp.dFinal1.get(sWord, ()): #show(nDeep, sRepl) aSugg.update(self._suggest(sRepl, nDeep+1, iAddr, sNewWord, True)) return aSugg def _getSimilarArcs (self, cChar, iAddr): "generator: yield similar char of <cChar> and address of the following node" for c in cp.d1to1.get(cChar, [cChar]): if c in self.dChar: jAddr = self._lookupArcNode(self.dChar[c], iAddr) if jAddr: yield (c, jAddr) def _getTails (self, iAddr, sTail="", n=2): "return a list of suffixes ending at a distance of <n> from <iAddr>" aTails = set() for nVal, jAddr in self._getArcs(iAddr): if nVal < self.nChar: if int.from_bytes(self.byDic[jAddr:jAddr+self.nBytesArc], byteorder='big') & self._finalNodeMask: aTails.add(sTail + self.dCharVal[nVal]) if n and not aTails: aTails.update(self._getTails(jAddr, sTail+self.dCharVal[nVal], n-1)) return aTails def _suggestWithCrushedUselessChars (self, sWord, nDeep=0, iAddr=0, sNewWord="", bAvoidLoop=False): aSugg = set() if not sWord: if int.from_bytes(self.byDic[iAddr:iAddr+self.nBytesArc], byteorder='big') & self._finalNodeMask: |
︙ | ︙ | |||
268 269 270 271 272 273 274 | return aSugg def _getSimilarArcsAndCrushedChars (self, cChar, iAddr): "generator: yield similar char of <cChar> and address of the following node" for nVal, jAddr in self._getArcs(iAddr): if self.dCharVal.get(nVal, None) in cp.aUselessChar: yield (self.dCharVal[nVal], jAddr) | | < < < < | 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 | return aSugg def _getSimilarArcsAndCrushedChars (self, cChar, iAddr): "generator: yield similar char of <cChar> and address of the following node" for nVal, jAddr in self._getArcs(iAddr): if self.dCharVal.get(nVal, None) in cp.aUselessChar: yield (self.dCharVal[nVal], jAddr) yield from self._getSimilarArcs(cChar, iAddr) def drawPath (self, sWord, iAddr=0): cChar = sWord[0:1] if sWord else " " iPos = -1 n = 0 print(cChar + ": ", end="") for nVal, jAddr in self._getArcs(iAddr): |
︙ | ︙ |
Modified gc_lang/fr/config.ini from [845843da5f] to [94e5221453].
1 2 3 4 5 6 7 | [args] lang = fr lang_name = French locales = fr_FR fr_BE fr_CA fr_CH fr_LU fr_MC fr_BF fr_CI fr_SN fr_ML fr_NE fr_TG fr_BJ country_default = FR name = Grammalecte implname = grammalecte | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [args] lang = fr lang_name = French locales = fr_FR fr_BE fr_CA fr_CH fr_LU fr_MC fr_BF fr_CI fr_SN fr_ML fr_NE fr_TG fr_BJ country_default = FR name = Grammalecte implname = grammalecte version = 0.5.17.2 author = Olivier R. provider = Dicollecte link = http://grammalecte.net description = Correcteur grammatical pour le français. extras = README_fr.txt logo = logo.png |
︙ | ︙ |
Modified gc_lang/fr/rules.grx from [217ba43a7e] to [352d3d40fc].
︙ | ︙ | |||
75 76 77 78 79 80 81 | OPT/mapos: False False False False False False OPT/chim: False False False False False False OPT/ocr: False False False False False False OPT/conf: True True True True True True OPT/sgpl: True True True True True True OPT/gn: True True True True True True OPT/infi: True True True True True True | | | 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | OPT/mapos: False False False False False False OPT/chim: False False False False False False OPT/ocr: False False False False False False OPT/conf: True True True True True True OPT/sgpl: True True True True True True OPT/gn: True True True True True True OPT/infi: True True True True True True OPT/conj: True True True True True True OPT/ppas: True True True True True True OPT/imp: True True True True True True OPT/inte: True True True True True True OPT/vmode: True True True True True True OPT/bs: True True True True True True OPT/pleo: True True True True True True OPT/redon1: False False False False False False |
︙ | ︙ | |||
561 562 563 564 565 566 567 | TEST: rendez-vous avec des {{écrivain(e)s}} ->> écrivains et écrivaines|écrivaines et écrivains|écrivain·e·s TEST: la graphie “{{militant(e)s}}”. TEST: ces militant·e·s {{acharné}}. __[i](typo_écriture_épicène_singulier)__ ({w_2}[éuitsrn])(?:[-·–—./]e|[(]e[)]) @@0 | | > > > > > > > > > | | 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 | TEST: rendez-vous avec des {{écrivain(e)s}} ->> écrivains et écrivaines|écrivaines et écrivains|écrivain·e·s TEST: la graphie “{{militant(e)s}}”. TEST: ces militant·e·s {{acharné}}. __[i](typo_écriture_épicène_singulier)__ ({w_2}[éuitsrn])(?:[-·–—./]e|[(]e[)]) @@0 <<- option("typo") and not \0.endswith("·e") ->> \1·e # Écriture épicène. Utilisez un point médian. (Note : écriture journalistique brouillon.) <<- ~>> \1-e TEST: je suis {{déconsidéré.e}} par ma hiérarchie. TEST: il faut en parler à l’{{auteur(e)}} et à son agent. #__[i](typo_écriture_nombre_invariable)__ # ({w_2})(?:[-·–—./]s|[(]s[)]) @@0 # <<- option("typo") and not \0.endswith("·s") ->> \1·s # Utilisez un point médian. (Note : écriture journalistique brouillon.) # <<- ~>> \1-s # #TEST: le ou les partis {{appelé(s)}} #TEST: Appelé·s, levez-vous. # Majuscules après un point __[s]/maj(majuscule_après_point)__ ({w_2})[.] ([a-zéàèî]\w*) @@0,$ <<- not re.search("(?i)^(?:etc|[A-Z]|chap|cf|fig|hab|litt|circ|coll|r[eé]f|étym|suppl|bibl|bibliogr|cit|op|vol|déc|nov|oct|janv|juil|avr|sept)$", \1) and morph(\1, ":", False) and morph(\2, ":", False) -2>> =\2.capitalize() # Après un point, une majuscule est généralement requise. TEST: Je suis là. {{viens}}. ->> Viens TEST: Ils sont devenus idiots. {{c}}’est peine perdue. __[s]/maj(majuscule_en_début_phrase)__ ^ *([a-zéèâàô][\w-]+) @@$ <<- after("\w\w[.] +\w+") -1>> =\1.capitalize() # Majuscule en début de phrase, sauf éventuellement lors d’une énumération. TEST: {{je}} suis disponible quand tu veux. Mais pas aujourd’hui. ## virgules manquantes __[i>/virg(virgule_manquante_avant_etc)__ {w_1}( etc[.]) @@$ <<- -1>> , etc. # Avant « etc. », il faut mettre une virgule. __[i>/virg(virgule_manquante_avant_car)__ |
︙ | ︙ | |||
10684 10685 10686 10687 10688 10689 10690 10691 10692 10693 10694 10695 10696 10697 | TEST: les marchandes {{paie}} TEST: les marchandes {{marchande}} TEST: les chattes {{finis}} TEST: les chattes {{manges}} TEST: les chattes {{danse}} TEST: certains hommes {{marchandes}} sans cesse TEST: certaines femmes {{danse}} beaucoup __[i]/conj(conj_des_nom1)__ ^ *des +({w_2}) +({w_2}) @@w,$ <<- morph(\1, ":[NAQ].*:[pi]", False) and morphex(\2, ":V", ":(?:[13]p|P|G|Q|A.*:[pi])") and morph(word(1), ":(?:R|D.*:p)|>au ", False, True) >>> <<- not morph(\2, ":[NA]", False) -2>> =suggVerb(@, ":3p") # Conjugaison erronée. Accord avec « des \1… ». Le verbe devrait être à la 3ᵉ personne du pluriel. <<- __else__ and not checkAgreement(\1, \2) -2>> =suggVerb(@, ":3p", suggPlur) # Conjugaison erronée. Accord avec « des \1… ». Le verbe devrait être à la 3ᵉ personne du pluriel. | > > | 10693 10694 10695 10696 10697 10698 10699 10700 10701 10702 10703 10704 10705 10706 10707 10708 | TEST: les marchandes {{paie}} TEST: les marchandes {{marchande}} TEST: les chattes {{finis}} TEST: les chattes {{manges}} TEST: les chattes {{danse}} TEST: certains hommes {{marchandes}} sans cesse TEST: certaines femmes {{danse}} beaucoup TEST: Sauf que l’un comme l’autre avaient dû y renoncer. TEST: L’un comme l’autre devaient y renoncer. __[i]/conj(conj_des_nom1)__ ^ *des +({w_2}) +({w_2}) @@w,$ <<- morph(\1, ":[NAQ].*:[pi]", False) and morphex(\2, ":V", ":(?:[13]p|P|G|Q|A.*:[pi])") and morph(word(1), ":(?:R|D.*:p)|>au ", False, True) >>> <<- not morph(\2, ":[NA]", False) -2>> =suggVerb(@, ":3p") # Conjugaison erronée. Accord avec « des \1… ». Le verbe devrait être à la 3ᵉ personne du pluriel. <<- __else__ and not checkAgreement(\1, \2) -2>> =suggVerb(@, ":3p", suggPlur) # Conjugaison erronée. Accord avec « des \1… ». Le verbe devrait être à la 3ᵉ personne du pluriel. |
︙ | ︙ |
Modified gc_lang/fr/xpi/package.json from [5f7db10ae7] to [f43a7abb52].
1 2 3 4 | { "name": "grammalecte-fr", "title": "Grammalecte [fr]", "id": "French-GC@grammalecte.net", | | | 1 2 3 4 5 6 7 8 9 10 11 12 | { "name": "grammalecte-fr", "title": "Grammalecte [fr]", "id": "French-GC@grammalecte.net", "version": "0.5.17.2", "description": "Correcteur grammatical pour le français", "homepage": "http://www.dicollecte.org/grammalecte", "main": "ui.js", "icon": "data/img/icon-48.png", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, |
︙ | ︙ |