該存儲庫包含:
克里斯托弗·布萊恩特,馬里亞諾·費利斯和泰德·布里斯科。 2017。語法誤差校正的誤差類型的自動註釋和評估。在計算語言學協會第55屆年會論文集(第1卷:長論文)。加拿大溫哥華。
Mariano Felice,Christopher Bryant和Ted Briscoe。 2016。使用語言增強的對齊方式在ESL句子中自動提取學習者錯誤。在第26屆計算語言學國際會議上,2016年殖民論文集:技術論文。日本大阪。
如果您使用此代碼,請引用上述論文。有關錯誤的更多信息,請參見此處。特別是,有關錯誤類型的定義,請參見第5章。
更新-09/12/23 :您現在可以在我們的在線演示中嘗試錯誤!
錯誤的主要目的是使用錯誤類型信息自動註釋並行英語句子。具體而言,給定一個原始和更正的句子對,錯誤將提取將前者轉換為後者並根據基於規則的錯誤類型框架進行分類的編輯。這可用於標準化並行數據集或促進詳細的錯誤類型評估。註釋的輸出文件是M2格式,並提供了評估腳本。
原始:這是載詞。
更正:這是語法句子。
輸出M2 :
S這是載詞。
A 1 2 ||| R:動詞:SVA ||| IS |||需要||| -None- ||| 0
a 2 2 ||| m:det ||| a |||必需||| -none- ||| 0
a 2 3 ||| r:spell |||語法|||必需||| -none- ||| 0
a -1 -1 ||| noop ||| -none- |||必需||| -none- ||| 1
在M2格式中,一條線之前的s表示原始句子,而在一行之前,則表示編輯註釋。每個編輯行都由編輯,錯誤類型和令牌化校正字符串的開始和結束令牌偏移組成。由於歷史原因,包括下兩個字段(請參閱Conll-2014共享任務),而最後一個字段是註釋器ID。
“ noop”編輯是一種特殊的編輯,明確指示註釋器/系統對原始句子沒有任何更改。如果只有一個註釋者,則NOOP編輯是可選的,否則每當n個註釋者中至少有1個被認為是正確的句子是正確的,則應包括NOOP編輯。在組合單個M2文件時,這是值得注意的,因為缺失的NOOP會影響評估。
安裝錯誤及其依賴關係的最簡單方法是使用pip
。我們還建議將其安裝在乾淨的虛擬環境中(例如使用venv
)。最新版本的錯誤僅支持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
將更新一些設置工具,並在此環境中安裝錯誤,Spacy,RapidFuzz和Spacy的默認英語模型。您可以隨時停用將環境deactivate
,但必須記住,只要您想使用錯誤,就必須再次激活環境。
錯誤的v2.0.0被設計為與BEA-2019共享任務完全兼容。如果要直接將共享任務中的結果直接比較,則可能需要安裝錯誤的v2.0.0,因為較新版本可能會產生略有不同的分數。您還可以使用Codalab在共享任務數據集上匿名評估。錯誤的v2.0.0與python> = 3.7不兼容。
pip install errant==2.0.0
如果您希望從源安裝錯誤,則可以運行以下命令:
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錯誤源到當前目錄,在其中構建和激活python環境,然後安裝錯誤及其所有依賴項。如果您想修改錯誤的代碼,這是建議安裝它的推薦方法。
提供了三個主要命令,上面有錯誤: 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
將提取和分類自動編輯。在這兩種情況下,都保留了未校正的編輯和NOOP。
例子:
errant_m2 {-auto|-gold} m2_file -out <out_m2>
errant_compare
這是評估命令,將假設M2文件與參考M2文件進行比較。默認行為在基於跨度的校正方面評估了整個假設。 -cat {1,2,3}
標誌可用於評估粒度級別的錯誤類型,而-ds
或-dt
標誌可用於根據基於跨度或基於令牌的檢測來評估(IE)忽略更正)。所有分數均以精度,召回和F得分(默認值:F0.5)的形式呈現,並且還顯示了真實陽性(TP),誤報(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開始,現在錯誤的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)
創建一個錯誤的註釋對象。 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
。解析(字符串,tokenise = false)
lemmatise,pos標籤和解析帶有Spacy的文本字符串。將tokenise
設置為true也可以用Spacy單詞令牌。返回spacy doc對象。
annotator
。對齊(orig,cor,lev = false)
對齊具有Spacy的原始和更正的文本。默認值使用語言增強的Damerau-Levenshtein對齊方式,但lev
標誌可用於標準Levenshtein對齊。返回對齊對象。
annotator
。合併(對齊,合併='規則')
從對齊對像中的最佳對準中提取編輯。可以使用四種不同的合併策略:
返回編輯對象列表。
annotator
。分類(編輯)
對編輯進行分類。在編輯對像中設置edit.type
屬性,並返回相同的編輯對象。
annotator
。註釋(orig,cor,lev = false,合併='規則')
運行完整的註釋管道以對齊兩個序列,然後提取和對編輯進行分類。等效於運行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
值是一個可選的字符串,表示編輯的誤差類型(如果已知)。將min
設置為真實,以最大程度地減少編輯(例如[ab-> ac] = [b-> c])和old_cat
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())
一個對齊對像是由兩個具有Spacy縮放的文本序列創建的。
alignment
。原始alignment
。 Cor
Spacy優於原始和更正的文本序列。
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
在更正的文本中的開始和結尾偏移,spacy令牌以及編輯的字符串。
edit
。類型
錯誤類型字符串。
edit
。 to_m2 (id = 0)
格式化輸出M2文件的編輯。 id
是註釋器ID。
如果要為其他語言開發錯誤,則應模仿errant/en
目錄結構。例如,法語的錯誤應從errant.fr.merger
和errant.fr.classifier
的分類器導入合併,該分別具有等效的get_rule_edits
和classify
方法。您還需要將'fr'
添加到errant/__init__.py
中的支持語言列表中。
如果您有任何疑問,建議或錯誤報告,則可以通過以下方式與作者聯繫:
克里斯托弗·D0T布萊恩特(Cl.cam.ac.uk)
Mariano D0T Felice,cl.cam.ac.uk