Chinese-Error-Checking

This is my first attempt in the direction of nlp,it is dedicated to complete a Chinese error detection!


SOTA模型总结

  • Soft-Masked BERT
动机 BERT模型没有足够的检测错误发生位置的能力;
模型架构 利用BiLSTM网络检测错误发生概率,并将其作为[MASK]权重对BERT输入序列进行遮蔽;
训练数据集 实验抓取了500w新闻标题首先进行BERT微调,之后使用SIGHAN数据微调;(与下面两个的数据集不同)
优、缺点分析 Soft-Masked模型提出了一种软遮蔽的框架,利用检错模型提高BERT-base纠错的精确率、具有一定的防止过纠的能力。其缺点在于首先是这种模型仍未引入音、形约束,依旧依赖于BERT对语义的建模进行纠错,容易错纠或过纠;其次,我认为其仅依赖于BERT_嵌入进行纠错的计算,模型过于简单。
  • SpellGCN
动机 对BERT纠错结果引入字音、字形的约束;
模型架构 首先利用BERT模型对输入进行语义抽取,对BERT模型的编码结果经过全连接层以预测正确字符,其中全连接层权重由两部分组成:原始的BERT嵌入矩阵、以及经过GCN网络在混淆集上生成的新的字符嵌入向量矩阵;
训练数据集 使用了Wang等人提出的28w增强数据,整合SIGHAN数据后进行模型的训练,其中28w增强数据极大地提高了训练集中错误case在测试集中的覆盖率;
优、缺点分析 SpellGCN利用在混淆集构建的交互图上对字符嵌入进行卷积,使得最终预测字符时语义不是唯一的参考信息,同时还考虑了候选与错字之间的音形相似信息;其缺点我认为SpellGCN仍没有针对连续性出错样例的有效方案,因此此类错误应同样为SpellGCN的弱点,此外,混淆集在测试集上的覆盖率也会影响模型的最终性能。
  • HeadFilt
动机 固定的混淆集无法应对一些新出现的错误对以及一些极少出现的错误对;
模型架构 模型分为两个部分,第一个组件是基于预训练模型的Seq2Seq模型,用以完成纠错的主要任务,第二部分是基于分层字符嵌入的自适应过滤器(HeadFilt),用于处理纠错模型产生的基于语义的过纠或错纠行为,即把字音、字形信息添加到纠错的约束中;
训练数据集 HeadFilt论文中有两种指标,一种是直接在原始的繁体文本上进行的训练,且没有增强语料;另一种为了与SpellGCN对比,采取了与其相同的预处理,包括转化为简体,并利用28w增强语料。下面列的结果是采取了相同语料下的对比。
缺点分析 HeadFilt的优点在于,一是它抛弃了混淆集的限制,使得模型能够在领域间进行更好地迁移,此外,我认为利用TreeLSTM对字符进行建模之后再进行相似度的计算,比SpellGCN更加直观,且过滤模型也能够更加有效的融合相似度知识。根据十一硬过滤模型的实现结果,预想到HeadFilt具有如下的缺点:首先,单纯增加后处理过滤模型对模型的召回率没有帮助,甚至存在负影响,如果能够探索方案降低其对召回的影响,(如增加检错模型),可能会存在性能提升,此外,当前的模型依旧没有有效的针对连续性出错样例的解决方案。
  • 思考 : 当前的模型均是在Bert-base的基础上,通过引入更多的语言学特征提升性能,其中一方面是增加检错能力,另一方面是引入字音、形约束,这两点的目的均在于Bert-base纠错时仅从预训练的语料规律出发,容易在SIGHAN测试集上产生过纠行为,通过上述两种方式,可以限制Bert-base的纠错能力,并使纠错结果收敛到相近的字音、字形下。

    当前模型的一个通用弱点在于均无针对Bert-base模型在连续型出错时性能较差的优化方案。当出现连续型出错时,错误的上下文将影响Bert模型对当前字符的预测。十一期间完善了之前预想的“递归预测”策略的实验设置,在融合了混淆集硬过滤后处理模块后,目前在15年的数据集上超过了最新的SOTA,具体的结果将在周末整理出来。

模型结果对比:





阶段性工作计划梳理及时间表
任务进度回顾:
  1. 之前跟随SpellGCN的实验设置,搭建出的基于BERT的baseline模型,在SIGHAN2015的数据集上,达到了F1值73.8,与论文中相似。SpellGCN模型复现仍尚有一些todos,但应该很快就能填充完。
  2. 根据baseline的错误分析,发现了一些baseline的弱项,包括连续性出错、指代出错、结构助词‘de’的混用。之前的优化思路包括:递归预测、语法规则过滤器,特定类型的数据增强。其中,递归预测进行了一些简单实验,效果不佳。
