Skip to content

Commit

Permalink
feat: upgrade to grammalecte v2.1.1 and start to hava a functionnal r…
Browse files Browse the repository at this point in the history
…un command
  • Loading branch information
GreatWizard committed Jul 11, 2021
1 parent 2b300a2 commit 17fdaf7
Show file tree
Hide file tree
Showing 38 changed files with 29,499 additions and 19,430 deletions.
60 changes: 32 additions & 28 deletions demo/input-file/output.txt
Original file line number Diff line number Diff line change
@@ -1,63 +1,67 @@
Python v3.9.5 (default, May 4 2021, 03:33:11)
[Clang 12.0.0 (clang-1200.0.32.29)]
Grammalecte v2.1.1
Quoi ? Racontes ! Racontes-moi ! Bon sangg, parles ! Oui. Il y a des menteur partout.
^^ ^^^^^^^^ ^^^^^^^^^^^^ °°°°° ^^^^^^ ^^^^^^^
* 1 [4:6] # #1047p / nbsp_avant_double_ponctuation:
* 1 [4:6] # #1089p / nbsp_avant_double_ponctuation:
Il manque un espace insécable.
> Suggestions :  ?
* 2 [7:15] # #22492 / imp_verbe_groupe1__b2_a0_0:
* 2 [7:15] # #32229 / gv1__imp_verbe_groupe1__b2_a1_1:
S’il s’agit d’un impératif, pas de “s”.
> Suggestions : Raconte
* 3 [18:30] # #2411 / imp_verbes_composés_impératifs__b5_a0_0:
* 3 [18:30] # #2540 / g0__imp_verbes_composés_impératifs__b6_a1_1:
Ceci n’est pas une forme impérative correcte.
> Suggestions : Raconte-moi | Racontez-moi | Racontons-moi
> Suggestions : Raconte-moi | Racontons-moi | Racontez-moi
> URL: http://fr.wikipedia.org/wiki/Imp%C3%A9ratif_%28grammaire%29
* 5 [44:50] # #5890 / conj_xxxas_xxxes__sans_sujet__b4_a0_0:
* 5 [44:50] # #7943 / g2__conj_2s_sans_sujet_xxxas_xxxes__b4_a1_1:
Incohérence. Ceci est un verbe à la 2ᵉ personne du singulier. Sujet (“tu” ou “toi qui”)
introuvable.
> Suggestions : parle
* 6 [69:76] # #15600 / gn_det_pluriel_1m__b1_a0_0:
Accord de nombre erroné : « menteur » devrait être au pluriel.
* 6 [69:76] # #25212 / g3__gn_det_epi_plur_1m__b1_a1_1:
Accord de nombre erroné : « menteur » devrait être au pluriel.
> Suggestions : menteurs

Je suit sidéré par la brutales arrogance de cette homme-là. Quelle salopard ! Un escrocs de la pire
Je suit sidéré par la brutales arrogance de cette homme-là. Quelle salopard ! Un escrocs de la pire
^^^^ ^^^^^^^^ ^^^^^ ^^^^^^ ^^^^^^^
* 1 [3:7] # #5382 / conj_je__b2_a0_0:
* 1 [3:7] # #7285 / g2__conj_je__b2_a1_1:
Conjugaison erronée. Accord avec “Je”. Le verbe devrait être à la 1ʳᵉ personne du singulier.
> Suggestions : suis
* 2 [22:30] # #15039 / gn_la_1m__b2_a3_0:
Accord de nombre erroné : « brutales » devrait être au singulier.
* 2 [22:30] # #24254 / g3__gn_la_1m__b2_a4_1:
Accord de nombre erroné : « brutales » devrait être au singulier.
> Suggestions : brutale
* 3 [44:49] # #15359 / gn_cette_1m__b1_a0_0:
Accord de genre erroné : « homme » est masculin.
* 3 [44:49] # #24723 / g3__gn_cette_1m__b1_a1_1:
Accord de genre erroné : « homme » est masculin.
> Suggestions : ce | cet
* 4 [60:66] # #15796 / gn_quelle_1m__b1_a4_0:
Accord de genre erroné : « salopard » est masculin.
* 4 [60:66] # #25719 / g3__gn_quelle_1m__b1_a5_1:
Accord de genre erroné : « salopard » est masculin.
> Suggestions : Quel
* 5 [81:88] # #15224 / gn_un_1m__b1_a2_0:
Accord de nombre erroné : « escrocs » devrait être au singulier.
* 5 [81:88] # #24552 / g3__gn_un_1m__b2_a3_1:
Accord de nombre erroné : « escrocs » devrait être au singulier.
> Suggestions : escroc

