【问题标题】:Is it possible to make a confusion matrix from character pairs?是否可以从字符对中制作混淆矩阵?
【发布时间】:2020-10-20 20:37:06
【问题描述】:

在光学字符识别的背景下,我将尽力总结我的问题:

  1. 我有参考句和预测句。

  2. 使用Levenshtein editops function,我创建了一个列表,其中包含一个元组,其中包含:步骤类型(插入、替换、替换)、参考序列中修改的字符、预测序列中修改的字符,最后是在所有参考句子中进行这些更改的次数(实际上,这些错误对返回的最大出现次数)

[(('insert', 'e', 'm'), 11), (('insert', 't', 'a'), 8), (('insert', 'r', 'o'), 5), (('replace', 'a', 'e'), 2), (('replace', 't', 'T'), 1), (('replace', 'r', 'R'), 1), (('replace', 'M', 'm'), 1), (('delete', ' ', 'a'), 1), (('replace', 'p', 'o'), 1), (('replace', 't', 'a'), 1), (('replace', 'e', 'e'), 1), (('replace', ' ', 'r'), 1), (('insert', ' ', 'd'), 1), (('replace', ' ', 'd'), 1), (('replace', 'i', 'e'), 1), (('replace', 'l', 's'), 1)]
  1. 是否可以从上一个列表中用这些错误对和最大出现次数制作一种“混淆矩阵”?像这样:

输出示例

Predicted         e         m         t          a        r   ...continue
Reference
e                 1         11        0          0        0
m                 0         0         0          0        0
t                 0         0         0          8        0 
a                 2         0         0          0        0
r                 0         0         0          0        0
...continue                                         

或像这样(不带标签):

[[1         11        0          0        0
  0         0         0          0        0
  0         0         0          8        0 
  2         0         0          0        0
  0         0         0          0        0]]

注意:当未遇到字符错误对时,此“矩阵”示例中默认替换值 0。

  1. 第二次,是否有可能获得这个“矩阵”的可视化?例如,使用 matplotlib 或 seaborn。

解决它的轨道?提前致谢。

【问题讨论】:

    标签: python-3.x


    【解决方案1】:

    我会用 Counters 来做这个:

    operations = [(('insert', 'e', 'm'), 11), (('insert', 't', 'a'), 8), (('insert', 'r', 'o'), 5), (('replace', 'a', 'e'), 2), (('replace', 't', 'T'), 1), (('replace', 'r', 'R'), 1), (('replace', 'M', 'm'), 1), (('delete', ' ', 'a'), 1), (('replace', 'p', 'o'), 1), (('replace', 't', 'a'), 1), (('replace', 'e', 'e'), 1), (('replace', ' ', 'r'), 1), (('insert', ' ', 'd'), 1), (('replace', ' ', 'd'), 1), (('replace', 'i', 'e'), 1), (('replace', 'l', 's'), 1)]
    
    from collections import defaultdict, Counter
    
    intermediary = defaultdict(Counter)
    for (_, src, tgt), count in source:
        intermediary[src][tgt] = count
    
    letters = sorted({key for inner in intermediary.values() for key in inner} | set(intermediary.keys()))
    
    confusion_matrix = [[intermediary[src][tgt] for tgt in letters] for src in letters]
    

    结果如下所示:

    [[0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0],
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 1, 0, 0, 11, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
     [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
    

    绘图参考the answers of this question:

    import seaborn as sn
    import pandas as pd
    import matplotlib.pyplot as plt
    
    df_cm = pd.DataFrame(confusion_matrix, letters, letters)
    sn.set(font_scale=1.4) # for label size
    sn.heatmap(df_cm, annot=True, annot_kws={"size": 16}) # font size
    
    plt.show()
    

    【讨论】:

    • 效果很好,应该写在食谱书上。感谢您的帮助!
    猜你喜欢
    • 2017-10-17
    • 2022-06-17
    • 2016-01-31
    • 2017-07-24
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 2014-07-09
    相关资源
    最近更新 更多