Este repositorio contiene el kit de herramientas de anotación de errores gramaticales (errante) descrito en:
Christopher Bryant, Mariano Felice y Ted Briscoe. 2017. Anotación automática y evaluación de tipos de error para la corrección de errores gramaticales . En Actas de la 55ª Reunión Anual de la Asociación de Lingüística Computacional (Volumen 1: Documentos largos). Vancouver, Canadá.
Mariano Felice, Christopher Bryant y Ted Briscoe. 2016. Extracción automática de errores de alumno en oraciones ESL utilizando alineaciones lingüísticas mejoradas . En Proceedings of Coling 2016, la 26ª Conferencia Internacional sobre Lingüística Computacional: documentos técnicos. Osaka, Japón.
Si utiliza este código, cita los documentos anteriores. Puede encontrar más información sobre errante aquí. En particular, consulte el Capítulo 5 para ver las definiciones de los tipos de error.
Actualización - 12/09/23 : ¡Ahora puede probar Errant en nuestra demostración en línea!
El objetivo principal de errante es anotar automáticamente las oraciones en inglés paralelas con información de tipo de error. Específicamente, dado un par de oraciones original y corregido, Errant extraerá las ediciones que transforman las primeras en la segunda y las clasificarán de acuerdo con un marco de tipo de error basado en reglas. Esto se puede usar para estandarizar conjuntos de datos paralelos o facilitar la evaluación detallada del tipo de error. Los archivos de salida anotados están en formato M2 y se proporciona un script de evaluación.
Original : esta es una oración gramamtica.
Corregido : esta es una oración gramatical.
Salida M2 :
S Esta es una oración gramamtica.
A 1 2 ||| r: verbo: sva ||| es ||| requerido ||| -none- ||| 0
A 2 2 ||| M: Det ||| A ||| requerido ||| -none- ||| 0
A 2 3 ||| r: hechizo ||| gramatical ||| requerido ||| -none- ||| 0
A -1 -1 ||| NOOP ||| -NOne- ||| requerido ||| -none- ||| 1
En formato M2, una línea precedida por S denota una oración original, mientras que una línea precedida por A indica una anotación de edición. Cada línea de edición consiste en el desplazamiento de token de inicio y finalización de la edición, el tipo de error y la cadena de corrección tokenizada. Los siguientes dos campos se incluyen por razones históricas (ver la tarea compartida Conll-2014) mientras que el último campo es la identificación del anotador.
Una edición de "NOOP" es un tipo especial de edición que indica explícitamente que un anotador/sistema no realizó cambios en la oración original. Si solo hay un anotador, las ediciones de NOOP son opcionales, de lo contrario, se debe incluir una edición de NOOP siempre que al menos 1 de los anotadores considerara que la oración original es correcta. Esto es algo a tener en cuenta al combinar archivos M2 individuales, ya que la falta de NOO puede afectar la evaluación.
La forma más fácil de instalar errante y sus dependencias es usar pip
. También recomendamos instalarlo en un entorno virtual limpio (por ejemplo, con venv
). La última versión de Errant solo admite 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
Esto creará y activará un nuevo entorno Python3 llamado errant_env
en el directorio actual. pip
actualizará algunas herramientas de configuración e instalará el modelo de inglés predeterminado errante, de Spacy, RapidFuzz y Spacy en este entorno. Puede desactivar el entorno en cualquier momento ejecutando deactivate
, pero debe recordar activarlo nuevamente cada vez que desee usar Errant.
Errant v2.0.0 fue diseñado para ser totalmente compatible con la tarea compartida BEA-2019. Si desea comparar directamente con los resultados en la tarea compartida, es posible que desee instalar V2.0.0 errante, ya que las versiones más nuevas pueden producir puntajes ligeramente diferentes. También puede usar Codalab para evaluar de forma anónima en los conjuntos de datos de tareas compartidas. Errant v2.0.0 no es compatible con Python> = 3.7.
pip install errant==2.0.0
Si prefiere instalar Errant desde la fuente, en su lugar puede ejecutar los siguientes comandos:
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
Esto clonará la fuente errante de GitHub en el directorio actual, construirá y activará un entorno Python dentro de él, y luego instalará errante y todas sus dependencias. Si desea modificar el código errante, esta es la forma recomendada de instalarlo.
Tres comandos principales se proporcionan con Errant: errant_parallel
, errant_m2
y errant_compare
. Puede ejecutarlos desde cualquier lugar de la línea de comando sin tener que invocar un script de Python específico.
errant_parallel
Este es el comando de anotación principal que toma un archivo de texto original y al menos un archivo de texto corregido paralelo como entrada, y genera un archivo M2 anotado. Por defecto, se supone que los archivos de texto originales y corregidos están tokenizados por Word con una oración por línea.
Ejemplo:
errant_parallel -orig <orig_file> -cor <cor_file1> [<cor_file2> ...] -out <out_m2>
errant_m2
Esta es una variante de errant_parallel
que funciona en un archivo M2 en lugar de archivos de texto paralelos. Esto hace que sea más fácil reprocesar los archivos M2 existentes. También debe especificar si desea usar ediciones de oro o automáticamente; IE -gold
solo clasificará las ediciones existentes, mientras que -auto
extraerá y clasificará las ediciones automáticas. En ambos entornos, se conservan ediciones no corregidas y NOOP.
Ejemplo:
errant_m2 {-auto|-gold} m2_file -out <out_m2>
errant_compare
Este es el comando de evaluación que compara un archivo M2 de hipótesis con un archivo M2 de referencia. El comportamiento predeterminado evalúa la hipótesis en general en términos de corrección basada en el tramo. El indicador -cat {1,2,3}
se puede utilizar para evaluar los tipos de errores a niveles crecientes de granularidad, mientras que el indicador -ds
o -dt
se puede usar para evaluar en términos de detección basada en el tramo o token (es decir, ignorando la corrección). Todos los puntajes se presentan en términos de precisión, recuperación y puntaje F (predeterminado: f0.5), y cuenta para los verdaderos positivos (TP), falsos positivos (FP) y falsos negativos (FN).
Ejemplos:
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}
Todos estos scripts también tienen opciones de línea de comandos avanzadas adicionales que se pueden mostrar utilizando el indicador -h
.
A partir de V2.0.0, Errant ahora también viene con una 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
. Load (Lang, NLP = Ninguno)
Crear un objeto anotador errante. El parámetro lang
actualmente solo acepta 'en'
para el inglés, pero esperamos extenderlo para otros idiomas en el futuro. El parámetro nlp
opcional se puede usar si ya ha precargado Spacy y no quiere que Errant lo cargue nuevamente.
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 objeto anotador es la interfaz principal para errante.
annotator
. Parse (String, Tokenise = False)
Lemmatizar, etiqueta POS y analizar una cadena de texto con Spacy. Establezca tokenise
en verdad a también la palabra tokenise con Spacy. Devuelve un objeto Doc Spacy.
annotator
. alinearse (orig, cor, lev = false)
Alinee el texto original y corregido de Spacy-Parsed. El valor predeterminado utiliza una alineación de Damerau-Levenshtein de Damerau-Levenshtein mejorada, pero el indicador lev
se puede usar para una alineación de Levenshtein estándar. Devuelve un objeto de alineación.
annotator
. fusionar (alineación, fusión = 'reglas')
Extraiga ediciones de la alineación óptima en un objeto de alineación. Hay cuatro estrategias de fusión diferentes disponibles:
Devuelve una lista de objetos de edición.
annotator
. Clasificar (editar)
Clasificar una edición. Establece el atributo edit.type
en un objeto Editar y devuelve el mismo objeto Editar.
annotator
. anotar (orig, cor, lev = false, fusion = 'reglas')
Ejecute la tubería de anotación completa para alinear dos secuencias y extraer y clasificar las ediciones. Equivalente a la ejecución annotator.align
, annotator.merge
y annotator.classify
en secuencia. Devuelve una lista de objetos de edición.
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, editar, min = true, old_cat = false)
Cargue un objeto Editar desde una lista. orig
y cor
deben ser objetos DOC con espacios espacios y la edición debe ser de la forma: [o_start, o_end, c_start, c_end(, type)]
. Los valores deben ser enteros que correspondan a las compensaciones de inicio y finalización del token en los objetos DOC originales y corregidos. El valor type
es una cadena opcional que denota el tipo de error de la edición (si se conoce). Establezca min
en verdadero para minimizar la edición (p. old_cat
.
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())
Se crea un objeto de alineación a partir de dos secuencias de texto paradas en Spacy.
alignment
. oriente
alignment
. corre
Las secuencias de texto originales y corregidas de Spacy-Parsed.
alignment
. cost_matrix
alignment
. op_matrix
La matriz de costos y la matriz de operación producida por la alineación.
alignment
. alinearse_seq
La primera alineación más barata entre las dos secuencias.
Un objeto de edición representa una transformación entre dos secuencias de texto.
edit
. o_
edit
. hacer
edit
. O_TOKS
edit
. O_STR
Las compensaciones de inicio y finalización, los tokens espacios y la cadena para la edición en el texto original .
edit
. C_Start
edit
. c_end
edit
. C_TOKS
edit
. C_STR
Las compensaciones de inicio y finalización, los tokens espacios y la cadena para la edición en el texto corregido .
edit
. tipo
La cadena de tipo de error.
edit
. to_m2 (id = 0)
Formatear la edición para un archivo de salida M2. id
es la identificación del anotador.
Si desea desarrollar errante para otros idiomas, debe imitar la estructura de directorio errant/en
. Por ejemplo, Errant for French debería importar una fusión de errant.fr.merger
y un clasificador de errant.fr.classifier
que respectivamente tiene métodos equivalentes get_rule_edits
y classify
. También deberá agregar 'fr'
a la lista de idiomas compatibles en errant/__init__.py
.
Si tiene alguna pregunta, sugerencia o informes de errores, puede comunicarse con los autores en:
Christopher D0t Bryant en cl.cam.ac.uk
Mariano D0t Felice en cl.cam.ac.uk