该存储库包含:
克里斯托弗·布莱恩特,马里亚诺·费利斯和泰德·布里斯科。 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