未来方向思路:

之前认为BERT-base模型的弱点在于不擅长错误检测以及未考虑音、形约束上。通过CGED比赛中积累的模型经验,以及对新的SOTA文章的阅读,认识到现有的模型依然局限于BERT-base框架,对较多的优质的语言学特征并未尝试引入。且我们之前的工作也没有尝试新SOTA中使用的后处理过滤机制,因此当前产生了一些新的优化思路,包括:

  • 之前也考虑过在检错模型中引入POS等信息,但是当时没有好的引入思路,CGED比赛的模型跟这个可以适配,因此可以考虑迭代一版CGED式的纠错模型,用于限制BERT模型过纠。
  • 音、形约束也可通过后处理机制融入,如新SOTA的过滤手段,因此想先加个硬过滤,查看一下对性能的影响。
  • 现有的模型依然没有针对连续型出错的有效解决方案,因此针对该问题的优化也应当为模型设计的一个重点。但当前没有相处特别有效的方案。
简易时间表:

上周已经起步了一些后过滤实验的代码编写,本周可以在闲暇时间完成这个对比实验。

一个简易的schedule如下:

  • 9.21-25(周五):今天重新测试了一下API,发现在一些中文标点上模型经常翻译为[UNK],这四天尝试解决一下这些小问题。同时如果时间上允许,将尝试迭代上述的硬后处理机制到API中,解决部分过纠问题。

  • 9.26-27(周末):完善SpellGCN的复现代码,以及训练。

  • 9.28-10.8:十一期间可以编写一个类CGED式的检错模块融合至模型,观察性能变化。以及探索连续型出错弱项的优化方案。

模型复现效果对比

Soft-Masked BERT 中Baseline复现

原始论文中提出一个500w级别News Title的纠错数据集,经过与原作者联系,他们并不打算公开该数据集。

原始论文中的BERT-Finetune模型是基于500w数据集进行微调,为了对比,我们手动生成了300w级别的语料进行微调。原始论文使用自己提出的数据集作为测试集,复现部分采取Sighan15作为测试集,因此对比也存在差异:

Training Data

Method

Detection

Correction

Acc.

Prec.

Rec.

F1.

Acc.

Prec.

Rec.

F1.

100w

BERT-Finetune

(in Soft-Masked)

74.2

54.7

51.3

52.9

70.0

41.6

39.0

40.3

100w +

Sighan15

BERT-Finetune

(复现)


54.7

52.6

53.6

62.8

45.5

43.7

44.6

200w

BERT-Finetune

(in Soft-Masked)

77.0

59.7

57.0

58.3

73.1

48.0

45.8

46.9

200w +

Sighan15

BERT-Finetune

(复现)


67.9

69.6

68.7

71.7

55.2

56.7

55.9

500w

BERT-Finetune

(in Soft-Masked)

80.0

65.0

61.5

63.2

76.8

55.3

52.3

53.8

300w +

Sighan15

BERT-Finetune

(复现)


65.1

69.4

67.2

71.7

56.1

59.8

57.9

SpellGCN 中Baseline复现

Training Data

Method

Detection

Correction

Acc.

Prec.

Rec.

F1.

Acc.

Prec.

Rec.

F1.

27w +

Sighan 13-15

BERT(SpellGCN)


73.7

78.2

75.9


70.9

75.2

73.0

27w +

Sighan 13-15

BERT(复现)


75.8

76.6

76.2


73.4

74.2

73.8

多模型复现对比

由于复现的Soft-Masked BERT模型计算较慢,因此在对比中使用了27w+Sighan13-15的数据作为训练数据。

目前SpellGCN的复现尝试仍在进行中。

Training Data

Method

Detection

Correction

Acc.

Prec.

Rec.

F1.

Acc.

Prec.

Rec.

F1.

500w +

Sighan15

Soft-Masked BERT

80.9

73.8

73.2

73.5

77.4

66.7

66.2

66.4

27w +

Sighan 13-15

Soft-Masked BERT(微调复现)


50.0

72.9

59.3

77.3

65.6

74.6

69.8

27w +

Sighan 13-15

SpellGCN


74.8

80.7

77.7


72.1

77.7

75.9

算法更新及结果显示

