พื้นที่เก็บข้อมูลนี้มีชุดเครื่องมือคำอธิบายประกอบข้อผิดพลาดทางไวยากรณ์ (Errant) ที่อธิบายไว้ใน:
Christopher Bryant, Mariano Felice และ Ted Briscoe 2017. คำอธิบายประกอบอัตโนมัติและการประเมินประเภทข้อผิดพลาดสำหรับการแก้ไขข้อผิดพลาดทางไวยากรณ์ ในการประชุมประจำปีครั้งที่ 55 ของสมาคมเพื่อการคำนวณภาษาศาสตร์ (เล่มที่ 1: เอกสารยาว) แวนคูเวอร์แคนาดา
Mariano Felice, Christopher Bryant และ Ted Briscoe 2016. การสกัดข้อผิดพลาดของผู้เรียนโดยอัตโนมัติในประโยค ESL โดยใช้การจัดตำแหน่งที่ปรับปรุงแล้วทางภาษา ในการดำเนินการของ Coling 2016 การประชุมนานาชาติครั้งที่ 26 เรื่องภาษาศาสตร์เชิงคำนวณ: เอกสารทางเทคนิค โอซาก้าญี่ปุ่น
หากคุณใช้รหัสนี้โปรดอ้างอิงเอกสารข้างต้น ข้อมูลเพิ่มเติมเกี่ยวกับ Errant สามารถพบได้ที่นี่ โดยเฉพาะอย่างยิ่งดูบทที่ 5 สำหรับคำจำกัดความของประเภทข้อผิดพลาด
อัปเดต - 09/12/23 : ตอนนี้คุณสามารถลองทำผิดพลาดในการสาธิตออนไลน์ของเรา!
เป้าหมายหลักของการทำผิดพลาดคือการใส่คำอธิบายประกอบประโยคภาษาอังกฤษแบบขนานโดยอัตโนมัติด้วยข้อมูลประเภทข้อผิดพลาด โดยเฉพาะอย่างยิ่งเมื่อได้รับคู่ประโยคดั้งเดิมและแก้ไข Errant จะแยกการแก้ไขที่เปลี่ยนอดีตเป็นหลังและจำแนกตามกรอบประเภทข้อผิดพลาดตามกฎ สิ่งนี้สามารถใช้เพื่อสร้างมาตรฐานชุดข้อมูลแบบขนานหรืออำนวยความสะดวกในการประเมินประเภทข้อผิดพลาดโดยละเอียด ไฟล์เอาต์พุตที่มีคำอธิบายประกอบอยู่ในรูปแบบ M2 และมีสคริปต์การประเมินผล
ต้นฉบับ : นี่คือประโยค gramamtical
แก้ไข : นี่คือประโยคไวยากรณ์
เอาท์พุท M2 :
นี่คือประโยค gramamtical
A 1 2 ||| r: คำกริยา: sva ||| คือ ||| จำเป็น ||| -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 หมายถึงประโยคดั้งเดิมในขณะที่บรรทัดนำหน้าด้วย A ระบุว่ามีคำอธิบายประกอบการแก้ไข แต่ละบรรทัดแก้ไขประกอบด้วยการชดเชยโทเค็นเริ่มต้นและสิ้นสุดของการแก้ไขประเภทข้อผิดพลาดและสตริงการแก้ไขโทเค็น สองฟิลด์ถัดไปจะรวมอยู่ด้วยเหตุผลทางประวัติศาสตร์ (ดูงานที่ใช้ร่วมกันของ Conll-2014) ในขณะที่ฟิลด์สุดท้ายคือ ID Annotator
การแก้ไข "Noop" เป็นการแก้ไขแบบพิเศษที่ระบุอย่างชัดเจนว่า Annotator/System ทำให้ไม่มีการเปลี่ยนแปลงประโยคดั้งเดิม หากมีคำอธิบายประกอบเพียงหนึ่งเดียวการแก้ไข Noop เป็นทางเลือกมิฉะนั้นควรมีการแก้ไข Noop เมื่อใดก็ตามอย่างน้อย 1 คนจาก N Annotators ถือว่าประโยคดั้งเดิมถูกต้อง นี่คือสิ่งที่ต้องระวังเมื่อรวมไฟล์ M2 แต่ละไฟล์เนื่องจาก Noops ที่ขาดหายไปอาจส่งผลกระทบต่อการประเมินผล
วิธีที่ง่ายที่สุดในการติดตั้ง 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
สิ่งนี้จะสร้างและเปิดใช้งานสภาพแวดล้อม Python3 ใหม่ที่เรียกว่า errant_env
ในไดเรกทอรีปัจจุบัน pip
จะอัปเดตเครื่องมือการตั้งค่าบางอย่างและติดตั้ง Errant, Spacy, Rapidfuzz และรุ่นภาษาอังกฤษเริ่มต้นของ Spacy ในสภาพแวดล้อมนี้ คุณสามารถปิดการใช้งานสภาพแวดล้อมได้ตลอดเวลาโดยใช้ deactivate
แต่ต้องจำไว้ว่าต้องเปิดใช้งานอีกครั้งเมื่อใดก็ตามที่คุณต้องการใช้ Errant
Errant v2.0.0 ได้รับการออกแบบให้เข้ากันได้อย่างสมบูรณ์กับงานที่ใช้ร่วมกัน BEA-2019 หากคุณต้องการเปรียบเทียบโดยตรงกับผลลัพธ์ในงานที่ใช้ร่วมกันคุณอาจต้องการติดตั้ง Errant v2.0.0 เนื่องจากเวอร์ชันใหม่อาจสร้างคะแนนที่แตกต่างกันเล็กน้อย คุณยังสามารถใช้ codalab เพื่อประเมินโดยไม่ระบุชื่อในชุดข้อมูลงานที่ใช้ร่วมกัน Errant 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 ลงในไดเรกทอรีปัจจุบันสร้างและเปิดใช้งานสภาพแวดล้อม Python ภายในจากนั้นติดตั้ง Errant และการพึ่งพาทั้งหมด หากคุณต้องการแก้ไขรหัสที่ผิดพลาดนี่เป็นวิธีที่แนะนำในการติดตั้ง
คำสั่งหลักสามคำมีให้กับ 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
นี่เป็นตัวแปรของ errant_parallel
ที่ทำงานบนไฟล์ M2 แทนไฟล์ข้อความแบบขนาน สิ่งนี้ทำให้ง่ายต่อการประมวลผลไฟล์ M2 ที่มีอยู่ใหม่ คุณต้องระบุว่าคุณต้องการใช้การแก้ไขทองคำหรืออัตโนมัติ IE -gold
จะจำแนกเฉพาะการแก้ไขที่มีอยู่ในขณะที่ -auto
จะแยกและจำแนกการแก้ไขอัตโนมัติ ในการตั้งค่าทั้งสองการแก้ไขที่ไม่ได้แก้ไขและ Noops จะได้รับการเก็บรักษาไว้
ตัวอย่าง:
errant_m2 {-auto|-gold} m2_file -out <out_m2>
errant_compare
นี่คือคำสั่งการประเมินผลที่เปรียบเทียบไฟล์สมมติฐาน M2 กับไฟล์อ้างอิง M2 พฤติกรรมเริ่มต้นประเมินสมมติฐานโดยรวมในแง่ของการแก้ไขตามระยะ สามารถใช้ธง -cat {1,2,3}
เพื่อประเมินประเภทข้อผิดพลาดในระดับที่เพิ่มขึ้นของระดับความละเอียดในขณะที่ -ds
หรือ -dt
Flag สามารถใช้ในการประเมินในแง่ของการตรวจจับตามระยะเวลาหรือโทเค็น (เช่น ไม่สนใจการแก้ไข) คะแนนทั้งหมดจะถูกนำเสนอในแง่ของความแม่นยำการเรียกคืนและคะแนน F (ค่าเริ่มต้น: F0.5) และนับสำหรับผลบวกจริง (TP), positives เท็จ (FP) และลบเชิงลบ (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 = none)
สร้างวัตถุ Annotator ที่ผิดพลาด ขณะนี้พารามิเตอร์ lang
ยอมรับ 'en'
สำหรับภาษาอังกฤษเท่านั้น แต่เราหวังว่าจะขยายมันสำหรับภาษาอื่น ๆ ในอนาคต สามารถใช้พารามิเตอร์ nlp
ที่เป็นตัวเลือกได้หากคุณได้ทำการบรรจุเครื่องงอไว้ล่วงหน้าแล้วและไม่ต้องการให้ Errant โหลดอีกครั้ง
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 เป็นอินเทอร์เฟซหลักสำหรับ Errant
annotator
แยกวิเคราะห์ (สตริงโทเค็น = เท็จ)
Lemmatise, POS TAG และวิเคราะห์สตริงข้อความด้วย Spacy ตั้งค่า tokenise
เป็นความจริงเพื่อเป็นคำพูดด้วยคำพูดกับ Spacy ส่งคืนวัตถุ Doc Spacy
annotator
จัดตำแหน่ง (orig, cor, lev = false)
จัดเรียงข้อความต้นฉบับและแก้ไข Spacy-parsed ค่าเริ่มต้นใช้การจัดตำแหน่ง Damerau-Levenshtein ที่ได้รับการปรับปรุงทางภาษา แต่สามารถใช้ธง lev
สำหรับการจัดตำแหน่ง levenshtein มาตรฐาน ส่งคืนวัตถุการจัดตำแหน่ง
annotator
ผสาน (การจัดตำแหน่ง, การรวม = 'กฎ')
แยกการแก้ไขจากการจัดตำแหน่งที่เหมาะสมในวัตถุการจัดตำแหน่ง มีกลยุทธ์การผสานที่แตกต่างกันสี่แบบ:
ส่งคืนรายการวัตถุแก้ไข
annotator
จัดประเภท (แก้ไข)
จำแนกการแก้ไข ตั้งค่าแอตทริบิวต์ edit.type
ในวัตถุแก้ไขและส่งคืนวัตถุแก้ไขเดียวกัน
annotator
คำอธิบายประกอบ (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, แก้ไข, min = true, old_cat = false)
โหลดวัตถุแก้ไขจากรายการ orig
และ cor
จะต้องเป็นวัตถุ DOC ที่มีพื้นที่ว่างและการแก้ไขจะต้องเป็นแบบฟอร์ม: [o_start, o_end, c_start, c_end(, type)]
ค่าจะต้องเป็นจำนวนเต็มที่สอดคล้องกับโทเค็นเริ่มต้นและสิ้นสุดการชดเชยในวัตถุ DOC ดั้งเดิมและแก้ไข ค่า type
เป็นสตริงเสริมที่แสดงถึงประเภทข้อผิดพลาดของการแก้ไข (ถ้าทราบ) ตั้ง min
ให้เป็นจริงเพื่อลดการแก้ไข (เช่น [ab -> ac] = [b -> c]) และ 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())
วัตถุการจัดตำแหน่งถูกสร้างขึ้นจากสองลำดับข้อความ Spacy-parsed
alignment
ต้นกำเนิด
alignment
คร.
ลำดับข้อความต้นฉบับและการแก้ไขของ Spacy-parsed
alignment
cost_matrix
alignment
op_matrix
เมทริกซ์ต้นทุนและเมทริกซ์การดำเนินงานที่ผลิตโดยการจัดตำแหน่ง
alignment
ALIGN_SEQ
การจัดตำแหน่งที่ถูกที่สุดครั้งแรกระหว่างสองลำดับ
วัตถุแก้ไขแสดงถึงการแปลงระหว่างสองลำดับข้อความ
edit
. O_START
edit
. o_end
edit
. o_toks
edit
. o_str
การเริ่มต้นและสิ้นสุดการชดเชยโทเค็น Spacy และสตริงสำหรับการแก้ไขในข้อความ ต้นฉบับ
edit
. c_start
edit
. c_end
edit
. c_toks
edit
. c_str
การเริ่มต้นและสิ้นสุดการชดเชยโทเค็นเครื่องรางและสตริงสำหรับการแก้ไขในข้อความ ที่แก้ไข
edit
. พิมพ์
สตริงประเภทข้อผิดพลาด
edit
. to_m2 (id = 0)
จัดรูปแบบการแก้ไขสำหรับไฟล์เอาต์พุต M2 id
คือรหัสคำอธิบายประกอบ
หากคุณต้องการพัฒนา errant สำหรับภาษาอื่นคุณควรเลียนแบบโครงสร้างไดเรกทอรี errant/en
ตัวอย่างเช่น Errant สำหรับภาษาฝรั่งเศสควรนำเข้าการควบรวมกิจการจาก errant.fr.merger
และตัวจําแนกจาก errant.fr.classifier
ที่ตามลำดับมีวิธีการที่เทียบเท่า get_rule_edits
และวิธี classify
คุณจะต้องเพิ่ม 'fr'
ในรายการภาษาที่รองรับใน errant/__init__.py
หากคุณมีคำถามข้อเสนอแนะหรือรายงานข้อผิดพลาดคุณสามารถติดต่อผู้เขียนได้ที่:
Christopher D0T Bryant ที่ cl.cam.ac.uk
Mariano D0T Felice ที่ Cl.cam.ac.uk