如何计算真实值在提取列表中的匹配数及多文档平均性能得分?
单文档与多文档的关键词提取性能计算方法
一、单文档指标计算
直接统计真实值列表中出现在提取值列表里的元素数量,再和真实值总数对比,就能得到类似“3/3真实值被提取”的结果。
代码实现(Python)
def calculate_single_doc_score(extracted, real): # 统计匹配的真实值数量 matched = sum(1 for val in real if val in extracted) total_real = len(real) return f"{matched}/{total_real}真实值被提取", matched / total_real if total_real != 0 else 0 # 示例测试 extracted_value = ["value", "of", "words", "that", "were", "tracked"] real_value = ["value", "words", "that"] result, score = calculate_single_doc_score(extracted_value, real_value) print(result) # 输出:3/3真实值被提取
二、多文档平均性能得分计算
完全可以基于单文档的结果计算全局平均得分,常用两种统计方式:
1. 微平均得分(Micro-average)
把所有文档的匹配数总和,除以所有文档的真实值总数总和,能反映整体的提取覆盖情况,适合关注全局总准确率的场景。
公式:总匹配数 / 所有文档真实值总数之和
2. 宏平均得分(Macro-average)
先计算每个文档的匹配率(匹配数/该文档真实值数),再对所有文档的匹配率取平均值,能平等看待每个文档的表现,避免大文档主导结果。
公式:(文档1匹配率 + 文档2匹配率 + ... + 文档N匹配率) / N
代码实现(Python)
def calculate_multi_doc_scores(documents): total_matched = 0 total_real = 0 doc_scores = [] for extracted, real in documents: matched = sum(1 for val in real if val in extracted) total_real_doc = len(real) total_matched += matched total_real += total_real_doc if total_real_doc != 0: doc_scores.append(matched / total_real_doc) # 计算微平均得分 micro_score = total_matched / total_real if total_real != 0 else 0 # 计算宏平均得分 macro_score = sum(doc_scores) / len(doc_scores) if doc_scores else 0 return { "微平均得分": micro_score, "宏平均得分": macro_score, "总匹配情况": f"{total_matched}/{total_real}真实值被提取" } # 多文档示例测试 multi_docs = [ (["a", "b", "c"], ["a", "b", "c", "d"]), # 3/4 (["x", "y"], ["x", "z"]), # 1/2 (["m"], ["m", "n", "p"]) # 1/3 ] scores = calculate_multi_doc_scores(multi_docs) print(scores) # 输出示例: # {'微平均得分': 0.5, '宏平均得分': 0.5555555555555556, '总匹配情况': '5/9真实值被提取'}
内容的提问来源于stack exchange,提问作者eliza nyambu
相关产品推荐
相关产品推荐