更新文件放入result文件夹下。

数据解释:每个错误下有7或4行数据,分别代表检错精确率,检错召回率,检错F1值,纠错精确度,纠错召回率,纠错F1值,句级正确率,部分模型不包括检错模块,因此只具备4行数据

检错精确率:疑似错误中真正包含错误比例,反应“误报”错误
检错召回率:100例错误中被完全检测出的比例,反应“漏报”错误
检错F1值:反应检错模型大致性能
纠错精确率:纠正错误中与真实正确相同的比例,
纠错召回率:100例错误中被完全纠正的比例,
纠错F1值:反应纠错模块大致性能
句级正确率:100例句子被真实纠正的比例

更新文件

算法介绍

同音字

同形字

漏字

同音词

AVE

简易分析

Origin

0313.

txt

同origin0309,原始模型;不存在加字的处理;不能处理漏字;且改错时强制限制完全同音。

42.9%

46.6%

43.2%

48.5%

45.3%

之前的训练是将提取出的句子进行短切分后划分训练集,猜想其可能损失部分n_gram信息,因此训练一版原始长句子的训练集,此为新版的验证集评估。

88.0%

89.0%

54.0%

32.0%

65.8%

57.7%

61.2%

48.0%

38.6%

53.7%

68.7%

56.9%

0.0%

40.8%

41.6%

82.0%

75.0%

0.0%

19.0%

44.0%

74.8%

64.7%

0.0%

25.9%

42.8%

63.0%

60.0%

0.0%

16.0%

34.8%

Our

0313

.txt

领域小语料+通用大语料,2.0GB,采用长句子直接提取n_gram信息,关闭漏字更正模块,限制候选拼音相同。

41.7%

47.9%

47.0%

55.2%

48.0%

通过与之前小语料的对比,发现模型在增大语料时能够一定能力增大纠错性能。然而仍然存在较多错检与错纠,并且性能依旧需要依赖于拼音相同等限制,与实际情况存在偏差。

90.0%

90.0%

61.0%

45.0%

71.5%

57.0%

62.5%

53.1%

49.6%

57.4%

84.8%

70.8%

0.0%

58.2%

53.5%

88.0%

83.0%

0.0%

24.0%

48.8%

86.4%

76.4%

0.0%

34.0%

51.0%

78.0%

71.0%

0.0%

24.0%

43.3%

Ours

0313_

Add

.txt

使用上述语料,加入漏字纠错模块,去除候选词的强限制,改为限制简拼相同

31.8%

35.3%

38.2%

39.7%

36.3%

开启漏字纠错后,去除强限制后,可以发现降低了模型其他错误类型纠错准确率与召回率。

97.0%

94.0%

75.0%

69.0%

83.8%

47.9%

51.3%

50.6%

50.4%

50.7%

46.1%

35.2%

25.5%

12.6%

29.8%

73.0%

65.0%

43.0%

18.0%

49.8%

56.5%

45.7%

32.0%

14.8%

37.3%

48.0%

40.0%

28.0%

12.0%

32.0%

aug_

0325_

o.txt

使用同义词替换增强策略,语料模型184M,关闭漏字更正模块,限制候选拼音相同

41.4%

48.7%

52.6%

55.3%

49.5%

同比利用通用领域增强的语料,在领域语料中利用同义词替换增强策略在200M的数量级可以媲美原始的2G语言模型,并且同形字和同音词的纠错效果更好。

91.0%

95.0%

60.0%

54.0%

75.0%

56.9%

64.4%

56.1%

54.6%

59.6%

85.7%

77.7%

0.0%

68.0%

57.8%

87.0%

88.0%

0.0%

35.0%

52.5%

86.3%

82.5%

0.0%

46.2%

55.0%

78.0%

82.0%

0.0%

35.0%

48.8%

Aug

0325_

add&s

.txt

使用同义词替换增强策略,语料模型184M,加入漏字纠错模块,去除候选词的强限制,改为限制简拼相同。并优同音词生成策略。

37.0%

45.1%

48.4%

50.0%

45.1%

同比利用通用领域增强的语料,模型在开启漏字纠错后,同音字、同形字、同音词的检错均优于通用领域增强语料的结果。

91.0%

96.0%

66.0%

63.0%

79.0%

52.6%

61.4%

55.8%

55.8%

57.4%

60.3%

46.3%

32.4%

30.4%

42.3%

83.0%

69.0%

37.0%

33.0%

55.5%

69.9%

55.4%

