Este repositório contém o kit de ferramentas de anotação de erro gramatical (errante) descrito em:
Christopher Bryant, Mariano Felice e Ted Briscoe. 2017. Anotação e avaliação automáticas dos tipos de erro para correção de erro gramatical . Em Anais da 55ª Reunião Anual da Associação de Linguística Computacional (Volume 1: Long Papers). Vancouver, Canadá.
Mariano Felice, Christopher Bryant e Ted Briscoe. 2016. Extração automática de erros do aluno em frases de ESL usando alinhamentos linguisticamente aprimorados . Em Proceedings of Coling 2016, a 26ª Conferência Internacional sobre Linguística Computacional: Trabalhos Técnicos. Osaka, Japão.
Se você usar esse código, cite os papéis acima. Mais informações sobre Errant podem ser encontradas aqui. Em particular, consulte o Capítulo 5 para obter definições de tipos de erro.
ATUALIZAÇÃO - 12/09/23 : Agora você pode experimentar erragem em nossa demonstração on -line!
O principal objetivo do erro é anotar automaticamente frases em inglês paralelas com informações do tipo de erro. Especificamente, dado um par original e corrigido de frases, Errant extrairá as edições que transformam o primeiro para o último e as classificarão de acordo com uma estrutura de tipo de erro baseada em regras. Isso pode ser usado para padronizar conjuntos de dados paralelos ou facilitar a avaliação detalhada do tipo de erro. Os arquivos de saída anotados estão no formato M2 e um script de avaliação é fornecido.
ORIGINAL : Esta é uma frase gramamtical.
Corrigido : Esta é uma frase gramatical.
Saída M2 :
S Esta é uma frase gramamtical.
A 1 2 ||| R: Verbo: SVA ||| é ||| Necessário ||| -None- ||| 0
A 2 2 ||| m: det ||| a ||| requerido ||| -None- ||| 0
A 2 3 ||| r: feitiço ||| gramatical ||| exigido ||| -None- ||| 0
A -1 -1 ||| NOOP ||| -NONE- ||| Necessário ||| -None- ||| 1
No formato M2, uma linha precedida por S indica uma frase original, enquanto uma linha precedida por um indica uma anotação de edição. Cada linha de edição consiste no deslocamento inicial e final do token da edição, o tipo de erro e a sequência de correção tokenizada. Os próximos dois campos estão incluídos por razões históricas (consulte a tarefa compartilhada da CONLL-2014) enquanto o último campo é o ID do anotador.
Uma edição "Noop" é um tipo especial de edição que indica explicitamente que um anotador/sistema não fez alterações na frase original. Se houver apenas um anotador, as edições NOOP serão opcionais; caso contrário, uma edição de noop deve ser incluída sempre que pelo menos 1 dos n anotadores considerou a frase original correta. Isso é algo a estar ciente ao combinar arquivos M2 individuais, pois a falta de NoOPS pode afetar a avaliação.
A maneira mais fácil de instalar Errant e suas dependências é usar pip
. Também recomendamos instalá -lo em um ambiente virtual limpo (por exemplo, com venv
). A versão mais recente do Errant suporta apenas 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
Isso criará e ativará um novo ambiente Python3 chamado errant_env
no diretório atual. pip
atualizará algumas ferramentas de configuração e instalará o modelo em inglês errante, espacial, Rapidfuzz e Spacy nesse ambiente. Você pode desativar o ambiente a qualquer momento executando deactivate
, mas deve lembrar -se de ativá -lo novamente sempre que quiser usar erra.
Errant v2.0.0 foi projetado para ser totalmente compatível com a tarefa compartilhada BEA-2019. Se você deseja comparar diretamente com os resultados na tarefa compartilhada, pode instalar o Errant V2.0.0, pois as versões mais recentes podem produzir pontuações ligeiramente diferentes. Você também pode usar o Codalab para avaliar anonimamente os conjuntos de dados de tarefas compartilhados. Errant v2.0.0 não é compatível com python> = 3.7.
pip install errant==2.0.0
Se você preferir instalar erra a partir da fonte, poderá executar os seguintes 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
Isso clonará a fonte errante do Github no diretório atual, criará e ativará um ambiente Python dentro dele e instalará erra e todas as suas dependências. Se você deseja modificar o código errante, esta é a maneira recomendada de instalá -lo.
Três comandos principais são fornecidos com Errant: errant_parallel
, errant_m2
e errant_compare
. Você pode executá -los de qualquer lugar na linha de comando sem precisar invocar um script python específico.
errant_parallel
Este é o comando principal de anotação que pega um arquivo de texto original e pelo menos um arquivo de texto corrigido paralelo como entrada, e produz um arquivo M2 anotado. Por padrão, supõe -se que os arquivos de texto originais e corrigidos sejam tokenizados com uma frase por linha.
Exemplo:
errant_parallel -orig <orig_file> -cor <cor_file1> [<cor_file2> ...] -out <out_m2>
errant_m2
Esta é uma variante de errant_parallel
que opera em um arquivo M2 em vez de arquivos de texto paralelos. Isso facilita a reprocissão de arquivos M2 existentes. Você também deve especificar se deseja usar edições de ouro ou automóveis; O IE -gold
classificará apenas as edições existentes, enquanto -auto
extrairá e classificará edições automáticas. Em ambas as configurações, edições não corrigidas e NoOPs são preservadas.
Exemplo:
errant_m2 {-auto|-gold} m2_file -out <out_m2>
errant_compare
Este é o comando de avaliação que compara um arquivo M2 Hipótese com um arquivo M2 de referência. O comportamento padrão avalia a hipótese geral em termos de correção baseada em span. O sinalizador -cat {1,2,3}
pode ser usado para avaliar os tipos de erro em níveis crescentes de granularidade, enquanto o sinalizador -ds
ou -dt
pode ser usado para avaliar em termos de detecção baseada em span ou baseada em token (ou seja, ignorando a correção). Todas as pontuações são apresentadas em termos de precisão, recall e escore F (padrão: F0.5) e contagens para verdadeiros positivos (TP), falsos positivos (FP) e falsos negativos (FN) também são mostrados.
Exemplos:
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 esses scripts também possuem opções adicionais de linha de comando avançadas que podem ser exibidas usando o sinalizador -h
.
A partir da v2.0.0, o Errant agora também vem com uma 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
. Carga (Lang, NLP = Nenhum)
Crie um objeto de anotador errante. O parâmetro lang
atualmente aceita apenas 'en'
para o inglês, mas esperamos estendê -lo para outros idiomas no futuro. O parâmetro nlp
opcional pode ser usado se você já tiver pré -carregado o Spacy e não quiser carregá -lo novamente.
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)
Um objeto anotador é a principal interface para erra.
annotator
. parse (string, tokenise = false)
Lematize, tag POS e analise uma sequência de texto com spacy. Defina tokenise
como True to também tokenise com spacy. Retorna um objeto Spacy Doc.
annotator
. alinhe (orig, cor, Lev = falso)
Alinhe o texto original e corrigido de alinhamento de spacy. O padrão usa um alinhamento de Damerau-Levenshtein, de Damerau-Levenshtein, mas o sinalizador de lev
pode ser usado para um alinhamento padrão de Levenshtein. Retorna um objeto de alinhamento.
annotator
. mesclar (alinhamento, mesclagem = 'regras')
Extrair edições do alinhamento ideal em um objeto de alinhamento. Quatro estratégias diferentes de fusão estão disponíveis:
Retorna uma lista de objetos de edição.
annotator
. classificar (editar)
Classifique uma edição. Define o atributo edit.type
em um objeto de edição e retorna o mesmo objeto de edição.
annotator
. anote (orig, cor, Lev = falso, mesclagem = 'regras')
Execute o pipeline de anotação completo para alinhar duas seqüências e extrair e classificar as edições. Equivalente a execução annotator.align
, annotator.merge
e annotator.classify
na sequência. Retorna uma lista de objetos de edição.
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)
Carregue um objeto de edição de uma lista. orig
e cor
devem ser objetos de documentos de spacy e a edição devem ser do formulário: [o_start, o_end, c_start, c_end(, type)]
. Os valores devem ser números inteiros que correspondem aos compensações de início e final do token nos objetos do DOC original e corrigido. O valor type
é uma string opcional que denota o tipo de erro da edição (se conhecida). Defina min
como true para minimizar a edição (por exemplo, [ab -> ac] = [b -> c]) e old_cat
para true para preservar a categoria antiga do tipo de erro (ou seja, desative o classificador).
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())
Um objeto de alinhamento é criado a partir de duas seqüências de texto parecidas com spacy.
alignment
. orig
alignment
. cor
As sequências de texto originais e corrigidas abrigadas.
alignment
. Cost_Matrix
alignment
. op_matrix
A matriz de custos e a matriz de operação produzidas pelo alinhamento.
alignment
. align_seq
O primeiro alinhamento mais barato entre as duas seqüências.
Um objeto de edição representa uma transformação entre duas sequências de texto.
edit
. o_start
edit
. O_END
edit
. O_TOKS
edit
. O_STR
Os compensações de início e final, os tokens spacy e a corda para a edição no texto original .
edit
. c_start
edit
. c_end
edit
. c_toks
edit
. c_str
Os compensações de início e final, os tokens de spacy e a corda para a edição no texto corrigido .
edit
. tipo
A sequência de tipos de erro.
edit
. to_m2 (id = 0)
Formate a edição para um arquivo M2 de saída. id
é o ID do Annotator.
Se você deseja desenvolver erros para outros idiomas, deve imitar a estrutura errant/en
estrutura do diretório. Por get_rule_edits
, errantes para errant.fr.classifier
francês deve importar uma fusão classify
errant.fr.merger
. Você também precisará adicionar 'fr'
à lista de idiomas suportados no errant/__init__.py
.
Se você tiver alguma dúvida, sugestão ou relatórios de bugs, entre em contato com os autores em:
Christopher D0T Bryant em cl.cam.ac.uk
Mariano D0T Felice em cl.cam.ac.uk