espece.
°°°°°°
Quant sera t’il châtiés pour ses mensonge ? Merde ! J’en aie marre.
^^^^^ ^^^ ^^^^^^^ ^^^^^^^^ ^^^^^^^^^^^^^ ^^ ^^^
* 1 [0:5] # #9595 / conf_quand_quant_qu_en__b1_a0_0:
* 1 [0:5] # #13076 / g2__conf_quand_quant_qu_en__b1_a1_1:
Confusion. Quand = à quel moment. Quant à = à propos de.
> Suggestions : Quand
* 2 [10:13] # #1664s / tu_t_euphonique_incorrect:
* 2 [10:13] # #1667s / tu_t_euphonique_incorrect:
Pour le “t” euphonique, il faut deux traits d’union. Pas d’apostrophe. Pas d’espace.
> Suggestions : -t-
* 3 [16:23] # #21642 / ppas_inversion_être_il__b1_a0_0:
Accord avec le sujet “il” : “châtiés” devrait être au masculin singulier.
* 3 [16:23] # #30079 / gv1__ppas_3sg_mas_verbe_état__b5_a1_1:
Accord avec le sujet “il” : “châtiés” devrait être au masculin singulier.
> Suggestions : châtié
* 4 [33:41] # #15600 / gn_det_pluriel_1m__b1_a0_0:
Accord de nombre erroné : « mensonge » devrait être au pluriel.
* 4 [33:41] # #25212 / g3__gn_det_epi_plur_1m__b1_a1_1:
Accord de nombre erroné : « mensonge » devrait être au pluriel.
> Suggestions : mensonges
* 5 [43:56] # #376p / esp_milieu_ligne:
Espace(s) surnuméraire(s) à supprimer.
* 5 [43:56] # #368p / esp_milieu_ligne:
Espace·s surnuméraire·s à supprimer.
> Suggestions :
* 6 [61:63] # #1047p / nbsp_avant_double_ponctuation:
* 6 [61:63] # #1089p / nbsp_avant_double_ponctuation:
Il manque un espace insécable.
> Suggestions :  !
* 7 [69:72] # #25110 / vmode_sujet_indicatif__b2_a0_0:
* 7 [69:72] # #35024 / gv2__vmode_sujet_indicatif__b1_a1_1:
Ce verbe ne devrait pas être au subjonctif.
> Suggestions : ai | aurai | avais | eus
> Suggestions : ai | avais | eus | aurai

23 changes: 15 additions & 8 deletions extension.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
const vscode = require("vscode");
const { spawn } = require("child_process");
const path = require("path");