34.5%

31.6%

48.0%

53.0%

48.0%

29.0%

27.0%

39.3%

Aug

0402_

add&s

.txt

同aug0325_add&s,在候选打分上加入分词数量的参考,部分解决了漏字模块对非漏字问题处理的负面影响。

37.0%

45.1%

48.4%

49.6%

45.0%

相较于上面的结果漏字处理能力保留的同时将同音同形字处理的负影响降低,结果为目前AVE准确率最高的模型。

91.0%

96.0%

66.0%

63.0%

79.0%

52.6%

61.3%

55.8%

55.5%

57.3%

80.4%

69.7%

46.3%

48.3%

61.2%

82.0%

67.0%

36.0%

35.0%

55.0%

81.2%

68.3%

40.5%

40.6%

57.9%

71.0%

63.0%

33.0%

32.0%

49.8%

Correc

tion

_word_

0314.tx

使用新划分的训练集与测试集,重新对其使用的多个语料进行训练,关闭漏字纠错。

33.1%

34.3%

45.7%

45.5%

39.6%

由于其候选的过滤更为粗糙,但是其纠错正确率却高于我们的模型,认为为候选打分的方式值得借鉴,下一步我们的模型将尝试加入该模型的打分方式进行对比。

97.0%

96.0%

77.0%

86.0%

89.0%

49.4%

50.5%

57.4%

59.5%

54.8%

57.6%

60.4%

6.9%

35.4%

40.1%

60.0%

65.0%

10.0%

17.0%

38.0%

58.8%

62.6%

8.2%

23.0%

39.0%

54.0%

52.0%

0.0%

16.0%

30.5%

Baidu

_api.

txt

远程调用百度云中提供的中文纠错API进行纠错尝试,从结构来看,其不能处理漏字,前不返回检错信息。

79.2%

72.7%

0.0%

77.8%

57.4%

从效果来看,百度提供的API在同音和同形的检错上表现并不佳,在同音词表现与n-gram模型以及BERT模型更为接近。

20.0%

20.0%

0.0%

24.0%

16.0%

31.9%

31.4%

0.0%

36.7%

25.0%

18.0%

17.0%

0.0%

23.0%

14.5%

Autoch

echer4

Chine

se_log

.txt

基于预训练的词频信息进行纠错,对每一个词频小于设定阈值的词均进行纠错尝试,同样不具备独立的纠错模块。

40.0%

14.0%

6.8%

10.9%

17.9%

基于词频的纠错模型,理论上要比基于n-grams的模型更弱效一些。实验结果与预期相同。

38.0%

12.0%

0.0%

2.0%

13.0%

39.0%

12.9%

0.0%

3.4%

15.1%

27.0%

8.0%

0.0%

2.0%

9.3%









深度算法更新及结果展示

基于BERT模型的纠错效果(不进行检错),更新了其漏字处理的模块,并进行了一些优化,目前尚存在优化空间且已经在ngram模型中进行实践检验,尚未迭代到BERT模型中。

更新文件

算法介绍

同音字

同形字

漏字

同音词

AVE

简易分析

BERT_

origin

0318

.txt

利用作者预先fine-tuned的MLM模型(人名日报2014版数据),纠错方案为对句子中每个位置设置MASK,令BERT模型对其进行预测,将预测集中第一个再混淆集中的字作为正确字返回,不包括检错。

86.7%

88.2%

0.0%

86.0%

65.2%

由于是对句子中的每一个字进行BERT的再预测,因此其不需要检错模块。模型将BERT中预测分数较高、且在当前字的混淆集中的结果视为错误字的纠正。这种模式无法进行漏字纠错。结果显示比规则式纠错在同音与同形字上工作更好。

79.0%

82.0%

0.0%

27.0%

47.0%

82.7%

85.0%

0.0%

41.1%

54.6%

72.0%

74.0%

0.0%

26.0%

43.0%

BERT_

Add

0402

.txt

将BERT模型与ngram模型尝试进行了融合,并进行了一般简单的优化。

52.3%

52.2%

0.0%

38.0%

35.6%

可以看到BERT模型同样出现了严重的纠错模块影响同音同形字处理的现象,但是其漏字的处理性能是目前最优的性能。由于模型尚在修改,纠错性能的统计好像存在问题,但是句级正确率正确。

78.0%

83.0%

54.0%

33.0%

62.0%

62.7%

64.1%

0.0%

35.3%

45.3%

34.0%

29.0%

48.0%

15.0%

31.5%