Ce référentiel contient la boîte à outils d'annotation d'erreur grammaticale (errant) décrite dans:
Christopher Bryant, Mariano Felice et Ted Briscoe. 2017. Annotation automatique et évaluation des types d'erreur pour la correction d'erreur grammaticale . Dans les actes de la 55e réunion annuelle de l'Association de linguistique informatique (Volume 1: Papiers longs). Vancouver, Canada.
Mariano Felice, Christopher Bryant et Ted Briscoe. 2016. Extraction automatique des erreurs d'apprenant dans les phrases ESL à l'aide d'alignements améliorés linguistiquement . Dans les actes de Coling 2016, la 26e Conférence internationale sur la linguistique informatique: les articles techniques. Osaka, Japon.
Si vous utilisez ce code, veuillez citer les articles ci-dessus. Plus d'informations sur Errant peuvent être trouvées ici. En particulier, voir le chapitre 5 pour les définitions des types d'erreur.
Mise à jour - 09/12/23 : Vous pouvez maintenant essayer Errant dans notre démo en ligne!
L'objectif principal d'errant est d'annoter automatiquement les phrases en anglais parallèle avec des informations de type d'erreur. Plus précisément, étant donné une paire de phrases originale et corrigée, Errant extrait les modifications qui transforment les premières à la seconde et les classent en fonction d'un cadre de type d'erreur basé sur des règles. Cela peut être utilisé pour normaliser les ensembles de données parallèles ou faciliter l'évaluation du type d'erreur détaillé. Les fichiers de sortie annotés sont au format M2 et un script d'évaluation est fourni.
Original : Il s'agit d'une phrase gramamtique.
Corrigé : Il s'agit d'une phrase grammaticale.
Sortie M2 :
S c'est une phrase gramamtique.
A 1 2 ||| r: Verbe: Sva ||| est ||| requis ||| -None- ||| 0
A 2 2 ||| m: DET ||| A ||| Obligatoire ||| -None- ||| 0
A 2 3 ||| r: sort ||| Grammatical ||| requise ||| -None- ||| 0
A -1 -1 ||| NOOP ||| -NONE- ||| OBLIQUE ||| -NONE- ||| 1
Au format M2, une ligne précédée de S désigne une phrase originale tandis qu'une ligne précédée par A indique une annotation de modification. Chaque ligne d'édition se compose du décalage du jeton de démarrage et d'extrémité de l'édition, du type d'erreur et de la chaîne de correction de tokenisée. Les deux champs suivants sont inclus pour des raisons historiques (voir la tâche partagée CONLL-2014) tandis que le dernier champ est l'ID annotateur.
Une modification "NOOP" est un type spécial d'édition qui indique explicitement qu'un annotateur / système n'a apporté aucune modification à la phrase d'origine. S'il n'y a qu'un seul annotateur, les modifications du NOOP sont facultatives, sinon une modification de NOOP doit être incluse chaque fois que 1 annotateurs sur n sur n a considéré que la phrase d'origine est correcte. C'est quelque chose à savoir lors de la combinaison de fichiers M2 individuels, car les NOOP manquants peuvent affecter l'évaluation.
Le moyen le plus simple d'installer Errant et ses dépendances consiste à utiliser pip
. Nous vous recommandons également de l'installer dans un environnement virtuel propre (par exemple avec venv
). La dernière version d'errant ne prend en charge que Python> = 3,7.
python3 -m venv errant_env
source errant_env/bin/activate
pip install -U pip setuptools wheel
pip install errant
python3 -m spacy download en_core_web_sm
Cela créera et activera un nouvel environnement Python3 appelé errant_env
dans le répertoire actuel. pip
mettra ensuite à jour certains outils de configuration et installera le modèle anglais errant, spacy, rapide et spacy dans cet environnement. Vous pouvez désactiver l'environnement à tout moment en exécutant deactivate
, mais vous devez vous rappeler de l'activer à nouveau chaque fois que vous souhaitez utiliser Errant.
Errant V2.0.0 a été conçu pour être entièrement compatible avec la tâche partagée Bea-2019. Si vous souhaitez comparer directement les résultats de la tâche partagée, vous souhaiterez peut-être installer Errant v2.0.0 car les versions plus récentes peuvent produire des scores légèrement différents. Vous pouvez également utiliser le codalab pour évaluer de manière anonyme sur les ensembles de données de tâches partagées. Errant v2.0.0 n'est pas compatible avec Python> = 3,7.
pip install errant==2.0.0
Si vous préférez installer Errant à partir de Source, vous pouvez à la place exécuter les commandes suivantes:
git clone https://github.com/chrisjbryant/errant.git
cd errant
python3 -m venv errant_env
source errant_env/bin/activate
pip install -U pip setuptools wheel
pip install -e .
python3 -m spacy download en_core_web_sm
Cela clonera la source errante GitHub dans le répertoire actuel, construire et activer un environnement Python à l'intérieur, puis installer Errant et toutes ses dépendances. Si vous souhaitez modifier le code errant, c'est le moyen recommandé de l'installer.
Trois commandes principales sont fournies avec Errant: errant_parallel
, errant_m2
et errant_compare
. Vous pouvez les exécuter de n'importe où sur la ligne de commande sans avoir à invoquer un script Python spécifique.
errant_parallel
Il s'agit de la commande Annotation principale qui prend un fichier texte d'origine et au moins un fichier texte corrigé parallèle en entrée, et publie un fichier M2 annoté. Par défaut, il est supposé que les fichiers texte originaux et corrigés sont tokenisés par mot avec une phrase par ligne.
Exemple:
errant_parallel -orig <orig_file> -cor <cor_file1> [<cor_file2> ...] -out <out_m2>
errant_m2
Il s'agit d'une variante de errant_parallel
qui fonctionne sur un fichier M2 au lieu de fichiers texte parallèles. Cela facilite le retraitement des fichiers M2 existants. Vous devez également spécifier si vous souhaitez utiliser des modifications or ou automatique; IE -gold
ne classera que les modifications existantes, tandis que -auto
extrait et classera les modifications automatiques. Dans les deux paramètres, les modifications non corrigées et les NOOP sont préservés.
Exemple:
errant_m2 {-auto|-gold} m2_file -out <out_m2>
errant_compare
Il s'agit de la commande d'évaluation qui compare un fichier d'hypothèse M2 par rapport à un fichier M2 de référence. Le comportement par défaut évalue globalement l'hypothèse en termes de correction basée sur la portée. Le drapeau -cat {1,2,3}
peut être utilisé pour évaluer les types d'erreur à des niveaux croissants de granularité, tandis que le drapeau -ds
ou -dt
peut être utilisé pour évaluer en termes de détection basée sur une portée ou basée sur des jetons (c'est-à-dire ignorer la correction). Tous les scores sont présentés en termes de précision, de rappel et de score F (par défaut: F0.5) et les comptes pour les véritables positifs (TP), les faux positifs (FP) et les faux négatifs (FN) sont également indiqués.
Exemples:
errant_compare -hyp <hyp_m2> -ref <ref_m2>
errant_compare -hyp <hyp_m2> -ref <ref_m2> -cat {1,2,3}
errant_compare -hyp <hyp_m2> -ref <ref_m2> -ds
errant_compare -hyp <hyp_m2> -ref <ref_m2> -ds -cat {1,2,3}
Tous ces scripts ont également des options de ligne de commande avancées supplémentaires qui peuvent être affichées à l'aide de l'indicateur -h
.
Depuis la v2.0.0, Errant est désormais également livré avec une API.
import errant
annotator = errant.load('en')
orig = annotator.parse('This are gramamtical sentence .')
cor = annotator.parse('This is a grammatical sentence .')
edits = annotator.annotate(orig, cor)
for e in edits:
print(e.o_start, e.o_end, e.o_str, e.c_start, e.c_end, e.c_str, e.type)
errant
. chargement (Lang, NLP = aucun)
Créez un objet annotateur errant. Le paramètre lang
n'accepte actuellement que 'en'
pour l'anglais, mais nous espérons l'étendre à d'autres langues à l'avenir. Le paramètre nlp
en option peut être utilisé si vous avez déjà préchargé Spacy et que vous ne voulez pas que l'errant le charge à nouveau.
import errant
import spacy
nlp = spacy.load('en_core_web_sm') # Or en_core_web_X for other spacy models
annotator = errant.load('en', nlp)
Un objet annotateur est l'interface principale pour Errant.
annotator
. Parse (String, tokenise = false)
Lemmatiser, tag POS et analyser une chaîne de texte avec Spacy. Définissez tokenise
sur vrai à des tokenises de mots avec Spacy. Renvoie un objet Doc Spacy.
annotator
. aligner (orig, cor, lev = false)
Alignez le texte original et corrigé à spacy. La valeur par défaut utilise un alignement Damerau-Levenshtein linguistiquement amélioré, mais l'indicateur lev
peut être utilisé pour un alignement standard de Levenshtein. Renvoie un objet d'alignement.
annotator
. fusion (alignement, fusion = «règles»)
Extraire les modifications de l'alignement optimal dans un objet d'alignement. Quatre stratégies de fusion différentes sont disponibles:
Renvoie une liste d'objets d'édition.
annotator
. Classifier (éditer)
Classifier un édition. Définit l'attribut edit.type
dans un objet d'édition et renvoie le même objet d'édition.
annotator
. annoter (orig, cor, lev = false, fusion = 'règles')
Exécutez le pipeline d'annotation complet pour aligner deux séquences et extraire et classer les modifications. Équivalent à l'exécution annotator.align
, annotator.merge
et annotator.classify
en séquence. Renvoie une liste d'objets d'édition.
import errant
annotator = errant.load('en')
orig = annotator.parse('This are gramamtical sentence .')
cor = annotator.parse('This is a grammatical sentence .')
alignment = annotator.align(orig, cor)
edits = annotator.merge(alignment)
for e in edits:
e = annotator.classify(e)
annotator
. import_edit (orig, cor, edit, min = true, old_cat = false)
Chargez un objet Modifier à partir d'une liste. orig
et cor
doivent être des objets DOC payés par spacy et l'édition doit être de la forme: [o_start, o_end, c_start, c_end(, type)]
. Les valeurs doivent être des entiers qui correspondent aux décalages de démarrage et de fin du jeton dans les objets DOC originaux et corrigés. La valeur type
est une chaîne facultative qui désigne le type d'erreur de l'édition (si connu). Définissez min
sur true pour minimiser l'édition (par exemple [ab -> ac] = [b -> c]) et old_cat
sur true pour préserver l'ancienne catégorie de type d'erreur (c'est-à-dire désactiver le classificateur).
import errant
annotator = errant.load('en')
orig = annotator.parse('This are gramamtical sentence .')
cor = annotator.parse('This is a grammatical sentence .')
edit = [1, 2, 1, 2, 'SVA'] # are -> is
edit = annotator.import_edit(orig, cor, edit)
print(edit.to_m2())
Un objet d'alignement est créé à partir de deux séquences de texte à spalie.
alignment
. origine
alignment
. cor
Les séquences de texte originales et corrigées à spacy.
alignment
. cost_matrix
alignment
. OP_MATRIX
La matrice de coûts et la matrice d'opération produite par l'alignement.
alignment
. align_seq
Le premier alignement le moins cher entre les deux séquences.
Un objet d'édition représente une transformation entre deux séquences de texte.
edit
. o_start
edit
. o_end
edit
. O_TOKS
edit
. O_STR
Les décalages de début et de fin, les jetons spacy et la chaîne pour l'édition dans le texte d'origine .
edit
. c_start
edit
. c_end
edit
. c_toks
edit
. C_STR
Les décalages de début et de fin, les jetons spacy et la chaîne pour l'édition dans le texte corrigé .
edit
. taper
La chaîne de type d'erreur.
edit
. to_m2 (id = 0)
Formatez l'édition pour un fichier M2 de sortie. id
est l'ID d'annotateur.
Si vous souhaitez développer errant pour d'autres langues, vous devez imiter la structure errant/en
Directory. Par exemple, Errant pour le français devrait importer une fusion de errant.fr.merger
et un classificateur de errant.fr.classifier
qui ont respectivement classify
méthodes get_rule_edits
équivalentes. Vous devrez également ajouter 'fr'
à la liste des langues prises en charge dans errant/__init__.py
.
Si vous avez des questions, des suggestions ou des rapports de bogues, vous pouvez contacter les auteurs à:
Christopher D0T Bryant à cl.cam.ac.uk
Mariano D0T Felice à cl.cam.ac.uk