Dieses Repository enthält das in:
Christopher Bryant, Mariano Felice und Ted Briscoe. 2017. Automatische Annotation und Bewertung von Fehlertypen für die grammatikalische Fehlerkorrektur . In Proceedings der 55. Jahrestagung des Vereins für Computer -Linguistik (Band 1: Long Papers). Vancouver, Kanada.
Mariano Felice, Christopher Bryant und Ted Briscoe. 2016. Automatische Extraktion von Lernfehlern in ESL -Sätzen unter Verwendung sprachlich verbesserter Ausrichtungen . In Proceedings of Coling 2016, der 26. Internationalen Konferenz über Computerlinguistik: Technische Papiere. Osaka, Japan.
Wenn Sie diesen Code verwenden, zitieren Sie bitte die oben genannten Papiere. Weitere Informationen zu Fehler finden Sie hier. Insbesondere finden Sie Kapitel 5 für Definitionen von Fehlertypen.
UPDATE - 09/12/23 : Sie können jetzt Errant in unserer Online -Demo ausprobieren!
Das Hauptziel von Fehler ist es, parallele englische Sätze mit Fehlertypen automatisch zu kommentieren. Insbesondere wird ERRANT bei einem ursprünglichen und korrigierten Satzpaar die Änderungen extrahiert, die das erstere in letztere umwandeln und nach einem regelbasierten Fehlertyp-Framework klassifizieren. Dies kann verwendet werden, um parallele Datensätze zu standardisieren oder eine detaillierte Bewertung des Fehlertyps zu erleichtern. Annotierte Ausgabedateien befinden sich im M2 -Format und es wird ein Bewertungsskript bereitgestellt.
Original : Dies ist gramamtischer Satz.
Korrigiert : Dies ist ein grammatikalischer Satz.
Ausgabe M2 :
S Dies ist gramamtischer Satz.
A 1 2 ||| R: Verb: sva ||| ist ||| erforderlich ||| -none- ||| 0
A 2 2 ||| m: det ||| a ||| Erforderlich ||| -none- ||| 0
A 2 3 ||| R: Zauber ||| Grammatikal ||| Erforderlich ||| -none- ||| 0
A -1 -1 ||| Noop ||| -none- ||| Erforderlich ||| -none- ||| 1
Im M2 -Format bezeichnet eine Zeile, vor der S vorausgeht, einen ursprünglichen Satz, während eine Zeile, die eine Voraussetzung eines Bearbeitungsanmerkungss angibt, angibt. Jede Bearbeitungszeile besteht aus dem Start- und End -Token -Offset der Bearbeitung, des Fehlertyps und der tokenisierten Korrekturzeichenfolge. Die nächsten beiden Felder sind aus historischen Gründen enthalten (siehe die gemeinsame Aufgabe der CONLL-2014), während das letzte Feld die Annotator-ID ist.
Eine "NOOP" -Ed -Bearbeitung ist eine spezielle Art von Bearbeitung, die ausdrücklich einen Annotator/System angibt, der keine Änderungen am ursprünglichen Satz vorgenommen hat. Wenn es nur einen Annotator gibt, sind NOOP -Änderungen optional, da sonst eine Noop -Bearbeitung enthalten sein sollte, wenn mindestens 1 von N -Annotatoren den ursprünglichen Satz als korrekt angesehen wird. Dies ist etwas, das Sie bei der Kombination einzelner M2 -Dateien bewusst werden müssen, da fehlende Nießen die Bewertung beeinflussen können.
Der einfachste Weg, um Fehler und seine Abhängigkeiten zu installieren, ist die Verwendung von pip
. Wir empfehlen auch, es in einer sauberen virtuellen Umgebung zu installieren (z. B. mit venv
). Die neueste Version von Errant unterstützt nur 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
Dadurch werden im aktuellen Verzeichnis eine neue Python3 -Umgebung namens errant_env
erstellt und aktiviert. pip
aktualisiert dann einige Setup -Tools und installiert das Standard -Englischmodell von Fehler, Spact, Rapidfuzz und Spacy in dieser Umgebung. Sie können die Umgebung jederzeit deaktivieren, indem Sie deactivate
werden, müssen jedoch daran denken, sie erneut zu aktivieren, wann immer Sie Fehler verwenden möchten.
Der Fehler mit der Erranse V2.0.0 wurde so konzipiert, dass er mit der gemeinsam genutzten Aufgabe der Bea-2019 vollständig kompatibel ist. Wenn Sie direkt mit den Ergebnissen in der gemeinsamen Aufgabe vergleichen möchten, möchten Sie möglicherweise fehlerhafte v2.0.0 installieren, da neuere Versionen möglicherweise leicht unterschiedliche Punktzahlen erzielen. Sie können auch Codalab verwenden, um anonym auf den freigegebenen Aufgabendatensätzen zu bewerten. Fehler v2.0.0 ist nicht mit Python> = 3.7 kompatibel.
pip install errant==2.0.0
Wenn Sie es vorziehen, Fehler von der Quelle zu installieren, können Sie stattdessen die folgenden Befehle ausführen:
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
Dadurch wird die Github -Fehlerquelle in das aktuelle Verzeichnis geklon, erstellt und aktiviert eine Python -Umgebung darin und installiert dann Fehler und alle ihre Abhängigkeiten. Wenn Sie den Fehlercode ändern möchten, ist dies die empfohlene Möglichkeit, ihn zu installieren.
Drei Hauptbefehle werden mit Errant zur Verfügung gestellt: errant_parallel
, errant_m2
und errant_compare
. Sie können sie von überall in der Befehlszeile ausführen, ohne ein bestimmtes Python -Skript aufrufen zu müssen.
errant_parallel
Dies ist der Hauptbefehl für Annotation, der eine Originaltextdatei und mindestens eine parallel korrigierte Textdatei als Eingabe enthält und eine kommentierte M2 -Datei ausgibt. Standardmäßig wird angenommen, dass die ursprünglichen und korrigierten Textdateien mit einem Satz pro Zeile Word -tokenisiert werden.
Beispiel:
errant_parallel -orig <orig_file> -cor <cor_file1> [<cor_file2> ...] -out <out_m2>
errant_m2
Dies ist eine Variante von errant_parallel
, die in einer M2 -Datei anstelle paralleler Textdateien arbeitet. Dies erleichtert die Wiederaufbereitung vorhandener M2 -Dateien. Sie müssen auch angeben, ob Sie Gold- oder Auto -Änderungen verwenden möchten. IE -gold
klassifiziert nur die vorhandenen Änderungen, während -auto
automatische Änderungen extrahiert und klassifiziert. In beiden Einstellungen bleiben unkorrigierte Änderungen und Niespunkte erhalten.
Beispiel:
errant_m2 {-auto|-gold} m2_file -out <out_m2>
errant_compare
Dies ist der Bewertungsbefehl, der eine Hypothese M2 -Datei mit einer Referenz -M2 -Datei vergleicht. Das Standardverhalten bewertet die Hypothese insgesamt in Bezug auf spanbasierte Korrektur. Das Flag -cat {1,2,3}
kann verwendet werden, um Fehlertypen bei zunehmendem Granularitätsniveau zu bewerten, während das Flag -ds
oder -dt
-Flag zur Bewertung in Bezug auf Span -basierte oder tokenbasierte Erkennung verwendet werden kann (dh die Korrektur ignorieren). Alle Bewertungen werden in Bezug auf Präzision, Rückruf und F-Score (Standard: f0.5) dargestellt und zählt auch für wahre Positive (TP), falsch positive Aspekte (FP) und falsche Negative (FN).
Beispiele:
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}
Alle diese Skripte haben auch zusätzliche erweiterte Befehlszeilenoptionen, die mit dem Flag -h
angezeigt werden können.
Ab V2.0.0 kommt ERRANT nun auch mit einer 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 = keine)
Erstellen Sie ein fehlerhaftes Annotator -Objekt. Der lang
-Parameter akzeptiert derzeit nur 'en'
für Englisch, aber wir hoffen, ihn in Zukunft für andere Sprachen zu erweitern. Der optionale nlp
-Parameter kann verwendet werden, wenn Sie bereits Spaces vorgeladen haben und nicht möchten, dass er erneut lädt.
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)
Ein Annotator -Objekt ist die Hauptschnittstelle für ein Fehler.
annotator
. analysieren (String, Tokenise = False)
Lemmatise, POS -Tag und eine Textzeichenfolge mit Spacy analysieren. Setzen Sie tokenise
auf wahr auch Word -Tokenise mit Spacy. Gibt ein Spacy -DOC -Objekt zurück.
annotator
. Ausrichtung (orig, cor, lev = false)
Richten Sie den ursprünglichen und korrigierten Text mit Spacy-Par mit. Der Standard verwendet eine sprachlich verstärkte Damerau-Levenshtein-Ausrichtung, aber die lev
Flagge kann für eine Standard-Levenshtein-Ausrichtung verwendet werden. Gibt ein Ausrichtungsobjekt zurück.
annotator
. Zusammenführen (Ausrichtung, Zusammenführen = 'Regeln')
Extrahieren von Änderungen aus der optimalen Ausrichtung in einem Ausrichtungsobjekt. Vier verschiedene Zusammenführungsstrategien sind verfügbar:
Gibt eine Liste der Bearbeitungsobjekte zurück.
annotator
. klassifizieren (bearbeiten)
Klassifizieren Sie eine Bearbeitung. Legt das Attribut " edit.type
in ein Bearbeitungsobjekt fest und gibt dasselbe Bearbeitungsobjekt zurück.
annotator
. Annotate (orig, cor, lev = false, merging = 'Regeln')
Führen Sie die vollständige Annotationspipeline aus, um zwei Sequenzen auszurichten und die Änderungen zu extrahieren und zu klassifizieren. Äquivalent mit dem laufenden annotator.align
, annotator.merge
und annotator.classify
. Gibt eine Liste der Bearbeitungsobjekte zurück.
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, bearbeiten, min = true, old_cat = false)
Laden Sie ein Bearbeitungsobjekt aus einer Liste. orig
und cor
müssen doc-Objekte mit spacy-pariert werden, und die Bearbeitung muss aus dem Formular sein: [o_start, o_end, c_start, c_end(, type)]
. Die Werte müssen Ganzzahlen sein, die dem Token -Start- und End -Offsets in den ursprünglichen und korrigierten DOC -Objekten entsprechen. Der type
ist eine optionale Zeichenfolge, die den Fehlertyp der Bearbeitung bezeichnet (falls bekannt). Setzen Sie min
auf true, um die Bearbeitung (z. B. [ab -> ac] = [b -> c]) und old_cat
an true zu minimieren, um die Kategorie "Alte Fehlertyp" zu erhalten (dh den Klassifizierer ausschalten).
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())
Ein Ausrichtungsobjekt entsteht aus zwei Textesequenzen mit Spact-Parated.
alignment
. orig
alignment
. Korb
Die ursprünglichen und korrigierten Textsequenzen mit Spacton-Pared.
alignment
. cost_matrix
alignment
. op_matrix
Die Kostenmatrix und die Betriebsmatrix, die durch die Ausrichtung erzeugt wird.
alignment
. Align_seq
Die erste billigste Ausrichtung zwischen den beiden Sequenzen.
Ein Bearbeitungsobjekt repräsentiert eine Transformation zwischen zwei Textsequenzen.
edit
. o_start
edit
. o_end
edit
. o_toks
edit
. o_str
Die Start- und End -Offsets, die Spacy -Token und die Zeichenfolge für die Bearbeitung im Originaltext .
edit
. C_Start
edit
. C_end
edit
. c_toks
edit
. C_str
Die Start- und End -Offsets, die Spacy -Token und die Zeichenfolge für die Bearbeitung im korrigierten Text.
edit
. Typ
Die Fehlertyp -Zeichenfolge.
edit
. to_m2 (id = 0)
Formatieren Sie die Bearbeitung für eine Ausgabe -M2 -Datei. id
ist die Annotator -ID.
Wenn Sie für andere Sprachen ein Fehler entwickeln möchten, sollten Sie die errant/en
-Verzeichnisstruktur nachahmen. Zum Beispiel sollte Fehler für Französisch eine Fusion von errant.fr.merger
und einen Klassifizierer von errant.fr.classifier
importieren, der jeweils äquivalente get_rule_edits
und classify
Methoden aufweist. Sie müssen auch 'fr'
in die Liste der unterstützten Sprachen in errant/__init__.py
hinzufügen.
Wenn Sie Fragen, Vorschläge oder Fehlerberichte haben, können Sie die Autoren unter:
Christopher D0T Bryant bei Cl.Cam.ac.uk
Mariano d0t Felice bei Cl.Cam.ac.uk