이 저장소에는 다음에 설명 된 문법 오류 주석 툴킷 (Errant)이 포함되어 있습니다.
Christopher Bryant, Mariano Felice 및 Ted Briscoe. 2017. 문법 오류 수정에 대한 오류 유형의 자동 주석 및 평가 . 컴퓨터 언어 협회 협회의 제 55 차 연례 회의 (1 권 : 긴 논문)의 절차. 밴쿠버, 캐나다.
Mariano Felice, Christopher Bryant 및 Ted Briscoe. 2016. 언어 적으로 향상된 정렬을 사용하여 ESL 문장에서 학습자 오류의 자동 추출 . Coling 2016의 절차에서, 제 26 차 국제 계산 언어학 회의 : 기술 논문. 일본 오사카.
이 코드를 사용하는 경우 위의 논문을 인용하십시오. 잘못에 대한 자세한 내용은 여기를 참조하십시오. 특히 오류 유형의 정의는 5 장을 참조하십시오.
업데이트 -09/12/23 : 이제 온라인 데모에서 오류를 시도해 볼 수 있습니다!
오류의 주요 목표는 오류 유형 정보로 병렬 영어 문장에 자동으로 주석을 달아야합니다. 구체적으로, 원본과 수정 된 문장 쌍이 주어지면 Errant는 전자를 후자로 변환하는 편집물을 추출하여 규칙 기반 오류 유형 프레임 워크에 따라 분류합니다. 이를 사용하여 병렬 데이터 세트를 표준화하거나 상세한 오류 유형 평가를 용이하게하는 데 사용할 수 있습니다. 주석이 달린 출력 파일은 M2 형식이며 평가 스크립트가 제공됩니다.
원본 : 이것은 gramamtical 문장입니다.
수정 : 이것은 문법 문장입니다.
출력 M2 :
s 이것은 gramamtical 문장입니다.
a 1 2 ||| r : 동사 : sva ||| is ||| 필수 ||| -none- ||| 0
a 2 2 ||| m : det ||| a ||| 필수 ||| -none- ||| 0
a 2 3 ||| r : 주문 ||| 문법 ||| 필수 ||| -none- ||| 0
a -1 -1 ||| noop ||| -none- ||| 필수 ||| -none- ||| 1
m2 형식으로, s가 앞에있는 줄은 원래 문장을 나타내며, 선은 편집 주석을 나타냅니다. 각 편집 라인은 편집의 시작 및 엔드 토큰 오프셋, 오류 유형 및 토큰 화 된 수정 문자열로 구성됩니다. 다음 두 분야는 역사적 이유로 포함되어 있으며 (Conll-2014 공유 작업 참조) 마지막 필드는 주석자 ID입니다.
"Noop"편집은 주석/시스템이 원래 문장을 변경하지 않았음을 명시 적으로 나타내는 특별한 종류의 편집입니다. 주석이 하나만있는 경우 NOOP 편집은 선택 사항입니다. 그렇지 않으면 NOP 편집이 원래 문장을 올바르게 간주 할 때마다 NOOP 편집이 포함되어야합니다. 누락 된 노프가 평가에 영향을 줄 수 있기 때문에 개별 M2 파일을 결합 할 때 알아야 할 사항입니다.
Errant 및 그 종속성을 설치하는 가장 쉬운 방법은 pip
사용하는 것입니다. 또한 깨끗한 가상 환경 (예 : venv
)에 설치하는 것이 좋습니다. Errant의 최신 버전은 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
이렇게하면 현재 디렉토리에서 errant_env
라는 새로운 Python3 환경을 생성하고 활성화합니다. 그런 다음 pip
일부 설정 도구를 업데이트 하고이 환경에서 Errant, Spacy, RapidFuzz 및 Spacy의 기본 영어 모델을 설치합니다. deactivate
실행하여 언제든지 환경을 비활성화 할 수 있지만 Errant를 사용하려면 다시 활성화해야합니다.
Errant v2.0.0은 BEA-2019 공유 작업과 완전히 호환되도록 설계되었습니다. 공유 작업의 결과와 직접 비교하려면 최신 버전이 약간 다른 점수를 생성 할 수 있으므로 Errant v2.0.0을 설치할 수 있습니다. Codalab을 사용하여 공유 작업 데이터 세트에서 익명으로 평가할 수도 있습니다. 오류 v2.0.0은 Python> = 3.7과 호환되지 않습니다.
pip install errant==2.0.0
소스에서 Errant를 설치하려면 다음 명령을 실행할 수 있습니다.
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
이렇게하면 GitHub 오류 소스를 현재 디렉토리로 복제하고 내부에 파이썬 환경을 빌드 및 활성화 한 다음 Errant 및 모든 종속성을 설치하게됩니다. 오류 코드를 수정하려면 권장하는 방법입니다.
errant_parallel
, errant_m2
및 errant_compare
의 세 가지 주요 명령이 잘못되었습니다. 특정 Python 스크립트를 호출하지 않고도 명령 줄의 어느 곳에서나 실행할 수 있습니다.
errant_parallel
이것은 원본 텍스트 파일과 하나 이상의 병렬 수정 된 텍스트 파일을 입력으로 가져오고 주석이 달린 M2 파일을 출력하는 기본 주석 명령입니다. 기본적으로 원래 및 수정 된 텍스트 파일은 한 줄 당 하나의 문장으로 워드 토큰 화 된 것으로 가정합니다.
예:
errant_parallel -orig <orig_file> -cor <cor_file1> [<cor_file2> ...] -out <out_m2>
errant_m2
이것은 병렬 텍스트 파일 대신 M2 파일에서 작동하는 errant_parallel
의 변형입니다. 이를 통해 기존 M2 파일을보다 쉽게 재 처리 할 수 있습니다. 또한 금 또는 자동 편집을 사용할지 여부를 지정해야합니다. IE -gold
기존 편집 만 분류하는 반면 -auto
자동 편집을 추출하고 분류합니다. 두 설정 모두에서 수정되지 않은 편집 및 누프가 보존됩니다.
예:
errant_m2 {-auto|-gold} m2_file -out <out_m2>
errant_compare
이것은 가설 M2 파일을 참조 M2 파일과 비교하는 평가 명령입니다. 기본 동작은 스팬 기반 보정 측면에서 전체 가설을 평가합니다. -cat {1,2,3}
플래그는 상수 수준의 증가 수준에서 오류 유형을 평가하는 데 사용될 수 있으며, -ds
또는 -dt
플래그는 스팬 기반 또는 토큰 기반 감지 측면에서 평가하는 데 사용될 수 있습니다 (즉 수정 무시). 모든 점수는 정밀, 리콜 및 F- 점수 (기본값 : F0.5) 및 실제 긍정 (TP)에 대한 카운트, 오 탐지 (FP) 및 False Negatives (FN)에 대한 측면에서 제시됩니다.
예 :
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}
이 모든 스크립트에는 -h
플래그를 사용하여 표시 할 수있는 추가 고급 명령 줄 옵션도 있습니다.
v2.0.0 기준으로 Errant는 이제 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
. 로드 (lang, nlp = 없음)
잘못된 주석기 개체를 만듭니다. lang
매개 변수는 현재 영어에 대해서만 'en'
받아들이지만 앞으로 다른 언어를 위해 확장하기를 희망합니다. 이미 SPACY를 사전로드 한 상태에서 다시로드하는 것을 원하지 않는 경우 선택적 nlp
매개 변수를 사용할 수 있습니다.
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)
주석기 객체는 잘못된 주 인터페이스입니다.
annotator
. 구문 분석 (String, Tokenise = false)
Lemmatise, POS 태그 및 Spacy와 함께 텍스트 문자열을 구문 분석하십시오. Spacy와 함께 tokenise
도 Tokenise를 True로 설정하십시오. Spacy doc 객체를 반환합니다.
annotator
. 정렬 (Orig, Cor, lev = false)
스파크에 맞춰진 원본 및 수정 된 텍스트를 정렬합니다. 기본값은 언어 적으로 강화 된 Damerau-Levenshtein 정렬을 사용하지만 lev
플래그는 표준 Levenshtein 정렬에 사용할 수 있습니다. 정렬 객체를 반환합니다.
annotator
. 병합 (정렬, merging = '규칙')
정렬 객체의 최적 정렬에서 편집을 추출합니다. 4 가지 다른 병합 전략을 사용할 수 있습니다.
편집 객체 목록을 반환합니다.
annotator
. 분류 (편집)
편집을 분류하십시오. 편집 객체에서 edit.type
속성을 설정하고 동일한 편집 객체를 반환합니다.
annotator
. Annotate (Orig, cor, lev = false, merging = '규칙')
전체 주석 파이프 라인을 실행하여 두 시퀀스를 정렬하고 편집을 추출하고 분류하십시오. annotator.align
, annotator.merge
및 annotator.classify
실행하는 것과 동일합니다. 순서대로 분류하십시오. 편집 객체 목록을 반환합니다.
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)
목록에서 편집 객체를로드하십시오. orig
과 cor
스파크에 맞춰진 DOC 객체 여야하며 편집은 양식이어야합니다 : [o_start, o_end, c_start, c_end(, type)]
. 값은 원래 및 수정 된 DOC 객체의 토큰 시작 및 종료 오프셋에 해당하는 정수 여야합니다. type
값은 편집의 오류 유형을 나타내는 선택적 문자열입니다 (알려진 경우). 편집 (예 : [ab-> ac] = [b-> c]) 및 old_cat
최소화하려면 min
를 true로 설정하십시오. 이전 오류 유형 범주 (즉, 분류기를 끄는).
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())
정렬 객체는 두 개의 스파크에 맞춰진 텍스트 시퀀스에서 생성됩니다.
alignment
. 오리
alignment
. 코
스파크가 정한 원본 및 수정 된 텍스트 시퀀스.
alignment
. Cost_matrix
alignment
. op_matrix
정렬에 의해 생성 된 비용 매트릭스 및 작동 매트릭스.
alignment
. align_seq
두 시퀀스 사이의 첫 번째 가장 저렴한 정렬.
편집 객체는 두 텍스트 시퀀스 사이의 변환을 나타냅니다.
edit
. o_start
edit
. o_end
edit
. o_toks
edit
. o_str
시작 및 종료 오프셋, 스파이 토큰 및 원본 텍스트의 편집 문자열.
edit
. c_start
edit
. c_end
edit
. c_toks
edit
. c_str
시작 및 종료 오프셋, 스파이 토큰 및 수정 된 텍스트에서 편집을위한 문자열.
edit
. 유형
오류 유형 문자열.
edit
. to_m2 (id = 0)
출력 M2 파일의 편집 형식. id
는 주석자 ID입니다.
다른 언어에 대해 잘못된 것을 개발하려면 errant/en
디렉토리 구조를 모방해야합니다. 예를 들어, 프랑스어에 대한 errant는 errant.fr.merger
에서 합병을 가져 와서 errant.fr.classifier
에서 각각 동등한 get_rule_edits
갖고 메소드 classify
해야합니다. 또한 errant/__init__.py
의 지원되는 언어 목록에 'fr'
추가해야합니다.
질문, 제안 또는 버그 보고서가 있으면 저자에게 연락 할 수 있습니다.
Cl.cam.ac.uk의 Christopher D0T Bryant
cl.cam.ac.uk의 Mariano D0T Felice