/**
* @param {vscode.ExtensionContext} context
Expand All @@ -8,14 +9,20 @@ function activate(context) {
let disposable = vscode.commands.registerCommand(
"grammalecte.run",
function () {
const grammalecte = spawn("python3", [
"grammalecte-cli.py",
"-f",
"demo/input-file/input.txt",
]);
grammalecte.stdout.on("data", (data) => {
vscode.window.showInformationMessage(`stdout: ${data}`);
});
const editor = vscode.window.activeTextEditor;
if (editor) {
const file = editor.document.uri.path;
const grammalecte = spawn("python3", [
context.asAbsolutePath("grammalecte-cli.py"),
"--json",
"--file",
file,
]);
grammalecte.stdout.on("data", (data) => {
const json = JSON.parse(data.toString());
console.log(json);
});
}
}
);

Expand Down
54 changes: 40 additions & 14 deletions grammalecte-cli.py
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,13 @@
import os.path
import argparse
import json
import itertools
import re
import traceback

import grammalecte
import grammalecte.text as txt
import grammalecte.graphspell.str_transform as strt
from grammalecte.graphspell.echo import echo


Expand All @@ -27,7 +29,8 @@
!word spelling suggestion
>word draw path of word in the word graph
=[filter1][=[filter2]] show entries which fit to filters (filter1 for word, filter2 for morphology)
$some_text show sentences and tokens of text
≠word|word|… show distance between words
$some_text show sentences and tokens of text
Other commands:
/help /h show this text
Expand Down Expand Up @@ -129,6 +132,10 @@ def getCommand ():

def main ():
"launch the CLI (command line interface)"
if sys.version_info < (3, 5):
print("Python 3.5+ required")
return

xParser = argparse.ArgumentParser()
xParser.add_argument("-f", "--file", help="parse file (UTF-8 required!) [on Windows, -f is similar to -ff]", type=str)
xParser.add_argument("-ff", "--file_to_file", help="parse file (UTF-8 required!) and create a result file (*.res.txt)", type=str)
Expand All @@ -153,7 +160,6 @@ def main ():

oGrammarChecker = grammalecte.GrammarChecker("fr")
oSpellChecker = oGrammarChecker.getSpellChecker()
oLexicographer = oGrammarChecker.getLexicographer()
oTextFormatter = oGrammarChecker.getTextFormatter()
if xArgs.personal_dict:
oJSON = loadDictionary(xArgs.personal_dict)
Expand Down Expand Up @@ -271,8 +277,10 @@ def main ():
for sWord in sText[1:].strip().split():
if sWord:
echo("* " + sWord)
for sMorph in oSpellChecker.getMorph(sWord):
echo(" {:<32} {}".format(sMorph, oLexicographer.formatTags(sMorph)))
for sElem, aRes in oSpellChecker.analyze(sWord):
echo(" - " + sElem)
for sMorph, sMeaning in aRes:
echo(" {:<40} {}".format(sMorph, sMeaning))
elif sText.startswith("!"):
for sWord in sText[1:].strip().split():
if sWord:
Expand All @@ -291,6 +299,11 @@ def main ():
sTagsPattern = ""
for aRes in oSpellChecker.select(sFlexPattern, sTagsPattern):
echo("{:<30} {:<30} {}".format(*aRes))
elif sText.startswith("≠"):
lWords = sText[1:].split("|")
for s1, s2 in itertools.combinations(lWords, 2):
nDist = strt.distanceDamerauLevenshtein(s1, s2)
print(f"{s1}{s2}: {nDist}")
elif sText.startswith("/o+ "):
oGrammarChecker.gce.setOptions({ opt:True for opt in sText[3:].strip().split() if opt in oGrammarChecker.gce.getOptions() })
echo("done")
Expand Down Expand Up @@ -329,18 +342,31 @@ def main ():
if xArgs.textformatter:
sParagraph = oTextFormatter.formatText(sParagraph)
lParagraphErrors, lSentences = oGrammarChecker.gce.parse(sParagraph, bDebug=xArgs.debug, bFullInfo=True)
echo(txt.getReadableErrors(lParagraphErrors, xArgs.width))
#echo(txt.getReadableErrors(lParagraphErrors, xArgs.width))
for dSentence in lSentences:
echo("{nStart}:{nEnd}".format(**dSentence))
echo(" <" + dSentence["sSentence"]+">")
for dToken in dSentence["lToken"]:
echo(" {0[nStart]:>3}:{0[nEnd]:<3} {1} {0[sType]:<14} {2} {0[sValue]:<16} {3:<10} {4}".format(dToken, \
"×" if dToken.get("bToRemove", False) else " ",
"!" if dToken["sType"] == "WORD" and not dToken.get("bValidToken", False) else " ",
" ".join(dToken.get("lMorph", "")), \
"·".join(dToken.get("aTags", "")) ) )
echo(txt.getReadableErrors(dSentence["lGrammarErrors"], xArgs.width))
echo("{nStart}:{nEnd} <{sSentence}>".format(**dSentence))
for dToken in dSentence["lTokens"]:
if dToken["sType"] == "INFO" or "bMerged" in dToken:
continue
echo(" {0[nStart]:>3}:{0[nEnd]:<3} {1} {0[sType]:<14} {2} {0[sValue]:<16} {3}".format(dToken, \
"×" if dToken.get("bToRemove", False) else " ",
"!" if dToken["sType"] == "WORD" and not dToken.get("bValidToken", False) else " ",
" ".join(dToken.get("aTags", "")) ) )
if "lMorph" in dToken:
for sMorph, sLabel in zip(dToken["lMorph"], dToken["aLabels"]):
echo(" {0:40} {1}".format(sMorph, sLabel))
if "lSubTokens" in dToken:
for dSubToken in dToken["lSubTokens"]:
if dSubToken["sValue"]:
echo(" · {0:20}".format(dSubToken["sValue"]))
for sMorph, sLabel in zip(dSubToken["lMorph"], dSubToken["aLabels"]):
echo(" {0:40} {1}".format(sMorph, sLabel))
#echo(txt.getReadableErrors(dSentence["lGrammarErrors"], xArgs.width))
else:
if sText.startswith("TEST: "):
sText = sText[6:]
sText = sText.replace("{{", "").replace("}}", "")
sText = re.sub(" ->> .*$", "", sText).rstrip()
for sParagraph in txt.getParagraph(sText):
if xArgs.textformatter:
sParagraph = oTextFormatter.formatText(sParagraph)
Expand Down
Loading

0 comments on commit 17fdaf7

Please sign in to comment.