我正在处理 OCR 任务,出于评估目的,想要计算我的模型的混淆矩阵。我希望它基本上显示一个字符被正确预测的频率以及它被预测为其他字符的频率(以及哪些字符!)。
我目前的问题是,由于字符串大小不匹配和/或附加/缺失字符(主要是空格),简单的成对比较很困难。我正在考虑使用 Levenshtein 距离计算算法添加有关需要插入/删除字符的频率的信息,但我仍然不确定如何处理它。
有没有常用的最先进的方法?我做了一些研究,但找不到任何重要的东西。
您正在寻找 Needleman-Wunsch 算法,该算法可用于查找两个序列之间的最佳比对。虽然它最初是为 DNA 序列比对而设计的,但它对于比对嘈杂的 OCR 结果也很有效。
Microsoft 的 genalog 库中提供了推荐的实现。您可以在他们的文档中找到使用示例。这是一个简单的例子:
from genalog.text import alignment
from genalog.text import anchor
gt_txt = "New York is big"
noise_txt = "New Yo rkis "
# Align using the anchor method
aligned_gt, aligned_noise = anchor.align_w_anchor(gt_txt, noise_txt, gap_char="@")
print(f"Aligned ground truth: {aligned_gt}")
print(f"Aligned noise: {aligned_noise}")
# Align using the basic alignment method
aligned_gt, aligned_noise = alignment.align(gt_txt, noise_txt, gap_char="@")
print(f"Aligned ground truth: {aligned_gt}")
print(f"Aligned noise: {aligned_noise}")
这将输出:
Aligned ground truth: New Yo@rk is big
Aligned noise: New Yo rk@is @@@
对齐后,逐个字符进行比较以计算混淆矩阵。有关更多详细信息,请访问有关文本对齐的 genalog 文档。