Overview
Comment: | [core][fr] merge functions <morph> and <morphex> |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | fr | core | rg |
Files: | files | file ages | folders |
SHA3-256: |
92f00f290c83f33edbd8fae091ac306b |
User & Date: | olr on 2018-08-31 09:28:11 |
Other Links: | branch diff | manifest | tags |
Context
2018-08-31
| ||
14:44 | [fr] ajustements check-in: 544fd5f5ad user: olr tags: fr, rg | |
09:28 | [core][fr] merge functions <morph> and <morphex> check-in: 92f00f290c user: olr tags: fr, core, rg | |
09:14 | [build] show bookmark for ENDGRAPH check-in: c466999e36 user: olr tags: build, rg | |
Changes
Modified gc_core/py/lang_core/gc_engine.py from [652216e1e3] to [ca7de6ac32].
︙ | ︙ | |||
393 394 395 396 397 398 399 | print("TOKENS:", dTokenPos) if tWord[0] in dTokenPos and "lMorph" in dTokenPos[tWord[0]]: echo("DA: " + str(dTokenPos[tWord[0]]["lMorph"])) echo("FSA: " + str(lMorph)) return True | | < < < < < < < < < < < < < > > > > > > | | | | < < < < < < < < < < < > > > > > | | | | 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 | print("TOKENS:", dTokenPos) if tWord[0] in dTokenPos and "lMorph" in dTokenPos[tWord[0]]: echo("DA: " + str(dTokenPos[tWord[0]]["lMorph"])) echo("FSA: " + str(lMorph)) return True def morph (dTokenPos, tWord, sPattern, sNegPattern="", bNoWord=False): "analyse a tuple (position, word), returns True if not sNegPattern in word morphologies and sPattern in word morphologies (disambiguation on)" if not tWord: return bNoWord lMorph = dTokenPos[tWord[0]]["lMorph"] if tWord[0] in dTokenPos and "lMorph" in dTokenPos[tWord[0]] else _oSpellChecker.getMorph(tWord[1]) if not lMorph: return False # check negative condition if sNegPattern: if sNegPattern == "*": # all morph must match sPattern zPattern = re.compile(sPattern) return all(zPattern.search(sMorph) for sMorph in lMorph) else: zNegPattern = re.compile(sNegPattern) if any(zNegPattern.search(s) for s in lMorph): return False # search sPattern zPattern = re.compile(sPattern) return any(zPattern.search(s) for s in lMorph) def analyse (sWord, sPattern, sNegPattern=""): "analyse a word, returns True if not sNegPattern in word morphologies and sPattern in word morphologies (disambiguation off)" lMorph = _oSpellChecker.getMorph(sWord) if not lMorph: return False # check negative condition if sNegPattern: if sNegPattern == "*": zPattern = re.compile(sPattern) return all(zPattern.search(sMorph) for sMorph in lMorph) else: zNegPattern = re.compile(sNegPattern) if any(zNegPattern.search(s) for s in lMorph): return False # search sPattern zPattern = re.compile(sPattern) return any(zPattern.search(s) for s in lMorph) ## functions to get text outside pattern scope |
︙ | ︙ | |||
1051 1052 1053 1054 1055 1056 1057 | lMorph = _oSpellChecker.getMorph(dToken["sValue"]) if not lMorph: return False # check negative condition if sNegPattern: if sNegPattern == "*": # all morph must match sPattern | < < | 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 | lMorph = _oSpellChecker.getMorph(dToken["sValue"]) if not lMorph: return False # check negative condition if sNegPattern: if sNegPattern == "*": # all morph must match sPattern zPattern = re.compile(sPattern) return all(zPattern.search(sMorph) for sMorph in lMorph) else: zNegPattern = re.compile(sNegPattern) if any(zNegPattern.search(sMorph) for sMorph in lMorph): return False # search sPattern |
︙ | ︙ | |||
1078 1079 1080 1081 1082 1083 1084 | lMorph = _oSpellChecker.getMorph(dToken["sValue"]) if not lMorph: return False # check negative condition if sNegPattern: if sNegPattern == "*": # all morph must match sPattern | < < < < | 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 | lMorph = _oSpellChecker.getMorph(dToken["sValue"]) if not lMorph: return False # check negative condition if sNegPattern: if sNegPattern == "*": # all morph must match sPattern zPattern = re.compile(sPattern) return all(zPattern.search(sMorph) for sMorph in lMorph) else: zNegPattern = re.compile(sNegPattern) if any(zNegPattern.search(sMorph) for sMorph in lMorph): return False # search sPattern zPattern = re.compile(sPattern) return any(zPattern.search(sMorph) for sMorph in lMorph) def g_merged_analyse (dToken1, dToken2, cMerger, sPattern, sNegPattern="", bSetMorph=True): "merge two token values, return True if <sNegPattern> not in morphologies and <sPattern> in morphologies (disambiguation off)" lMorph = _oSpellChecker.getMorph(dToken1["sValue"] + cMerger + dToken2["sValue"]) if not lMorph: return False # check negative condition if sNegPattern: if sNegPattern == "*": # all morph must match sPattern zPattern = re.compile(sPattern) bResult = all(zPattern.search(sMorph) for sMorph in lMorph) if bResult and bSetMorph: dToken1["lMorph"] = lMorph return bResult else: zNegPattern = re.compile(sNegPattern) |
︙ | ︙ |
Modified gc_lang/fr/rules.grx from [1193c248dc] to [981abbfa7c].
︙ | ︙ | |||
448 449 450 451 452 453 454 | MM[.] <<- ~>> "MM " __[s>(p_Mr_Mgr_Mme_point)__ M(?:r|gr|me|[.]) [A-ZÉ]([.])(?=\W+[a-zéèêâîïû]) @@$ <<- ~1>> * # Patronyme réduit à une seule lettre __[s](p_prénom_lettre_point_patronyme)__ ([A-ZÉÈÂÎ][\w-]+)[ ]([A-ZÉÈÂ][.][ ]([A-ZÉÈÂ][\w-]+)) @@0,$,$ | | | | 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 | MM[.] <<- ~>> "MM " __[s>(p_Mr_Mgr_Mme_point)__ M(?:r|gr|me|[.]) [A-ZÉ]([.])(?=\W+[a-zéèêâîïû]) @@$ <<- ~1>> * # Patronyme réduit à une seule lettre __[s](p_prénom_lettre_point_patronyme)__ ([A-ZÉÈÂÎ][\w-]+)[ ]([A-ZÉÈÂ][.][ ]([A-ZÉÈÂ][\w-]+)) @@0,$,$ <<- morph(\1, ":M[12]") and (morph(\3, ":(?:M[12]|V)") or not spell(\3)) ~2>> * __[s>(p_prénom_lettre_point)__ ([A-ZÉÈÂÎ][\w-]+)[ ]([A-ZÉÈÂ][.]) @@0,$ <<- morph(\1, ":M[12]") and after("^\W+[a-zéèêîïâ]") ~2>> * # Patronymes composés avec Le/La/Les __[s](p_patronyme_composé_avec_le_la_les)__ [A-ZÉÈÂÎ][\w-]+[-–—]L(?:es?|a) [A-ZÉÈÂÎ][\w-]+ <<- ~>> =\0.replace(" ", "_") # IP __[s](p_adresse_IP)__ |
︙ | ︙ | |||
482 483 484 485 486 487 488 | # crochets __[s](p_points_suspension_entre_crochets)__ \[…\] <<- ~>> * __[s](p_mot_entre_crochets)__ \[({w_1})\] @@1 <<- \1.isdigit() ~>> * | | | 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 | # crochets __[s](p_points_suspension_entre_crochets)__ \[…\] <<- ~>> * __[s](p_mot_entre_crochets)__ \[({w_1})\] @@1 <<- \1.isdigit() ~>> * <<- __else__ and morph(\1, ":G") ~>> =" " + \1 + " " <<- __else__ and \1.isalpha() ~>> " _" __[s](points_suspension_entre_parenthèses)__ \(…\) <<- ->> […] # Pour indiquer une troncature de texte, on utilise usuellement des crochets. <<- ~>> * # Divers |
︙ | ︙ | |||
661 662 663 664 665 666 667 | !! !! # 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) | | | 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 | !! !! # 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, ":") and morph(\2, ":") -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-]+) @@$ |
︙ | ︙ | |||
684 685 686 687 688 689 690 | !! !! # 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)__ ({w_1})( car)(?= (?:j[e’]|tu|ils?|nous|vous|elles?|on|les?|l[a’]|ces?|des?|cette|[mts](?:on|a|es))\b) @@0,$ | | | | | 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 | !! !! # 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)__ ({w_1})( car)(?= (?:j[e’]|tu|ils?|nous|vous|elles?|on|les?|l[a’]|ces?|des?|cette|[mts](?:on|a|es))\b) @@0,$ <<- not morph(\1, ":[DR]") -2>> , car # Si « car » est la conjonction de coordination, une virgule est peut-être souhaitable.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=3447 __[i>/virg(virgule_manquante_avant_mais)__ ({w_1})( mais)(?= (?:j[e’]|tu|ils?|nous|vous|elles?|on)\b) @@0,$ <<- not morph(\1, ">(?:[mtscl]es|[nv]os|quels)/") -2>> , mais # Si « mais » est la conjonction de coordination, une virgule est souhaitable si elle introduit une nouvelle proposition.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=3445 __[i>/virg(virgule_manquante_avant_donc)__ ({w_1})( donc)(?= (?:j[e’]|tu|ils?|elles?|on)\b) @@0,$ <<- not morph(\1, ":V") -2>> , donc # Si « donc » est la conjonction de coordination, une virgule est souhaitable si elle introduit une nouvelle proposition.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=3448 TEST: Un chien, un chat{{ etc.}} ->> , etc. TEST: Je suis fatigué{{ car}} ils ont joué toute la nuit. ->> , car TEST: Je suis fatigué{{ mais}} il a joué toute la nuit. ->> , mais TEST: il l’a vu de ses propres yeux{{ donc}} il faut y croire. ->> , donc TEST: il s’est donc tu |
︙ | ︙ | |||
938 939 940 941 942 943 944 | <<- ->> \1’ # Il manque vraisemblablement une apostrophe. <<- ~>> \1’ # Solution prudente : __[i>/typo(typo_apostrophe_manquante_prudence1)!8__ ne ([mtsl] )([aeéiouhyîèêôû][\w-]*) @@3,$ <<- -1>> =\1[:-1]+"’" # Il manque une apostrophe. __[i>/typo(typo_apostrophe_manquante_prudence2)!8__ (?:je|tu|ils?|nous|vous|on|ça|elles?) ([nmtsl] )([aeéiouhyîèêôû][\w-]*) @@*,$ | | | 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 | <<- ->> \1’ # Il manque vraisemblablement une apostrophe. <<- ~>> \1’ # Solution prudente : __[i>/typo(typo_apostrophe_manquante_prudence1)!8__ ne ([mtsl] )([aeéiouhyîèêôû][\w-]*) @@3,$ <<- -1>> =\1[:-1]+"’" # Il manque une apostrophe. __[i>/typo(typo_apostrophe_manquante_prudence2)!8__ (?:je|tu|ils?|nous|vous|on|ça|elles?) ([nmtsl] )([aeéiouhyîèêôû][\w-]*) @@*,$ <<- not option("mapos") and morph(\2, ":V") -1>> =\1[:-1]+"’" # Il manque probablement une apostrophe. # Solution audacieuse : __[s>/typo(typo_apostrophe_manquante_audace1)!8__ ([ldsncjmtç] )[aeéiouhAEÉIOUHyîèêôûYÎÈÊÔÛ] @@0 <<- option("mapos") and not before("(?i)(?:lettre|caractère|glyphe|dimension|variable|fonction|point) *$") -1>> =\1[:-1]+"’" # Il manque peut-être une apostrophe. # Note : pour les majuscules, la règle se situe lors de la passe suivante. |
︙ | ︙ | |||
1091 1092 1093 1094 1095 1096 1097 | __[s]/unit(unit_nbsp_avant_unités1)__ ((\d+(?:,\d+[⁰¹²³⁴⁵⁶⁷⁸⁹]?|[⁰¹²³⁴⁵⁶⁷⁸⁹]|)) ?)(?:[kcmµn]?(?:[slgJKΩ]|m[²³]?|Wh?|Hz|dB)|[%‰€$£¥Åℓhj]|min|°C|℃)(?![’']) @@0,0 <<- -1>> "\2 " # Avec une unité de mesure, mettez un espace insécable. __[s]/unit(unit_nbsp_avant_unités2)__ ((\d+(?:,\d+[⁰¹²³⁴⁵⁶⁷⁸⁹]?|[⁰¹²³⁴⁵⁶⁷⁸⁹])) ?)([a-zA-Zµ][a-zA-Z0-9Ωℓ⁰¹²³⁴⁵⁶⁷⁸⁹/·]*) @@0,0,$ | | | | 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 | __[s]/unit(unit_nbsp_avant_unités1)__ ((\d+(?:,\d+[⁰¹²³⁴⁵⁶⁷⁸⁹]?|[⁰¹²³⁴⁵⁶⁷⁸⁹]|)) ?)(?:[kcmµn]?(?:[slgJKΩ]|m[²³]?|Wh?|Hz|dB)|[%‰€$£¥Åℓhj]|min|°C|℃)(?![’']) @@0,0 <<- -1>> "\2 " # Avec une unité de mesure, mettez un espace insécable. __[s]/unit(unit_nbsp_avant_unités2)__ ((\d+(?:,\d+[⁰¹²³⁴⁵⁶⁷⁸⁹]?|[⁰¹²³⁴⁵⁶⁷⁸⁹])) ?)([a-zA-Zµ][a-zA-Z0-9Ωℓ⁰¹²³⁴⁵⁶⁷⁸⁹/·]*) @@0,0,$ <<- morph(\3, ";S", ":[VCR]") or mbUnit(\3) or not spell(\3) -1>> "\2 " # Si “\3” est une unité de mesure, il manque un espace insécable. Si le nombre se rapporte au mot suivant, c’est aussi valable. __[s]/unit(unit_nbsp_avant_unités3)__ ((\d+) )([a-zA-Zµ][a-zA-Z0-9Ωℓ⁰¹²³⁴⁵⁶⁷⁸⁹/·]*)(?![’']) @@0,0,$ <<- (\2.__len__() > 4 and not spell(\3)) or morph(\3, ";S", ":[VCR]") or mbUnit(\3) -1>> "\2 " # Si “\3” est une unité de mesure, il manque un espace insécable. Si le nombre se rapporte au mot suivant, c’est aussi valable. TEST: Ça a duré {{3}}µs TEST: Ça a duré {{3,5 }}µs TEST: il y en a {{3 }}m² TEST: il a fait {{10}}% |
︙ | ︙ | |||
1134 1135 1136 1137 1138 1139 1140 | <<- __else__ and after("^(?:,\d+[⁰¹²³⁴⁵⁶⁷⁸⁹]?|[⁰¹²³⁴⁵⁶⁷⁸⁹])") or after(r"^[ ]*(?:[kcmµn]?(?:[slgJKΩ]|m[²³]?|Wh?|Hz|dB)|[%‰€$£¥Åℓhj]|min|°C|℃)(?![\w’'])") ->> =formatNumber(\0) # Formatage des grands nombres. __[s]/num(num_nombre_quatre_chiffres)__ (?<!,)(\d\d\d\d)[ ]([a-zA-Zµ][a-zA-Z0-9Ωℓ⁰¹²³⁴⁵⁶⁷⁸⁹/·]*) @@0,$ | | | 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 | <<- __else__ and after("^(?:,\d+[⁰¹²³⁴⁵⁶⁷⁸⁹]?|[⁰¹²³⁴⁵⁶⁷⁸⁹])") or after(r"^[ ]*(?:[kcmµn]?(?:[slgJKΩ]|m[²³]?|Wh?|Hz|dB)|[%‰€$£¥Åℓhj]|min|°C|℃)(?![\w’'])") ->> =formatNumber(\0) # Formatage des grands nombres. __[s]/num(num_nombre_quatre_chiffres)__ (?<!,)(\d\d\d\d)[ ]([a-zA-Zµ][a-zA-Z0-9Ωℓ⁰¹²³⁴⁵⁶⁷⁸⁹/·]*) @@0,$ <<- morph(\2, ";S", ":[VCR]") or mbUnit(\2) -1>> =formatNumber(\1) # Formatage des grands nombres TEST: {{12345}} ->> 12 345 TEST: {{123456}} ->> 123 456 TEST: {{1234567}} ->> 1 234 567 TEST: {{12345678}} ->> 12 345 678 TEST: {{023456789}} ->> 023 456 789|023 45 67 89|02 345 67 89 TEST: {{0234567890}} ->> 0 234 567 890|02 34 56 78 90|023 456 78 90|0234 567-890 |
︙ | ︙ | |||
1190 1191 1192 1193 1194 1195 1196 | !! !! !!!! Redondances !! !! !! __[i]/redon1(redondances_paragraphe)__ ({w_4})[ ,.;!?:].*[ ](\1) @@0,$ | | | 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 | !! !! !!!! Redondances !! !! !! __[i]/redon1(redondances_paragraphe)__ ({w_4})[ ,.;!?:].*[ ](\1) @@0,$ <<- not morph(\1, ":(?:G|V0)|>(?:t(?:antôt|emps|rès)|loin|souvent|parfois|quelquefois|côte|petit|même)/") and not \1[0].isupper() -2>> _ # Dans ce paragraphe, répétition de « \1 » (à gauche). <<- __also__ -1>> _ # Dans ce paragraphe, répétition de « \1 » (à droite). TEST: __redon1__ Tu es son {{avenir}}. Et lui aussi est ton {{avenir}}. TEST: __redon1__ Car parfois il y en a. Mais parfois il n’y en a pas. |
︙ | ︙ | |||
1220 1221 1222 1223 1224 1225 1226 | # ! __<s]/ocr(ocr_exclamation1)__ [ ]I(?![ ’'][aâeéèêëiîïoôuy]) <<- ->> " !" # Erreur de numérisation ? __<s]/ocr(ocr_exclamation2)__ [ ]1(?= [A-ZÉÈÂÎ]) | | | 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 | # ! __<s]/ocr(ocr_exclamation1)__ [ ]I(?![ ’'][aâeéèêëiîïoôuy]) <<- ->> " !" # Erreur de numérisation ? __<s]/ocr(ocr_exclamation2)__ [ ]1(?= [A-ZÉÈÂÎ]) <<- not morph(word(1), ";S") and not morph(word(-1), ":R") ->> " !" # Erreur de numérisation ? TEST: __ocr__ Oh{{ I}} c’est pas formidable ? TEST: __ocr__ Vraiment{{ 1}} Paul n’en savait rien. TEST: __ocr__ Ça prendra 1 h. TEST: __ocr__ Valeur : 1 KHz. |
︙ | ︙ | |||
1251 1252 1253 1254 1255 1256 1257 | TEST: __ocr__ En l’an {{2OO1}}, tout commença. ## Casse __[s]/ocr(ocr_casse1)__ [A-ZÉÈÂÊÎÔ]{w_1} <<- \0.istitle() and before(r"(?i)\w") >>> | | | | 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 | TEST: __ocr__ En l’an {{2OO1}}, tout commença. ## Casse __[s]/ocr(ocr_casse1)__ [A-ZÉÈÂÊÎÔ]{w_1} <<- \0.istitle() and before(r"(?i)\w") >>> <<- morph(\0, ":G", ":M") ->> =\0.lower() # Erreur de numérisation ? Casse improbable. <<- __else__ and morph(\0, ":[123][sp]", ":[MNA]|>Est/") ->> =\0.lower() # Erreur de numérisation ? Casse improbable. TEST: __ocr__ votre ami la regarde, {{Vous}} ne l’avez pas achetée TEST: __ocr__ pour accommoder son regard, {{La}} lourde forme demeure TEST: __ocr__ parler de Nicole, {{Le}} sommeil ne vient pas. TEST: __ocr__ a fait de toi, Charles, {{Tu}} étais beau quand TEST: __ocr__ s’habituer à se faire servir, {{Au}} début ça TEST: __ocr__ Tu as tué ce petit garçon, Henri, {{Et}} tu le sais. |
︙ | ︙ | |||
1424 1425 1426 1427 1428 1429 1430 | TEST: Il y a un {{doublon doublon}}. ### Traits d’union douteux __[i]/tu(tu_trait_union_douteux)__ ({w1})(?:--|—|–)({w1}) @@0,$ | | | | | 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 | TEST: Il y a un {{doublon doublon}}. ### Traits d’union douteux __[i]/tu(tu_trait_union_douteux)__ ({w1})(?:--|—|–)({w1}) @@0,$ <<- spell(\1+"-"+\2) and analyse(\1+"-"+\2, ":") ->> \1-\2 # Trait d’union : un tiret simple suffit. TEST: Nous préparons une {{contre–attaque}}. !!!! Nombres: typographie !! #(\d\d\d\d)-(\d\d\d\d) <<- ->> \1–\2 # Ne pas séparer deux dates par un trait d’union, mais par un tiret demi-cadratin. __[s]/num(num_lettre_O_zéro1)__ [\dO]+[O][\dO]+ <<- not option("ocr") ->> =\0.replace("O", "0") # S’il s’agit d’un nombre, utilisez le chiffre « 0 » plutôt que la lettre « O ». __[s]/num(num_lettre_O_zéro2)__ [1-9]O <<- not option("ocr") ->> =\0.replace("O", "0") # S’il s’agit d’un nombre, utilisez le chiffre « 0 » plutôt que la lettre « O ». TEST: année {{2O11}} ->> 2011 TEST: {{3O}} (chiffre avec un O). ->> 30 !!!! Écritures épicènes invariables !! __[i](d_typo_écriture_épicène_pluriel)__ ({w_1}[éuitsrn])_(?:[nt]|)e_s @@0 <<- morph(\1, ":[NAQ]", ":G") =>> define(\1, [":N:A:Q:e:p"]) __[i](d_typo_écriture_épicène_singulier)__ ({w_2}[éuitsrn])_e @@0 <<- morph(\1, ":[NAQ]") =>> define(\1, [":N:A:Q:e:s"]) !!! !!! !!! Processeur: épuration des signes inutiles et quelques simplifications !! !!! !!! |
︙ | ︙ | |||
1471 1472 1473 1474 1475 1476 1477 | __<s>(p_chapitre_référence)__ [\[({][\dIVXLCDM]+, \d+[\])}] <js>[\[\(\{][\dIVXLCDM]+, \d+[\]\)\}]</js> <<- ~>> * # le, la ou les chose(s) __[i>(p_le_ou_les)__ l[ea] ou les {w_2}([(]s[)]) @@$ <<- ~1>> s __[i](p_le_ou_la)__ l(e ou la|a ou le) {w_2} @@1 <<- ~1>> ’ # les références aux notes | | | | | 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 | __<s>(p_chapitre_référence)__ [\[({][\dIVXLCDM]+, \d+[\])}] <js>[\[\(\{][\dIVXLCDM]+, \d+[\]\)\}]</js> <<- ~>> * # le, la ou les chose(s) __[i>(p_le_ou_les)__ l[ea] ou les {w_2}([(]s[)]) @@$ <<- ~1>> s __[i](p_le_ou_la)__ l(e ou la|a ou le) {w_2} @@1 <<- ~1>> ’ # les références aux notes __[i](p_références_aux_notes)__ [a-zéèâàôîù][a-zéèâàôîù-]+(\d+) @@$ <<- not morph(\0, ":") ~1>> * # faux positifs avec adverbes de négation __[i](p_pas_mal)__ pas mal <<- not morph(word(-1), ":D") ~>> * __[i](p_pas_assez)__ pas assez ({w_2}) @@$ <<- morph(\1, ":A") and not morph(word(-1), ":D") ~>> * # faux positifs avec «à chez» __[i](p_de_chez_à_chez_pronom)__ de chez \w+ (?:à|jusqu à) chez (?:moi|toi|lui|elles?|eux|nous|vous) <<- ~>> * __[i](p_de_chez)__ (jusqu à|de) chez @@0 <<- ~1>> * # singletons entre parenthèses / crochets / accolades __<s>(p_singleton_parenthèses)__ [(]\w+[)] <js>\([a-zA-Z]+\)</js> <<- ~>> * |
︙ | ︙ | |||
10243 10244 10245 10246 10247 10248 10249 | # !!!! Redondances dans la phrase !! __[i]/redon2(redondances_phrase)__ ({w_4})[ ,].* (\1) @@0,$ | | | | | | 10243 10244 10245 10246 10247 10248 10249 10250 10251 10252 10253 10254 10255 10256 10257 10258 10259 10260 10261 10262 10263 10264 10265 10266 10267 10268 10269 10270 10271 10272 10273 10274 10275 10276 | # !!!! Redondances dans la phrase !! __[i]/redon2(redondances_phrase)__ ({w_4})[ ,].* (\1) @@0,$ <<- not morph(\1, ":(?:G|V0)|>même/") -2>> _ # Dans cette phrase, répétition de « \1 » (à gauche). <<- __also__ -1>> _ # Dans cette phrase, répétition de « \1 » (à droite). TEST: __redon2__ Quelle {{imposture}}, c’est d’un ennui, c’est une {{imposture}}. TEST: __redon2__ ils sont là côte à côte. TEST: __redon2__ Tu avances petit à petit, et tu réussis. TEST: __redon2__ De loin en loin, elle passe. TEST: __redon2__ Les mêmes causes produisent/produisant les mêmes effets. (répétition) !!!! Mots composés !! __[i]/mc(mc_mot_composé)__ ({w2})-({w2}) @@0,$ <<- not \1.isdigit() and not \2.isdigit() and not morph(\0, ":") and not morph(\2, ":G") and spell(\1+\2) ->> \1\2 # Vous pouvez ôter le trait d’union. <<- \2 != "là" and not re.search("(?i)^(?:ex|mi|quasi|semi|non|demi|pro|anti|multi|pseudo|proto|extra)$", \1) and not \1.isdigit() and not \2.isdigit() and not morph(\2, ":G") and not morph(\0, ":") and not spell(\1+\2) ->> _ # Mot inconnu du dictionnaire.|http://www.dicollecte.org/dictionary.php?prj=fr&unknownword=on TEST: __mc__ des {{portes-avions}}. @@@@ @@@@ |
︙ | ︙ | |||
13702 13703 13704 13705 13706 13707 13708 | TEST: ce sont des faits constestés. TEST: c’est un fait reconnu. TEST: fait pourtant avéré et corroboré par le même sondage. TEST: ce fait rapporté par des témoins au-delà de tout soupçon n’est pas contestable. #__[i]/infi(infi_faire)__ # (f(?:ai|[iî]|er|on)\w+) +({w_2}(?:ée?s?|ez)) @@0,$ | | | 13702 13703 13704 13705 13706 13707 13708 13709 13710 13711 13712 13713 13714 13715 13716 | TEST: ce sont des faits constestés. TEST: c’est un fait reconnu. TEST: fait pourtant avéré et corroboré par le même sondage. TEST: ce fait rapporté par des témoins au-delà de tout soupçon n’est pas contestable. #__[i]/infi(infi_faire)__ # (f(?:ai|[iî]|er|on)\w+) +({w_2}(?:ée?s?|ez)) @@0,$ # <<- morph(\1, ">faire/") and not before(r"(?i)\b(?:en|[mtsldc]es?|[nv]ous|un) +$") and morph(\2, ":V", ":M") # and not (re.search("(?i)^fait$", \1) and \2.endswith("é")) # and not (re.search("(?i)^faits$", \1) and \2.endswith("és")) # -2>> =suggVerbInfi(@) # Le verbe devrait être à l’infinitif. __infi_me_te_se_faire__ [me|te|se] >faire ~(?:ée?s?|ez)$ |
︙ | ︙ |