iqiyi / FASPell

2019-SOTA简繁中文拼写检查工具:FASPell Chinese Spell Checker (Chinese Spell Check / 中文拼写检错 / 中文拼写纠错 / 中文拼写检查)
GNU General Public License v3.0
1.2k stars 213 forks source link

tackle_n_gram_bias中操作 #22

Closed lijuan123 closed 4 years ago

lijuan123 commented 4 years ago

您好,请问一下tackle_n_gram_bias这个策略的意义是什么呢?为什么在这个策略里只取了confidence最大的那个值,剩下的都放到了error_delete_positions。 error_delete_positon 只要有一个位置的信息结果指向这里,就意味这不做纠错?

rejae commented 4 years ago

我今天调了一下,发现这里只要出现一个confidence最高的候选,其余的origin字都进入了error_delete_positions, 意思是这些字都不会纠错了,意味着,只纠错一个位置。

根据:error_delete_positions

<class 'list'>: 
[(2, '几'), (0, '本'), (5, '报'), (6, '道'), (4, '济'), (3, '经'), (2, '几'), (5, '报'), (6, '道'), (4, '济'), (3, '经'), (5, '报'), (6, '道'), (4, '济'), (3, '经'), (6, '道'), (4, '济'), (3, '经'), (6, '道'), (4, '济'), (6, '道')]

本是几经济报道-- 华世纪世经新闻 -->> 最终得到: 本世几经济报道

由于tackle_n_gram_bias: 第一次首先取“本”字,所有res排序后,除最高confidence排名的是-世,被n_gram_errors[1:]过滤掉后,其他所有的origin字进入error_delete_positions,意味着,这些除了是这个字,其他原字都保留不变。

eugene-yh commented 4 years ago

您好,请问一下tackle_n_gram_bias这个策略的意义是什么呢?为什么在这个策略里只取了confidence最大的那个值,剩下的都放到了error_delete_positions。 error_delete_positon 只要有一个位置的信息结果指向这里,就意味这不做纠错?

是的,但这只意味着在一轮纠错中不会纠错。这是为了确保能在每一轮中精确率尽量高,这样一来,如论文所述,进行多轮后,可能还可以把其它错误纠出。

如果没有这个hack,由于MLM很受相邻字符的影响,可能在一轮中把错字纠对,但同时把它紧邻的对字纠错,多轮后可能仍然有一个错字。

rejae commented 4 years ago

@eugene-yh 你好,代码中有多轮调试么?轮次设为多少也是一个问题鸭?

eugene-yh commented 4 years ago

@eugene-yh 你好,代码中有多轮调试么?轮次设为多少也是一个问题鸭?

论文最后一节中有给出纠错轮数和性能的关系的实验结果;代码中由faspell_configs中的round控制;

rejae commented 4 years ago

@eugene-yh 您好,这里的纠错轮数和效果曲线是根据那三个相关数据集得到的,据我调试代码,发现一句话每次纠错有且只有一个字(即使原句是正确的,也会因为候选按confidence排序,截断confidence最高的origin,阻止其进入error_delete_positions,所以即使该字正确也会被候选confidence排第二的替换),当轮次多了之后,替换会更严重,所以我以为这里的效果曲线只是针对那三个数据集的。

真实纠错场景下,一个句子错误多少是未确定的,单纯按您实验的轮次与效果是不具备参考意义的,请问这个问题(每次纠错有且只有1个,即使正确也纠错,多次纠错次数也不确定),有解决么?

eugene-yh commented 4 years ago

@eugene-yh 您好,这里的纠错轮数和效果曲线是根据那三个相关数据集得到的,

为了回答您的问题,我需要知道您所说的“纠错轮数和效果曲线”和“三个相关数据集”是指什么? 按我的猜测,“纠错轮数和效果曲线”是指描述纠错轮数和性能的关系的曲线;但是我不明白“三个”是指哪三个。我们一共在4个数据集上做了实验。

据我调试代码,发现一句话每次纠错有且只有一个字

tackle_n_gram_bias这个hack只针对连续相邻的字符(n-gram)错误去保留唯一一个。我不明白您所说的每一句话只纠错一个字的含义。如果一句话的模型预测的若干错误字符不相邻,这个hack并不会起作用。另外,为做出合理回答,我需要知道您这个claim所基于的实验的数据集是什么。

真实纠错场景下,一个句子错误多少是未确定的,单纯按您实验的轮次与效果是不具备参考意义的,请问这个问题(每次纠错有且只有1个,即使正确也纠错,多次纠错次数也不确定),有解决么?

这似乎是建立在您前一条“每句话只纠错一个字”的claim下的。这不是事实,因此对于您基于此的论断我并不赞同。模型对于一个句子有多少错误字符是agnostic的。模型在理想情况下可以把一个句子中所有错误找出来。

rejae commented 4 years ago

您好 @eugene-yh ,十分感谢你的回答,由于filter的设置不合理,造成我的数据有很多error进入res,从而N-gram在这里几乎成了整个句子,自然只能纠错一个。 由于我对项目的调试不够深入,发表了自己不正确的言论,希望您理解,蟹蟹。