Index: gc_core/js/lang_core/gc_engine.js ================================================================== --- gc_core/js/lang_core/gc_engine.js +++ gc_core/js/lang_core/gc_engine.js @@ -163,11 +163,11 @@ parse: function (sText, sCountry="${country_default}", bDebug=false, dOptions=null, bContext=false) { let oText = new TextParser(sText); return oText.parse(sCountry, bDebug, dOptions, bContext); }, - _zEndOfSentence: new RegExp ('([.?!:;…][   .?!… »”")]+|.$)', "g"), + _zEndOfSentence: new RegExp ('([.?!:;…][   .?!…»”")]+(?=[A-ZÉÈÎÔ])|.$)', "g"), _zBeginOfParagraph: new RegExp ("^[-  –—.,;?!…]*", "ig"), _zEndOfParagraph: new RegExp ("[-  .,;?!…–—]*$", "ig"), getSentenceBoundaries: function* (sText) { let mBeginOfSentence = this._zBeginOfParagraph.exec(sText); Index: gc_core/py/lang_core/gc_engine.py ================================================================== --- gc_core/py/lang_core/gc_engine.py +++ gc_core/py/lang_core/gc_engine.py @@ -189,11 +189,11 @@ _dOptions = dict(gc_options.getOptions(_sAppContext)) #### Parsing -_zEndOfSentence = re.compile(r'([.?!:;…][   .?!… »”")]+|.$)') +_zEndOfSentence = re.compile(r'([.?!:;…][   .?!…»”"’)]+(?=[A-ZÉÈÎÔ])|.$)') _zBeginOfParagraph = re.compile(r"^\W*") _zEndOfParagraph = re.compile(r"\W*$") def _getSentenceBoundaries (sText): iStart = _zBeginOfParagraph.match(sText).end() Index: gc_lang/fr/rules.grx ================================================================== --- gc_lang/fr/rules.grx +++ gc_lang/fr/rules.grx @@ -491,14 +491,10 @@ <<- __else__ ->> =\0.replace(".", "").upper() # Sigle. Il est recommandé d’ôter les points pour les sigles.|https://fr.wikipedia.org/wiki/Sigle#Typographie <<- \0 != "b.a." ~>> =\0.replace(".", "_") __[s>(p_sigle3)__ J[.]-[A-Z][.] <<- ~>> =\0.replace(".", "").replace("-","") -# Ne pas scinder la phrase si les points de suspension sont suivis d’une minuscule -__(p_points_suspension)__ - ({w1})(…)(?= [a-zéèêàâîô]) @@0,$ <<- not re.search("(?i)^etc", \1) ~2>> , - # Mr et MM __[s>(p_M_point)__ (M[.]) (?:[A-ZÉÈÎ]\w*|l[e'’]) @@0 <<- ~1>> Mr __[s>(p_MM_point)__ MM[.] <<- ~>> "MM " @@ -1310,19 +1306,10 @@ 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. - -# virgules -__[s>/ocr(ocr_virgules)__ - (?:[iI]l|l(?:es?|a)|[dnmtsDNMTS]e|[àÀ]|[cC]e(?:te|t|)|[mM](?:on|a)|[TS]a|[qQ]uelques?|[aA]ux?), - <<- not /0.endswith("…") ->> =\0[:-1] # Erreur de numérisation ? Virgule superflue ? - -TEST: __ocr__ Pierre entre pour {{se,}} rapprocher de L -TEST: __ocr__ je voudrais faire une question ou deux sur une maison de ce village, la… comment l’appelle-t-on ? - # Nombres __[i]/ocr(ocr_nombres)__ [\dOI][\dOI]+ <<- \0 == "II" ->> 11|Il # Erreur de numérisation ? @@ -1438,12 +1425,11 @@ # Trait d’union conditionnel (u00AD) __[i](p_trait_union_conditionnel1)__ \w+‑\w+‑\w+ <<- ~>> =\0.replace("‑", "") __[i](p_trait_union_conditionnel2)__ \w+‑\w+ <<- ~>> =\0.replace("‑", "") # empêcher la scission en fin de dialogue -__(p_fin_dialogue1)__ ([?!…][?!…  ]*)[ "'”» ]*, @@0 <<- ~1>> * -__(p_fin_dialogue2)__ ([?!…][?!…  ]*)[ "'”» ]*[a-zéèêîô] @@0 <<- ~1>> , +__(p_fin_dialogue)__ ([?!…][?!…  ]*)[ "'”» ]*, @@0 <<- ~1>> * TEST: « Je suis donc perdu ? », dit Paul. TEST: “C’est bon !”, croit savoir Marie. TEST: “Parce que… ?” finit par demander Paul. TEST: « Dans quel pays sommes-nous ? » demanda un manifestant. @@ -2223,10 +2209,18 @@ @@@@ @@@@ # This graph is parsed only if option is activated. +# virgules +__ocr_virgules__ + [il|le|la|l’|les|de|d’|ne|n’|me|m’|te|t’|se|s’|à|ce|cet|cette|mon|ma|ta|sa|mes|tes|ses|nos|vos|quelque|quelques|au|aux] , + <<- /ocr/ space_after(\1, 0, 0) and not \1.isupper() or value(\1, "|à|") ->> \1 # Erreur de numérisation ? Virgule superflue ? + +TEST: __ocr__ Pierre entre pour {{se,}} rapprocher de L +TEST: __ocr__ je voudrais faire une question ou deux sur une maison de ce village, la… comment l’appelle-t-on ? + # âge / age __ocr_age__ >age <<- ->> =\1.replace("a", "â").replace("A", "Â") # Erreur de numérisation ? @@ -8492,10 +8486,20 @@ très biens <<- /sgpl/ -2>> bien # Adverbe ou adjectif, “bien” est invariable.|https://fr.wiktionary.org/wiki/bien TEST: Très {{biens}} connus des services de police, il leur fut difficile de passer entre les mailles du filet. + +# entre autres +__sgpl_entre_autres__ + entre autre , + entre autre @:(?:[GW]|[NA].*:[pi]) + <<- /sgpl/ -2>> autres # La locution “entre autres”, toujours au pluriel.|https://fr.wiktionary.org/wiki/entre_autres + +TEST: Des raisons ? Entre {{autre}} je n’en savais pas plus que lui. +TEST: il y eut, entre {{autre}}, des erreurs commises. + # termes __sgpl_en_termes_de__ en terme [de|d’] <<- /sgpl/ -2>> termes # Dans la locution “en termes de”, mettez “terme” au pluriel. @@ -11782,12 +11786,12 @@ !!!! 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). + <<- 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. @@ -15404,10 +15408,11 @@ TEST: c’est une tâche de grande envergure TEST: déléguer des tâches de sécurité publique à des machines autonomes TEST: tirer bénéfice de nouvelles données en fonction de la tâche de départ qui leur a été assignée TEST: Les « pervenches » fonctionnaires seraient alors affectées à d’autres tâches de surveillance, notamment au sein de la nouvelle brigade anti-insécurité. TEST: une tâche de sélection des données +TEST: les agents peu nombreux sont accaparés par le court terme et les tâches de gestion __conf_tâche_tache__ tache [accomplie|dévalorisante|difforme|épuisante|exécutée|exténuante|fatigante|ingrate|menée|valorisante] taches [accomplies|dévalorisantes|difformes|épuisantes|exécutées|exténuantes|fatigantes|ingrates|menées|valorisantes]