Open Baililily opened 3 years ago
评测方法,token-level的有两种,一种是官方的metrics,一个是基于PGNet源代码的metrics, 两者是有不同的; 具体参考一下前文,这个定义有一些差别。
@cxysteven 官方给的evaluate tool有的指标是token-level,有的指标是sentencew-level,计算出来的TP,FP这些值也存在自我矛盾的地方。PGNet是什么?
@li-aolong 可以留个联系方式交流一下吗,微信或者qq?
@Baililily 很好奇你们最后复现了吗
这个correct_FP我也感觉有点问题,作者有时间可以看一下:
关于Character-level Correction Metrics的一点疑问
我梳理了一下您在代码中的评价指标,但Character-level Correction Metrics好像存在一点问题,“该纠,但没纠对的字”会被FN和FP重复计算。具体参考下面代码:
for ... in ...:
"""
该纠的字,纠了也纠对了。
例如:label为[(1, '鸡'), (3, '你'), (5, '太')],
pred为[(1, '坤'), (3, '你'), (5, '太'), (7, '美')]
则TP+=2。 因为“你,太”两个字该纠且纠对了
"""
correct_TP += len(set(correct_pred_tokens) & set(zip(detect_actual_tokens,correct_actual_tokens)))
"""
纠了,但没纠对的字。(包括这个字本身有错和没错两种情况)
例如:label为[(1, '鸡'), (3, '你'), (5, '太')],
pred为[(1, '坤'), (3, '你'), (5, '太'), (7, '美')]
则FP+=2。 因为'坤'字纠了,但没纠对。'美'字纠了,但7位置本身没错,所以也没纠对
"""
correct_FP += len(set(correct_pred_tokens) - set(zip(detect_actual_tokens,correct_actual_tokens)))
"""
该纠的字,但没纠对或没纠。
例如:label为[(1, '鸡'), (3, '你'), (5, '太'), (9, '美')],
pred为[(1, '坤'), (3, '你'), (5, '太')]
则FN+=2。 因为'鸡'字没纠对,'美'字该纠但没纠
这里这个指标好像出现了问题,对于'坤'字的错误预测,在FP和FN被重复计算了。
"""
correct_FN += len(set(zip(detect_actual_tokens,correct_actual_tokens)) - set(correct_pred_tokens))
correct_precision = correct_TP * 1.0 / (correct_TP + correct_FP)
correct_recall = correct_TP * 1.0 / (correct_TP + correct_FN)
correct_F1 = 2. * correct_precision * correct_recall/ ((correct_precision + correct_recall) + 1e-8)
这是从源码中截出的关于Character-level Correction Metrics的片段,可以看下correct_FN 和correct_FP 这个地方
我理解的FP是文本中本来正确的字被纠正成错误字的个数 而代码中correct_FP是检测出来有错误但是没有纠对的个数