多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

olmOCR Elo 评分体系:基于人工成对评审的 OCR 工具排名与显著性检验

olmOCR Elo 评分体系:基于人工成对评审的 OCR 工具排名与显著性检验 olmOCR Elo 评分体系基于人工成对评审的 OCR 工具排名与显著性检验【免费下载链接】olmocrToolkit for linearizing PDFs for LLM datasets/training项目地址: https://gitcode.com/GitHub_Trending/ol/olmocr导读本文系统讲解 olmOCR 仓库中用于衡量 OCR 工具相对水平的 Elo 评分体系包括数据格式、计算原理、统计显著性与完整运行流程。读者将掌握如何从成对胜负数据计算带置信区间的 Elo 排名、执行两两显著性检验并生成可视化箱线图从而在 LLM 数据集构建场景中科学评估 PDF 解析工具的横向对比结果。文章以 scripts/elo/README.md 为骨架并结合仓库内的评分脚本与上游评审数据生产链路进行源码级展开。为什么 OCR 对比要用 Elo 而非简单胜率在 olmOCR 项目中PDF 解析质量评估的核心难点在于不同工具olmOCR、MinerU、Marker、GOTOCR 等输出的 Markdown 文本没有统一的标准答案可以直接比对人工打分成本高昂。项目采用了一种近似竞技体育的替代方案让评审人员对同一 PDF 页面的两个不同工具输出进行成对比较pairwise comparison投票选出更好的一方然后基于成对胜负关系计算排名。简单胜率的缺陷在于它无法反映对手强度。某个工具 60% 的胜率如果全部来自与最弱工具的对比其含金量远低于战胜强队得到的 60%。Elo 评分机制恰好解决这一问题——胜利方的得分增长取决于对手当前评分击败高评分对手获得更多加分从而在非完整赛程不是每个工具两两都对打同样场次下也能得到可横向比较的全局分数。这也是 scripts/elo/README.md 选用 Elo 而非朴素胜率排名的根本原因。成对胜负数据ratings.csv 的格式与含义Elo 计算的全部输入是成对胜负计数win/loss counts存放于 scripts/elo/ratings.csvMethodA,MethodB,A_wins,B_wins,A_rate(%),B_rate(%) marker,mineru,53,26,67.1,32.9 mineru,pdelf,22,55,28.6,71.4 gotocr_format,marker,26,45,36.6,63.4 marker,pdelf,31,49,38.8,61.3 gotocr_format,pdelf,29,41,41.4,58.6 gotocr_format,mineru,38,37,50.7,49.3各字段含义如下字段含义MethodA/MethodB参与对比的两个 OCR 工具标识A_wins/B_winsA 战胜 B 与 B 战胜 A 的评审票数A_rate(%)/B_rate(%)各自的胜率百分比即wins / (A_wins B_wins) * 100仓库中出现了gotocr_format、marker、mineru、pdelf四个标识。特别需要注意pdelf就是 olmOCR 本体的代号README 中已明确标注 pdfelfis olmOCR实际数据文件里写作pdelf。其余三者分别对应 GOTOCR、Marker、MinerU 三个外部工具——这三个工具在 olmOCR 仓库中也都有对应的基准运行脚本例如 scripts/bench/runners/run_gotocr.py、run_marker.py 与 run_mineru.py。从数据可以看到同一对工具间胜负票数并不对称如 marker vs mineru 为 53:26且不是所有配对都采样均匀——这正是需要 Elo 平滑处理的原因。数据从哪来评审投票到胜负计数的上游链路ratings.csv并非手工编写而是由仓库中更上游的评审流程沉淀而来。理解这条链路有助于正确解读数据生成成对评审页面scripts/eval/buildelo.py 从 S3 拉取同一 PDF 各工具的解析结果.md文件用HirschbergAligner与DocumentEditSimilarity计算文本对齐相似度过滤掉对齐度 0.96 的过于相似、没有评审价值的对再两两组合combinations并随机交换左右顺序生成人工评审页面每页--review_size默认 50 条可并行处理。人工投票评审人员在页面上对每个条目标注left、right、both_good、both_bad、invalid_pdf等结果。汇总胜负计数scripts/eval/scoreelo.py 抓取评审页面 HTML 与其嵌入的 JSON datastore解析每条投票left/right计入对应工具的胜利其余选项不计入直接对局最终聚合为{ (A, B): [A_wins, B_wins] }结构并输出与ratings.csv相同格式的scoreelo.csv列头MethodA,MethodB,A_wins,B_wins,A_rate(%),B_rate(%)。可见 scripts/elo/ratings.csv 正是这条自动生成对比 → 人工评审 → 投票聚合链路的产品Elo 评分则是该链路的最后一步定量分析。计算原理期望胜率、K 因子与多次重排Elo 计算的核心实现在 scripts/elo/calculate_elo_ratings.py 中。单场对局更新由update_single_match完成def update_single_match(rating_a, rating_b, actual_score, k_factor): Update ratings for a single match expected_a 1 / (1 10 ** ((rating_b - rating_a) / 400)) new_rating_a rating_a k_factor * (actual_score - expected_a) new_rating_b rating_b k_factor * ((1 - actual_score) - (1 - expected_a)) return new_rating_a, new_rating_b这里体现了经典 Elo 公式的三大要素期望胜率expected_a 1 / (1 10^((R_b - R_a)/400))评分差 400 分时高分方期望胜率约为 90%评分相等时各 50%。实际得分actual_score胜者取 1败者取 0。K 因子k_factor默认 32控制单场比赛评分变化的幅度K 越大排名越激进。calculate_elo函数在每轮模拟中先对数据行做无放回随机重排df.sample(frac1, replaceFalse, random_staterandom_state)再按行将A_wins次A 胜 B与B_wins次B 胜 A逐场套用上述更新初始评分initial_rating1500。由于对局顺序会影响最终评分脚本默认重复n_replications10轮并取平均以缓解顺序效应。scoreelo.py中的compute_elo_arena则实现了不带重排的等价版本elo_update公式与上述完全一致同样k32、initial_rating1500可作为交叉验证参考。完整运行计算带置信区间的 Elo 排名评分脚本基于 Click 构建命令行接口README 给出的标准运行命令如下python calculate_elo_ratings.py ratings.csv --num-bootstrap 5000 --num-elo-sims 100 --confidence-level 95 --seed 123各参数说明对应 calculate_elo_ratings.py 中的 Click 定义参数默认值作用ratings_file位置参数必填成对胜负 CSV 文件路径要求文件存在--num-bootstrap1000自助法bootstrap重采样迭代次数越大置信区间越稳定--num-elo-sims10每次 bootstrap 采样内部运行的 Elo 模拟轮数即上文的n_replications--confidence-level95置信区间置信度百分比--seed42随机种子保证结果可复现运行机制上脚本先用bootstrap_elo_and_tests对原始数据做有放回重采样df.sample(nlen(df), replaceTrue, random_staterandom_state)对每个 bootstrap 样本调用calculate_elo得到该方法的评分分布再以np.percentile提取置信区间上下界并汇总均值与标准差。README 与仓库内 results.txt 中保存的示例输出为Bootstrapped Elo Ratings (95% CI): -------------------------------------------------- pdelf 1813.0 ± 84.9 [1605.9, 1930.0] mineru 1545.2 ± 99.7 [1336.7, 1714.1] marker 1429.1 ± 100.7 [1267.6, 1645.5] gotocr_format 1212.7 ± 82.0 [1097.3, 1408.3] Pairwise Significance Tests: -------------------------------------------------- gotocr_format vs marker Δ -216.3 [-470.8, 135.0] p 0.218 gotocr_format vs mineru Δ -332.5 [-567.5, 19.3] p 0.051 gotocr_format vs pdelf Δ -600.3 [-826.1, -344.3] p 0.000* marker vs mineru Δ -116.1 [-365.4, 246.5] p 0.430 marker vs pdelf Δ -383.9 [-610.6, -10.9] p 0.044* mineru vs pdelf Δ -267.8 [-517.3, 104.0] p 0.135输出分两部分Bootstrapped Elo Ratings按均值降序排列的最终排名格式为方法名 均值 ± 标准差 [置信区间下界, 上界]。示例数据中pdelfolmOCR以 1813.0 领先且其置信区间下界1605.9仍高于第二名mineru的均值。Pairwise Significance Tests对所有方法两两组合计算评分差Δ的分布results[m1][bootstrap_samples] - results[m2][bootstrap_samples]给出差值均值、95% 置信区间以及双尾检验 p 值p_value 2 * min(mean(diff 0), mean(diff 0))。当p 1 - confidence_level/100时在行尾标记*表示差异显著。需要说明该输出仅反映 ratings.csv 这一份评审数据的统计结果属于当前仓库内可复现的示例不代表对相关工具在任意场景下的普适结论。结果持久化与可视化箱线图保存结果运行calculate_elo_ratings.py时输出会直接打印到终端README 指出同样的结果已预存于 results.txt其内容与上一节展示的输出一致可直接作为可视化输入无需重新计算。生成箱线图绘图脚本 scripts/elo/draw_boxplots.py 以results.txt的输出文本为输入将其解析为各方法的 Elo 均值、标准差与置信区间然后绘制箱线图python draw_boxplots.py results.txt boxplots.png执行后会在当前目录保存boxplots.png。脚本实现要点解析parse_elo_data用正则(\w)\s(\d\.\d)\s*±\s*(\d\.\d)\s*\[(\d\.\d),\s*(\d\.\d)\]从文本中抽取方法名、中位数均值、误差标准差、置信区间上下界——因此只需把评分脚本的输出保存为文本文件即可无缝喂给绘图脚本。美化使用 AI2 品牌色#f0529c粉、#105257深青pdelf即 olmOCR以粉色突出显示其余工具按相对表现映射为深青到灰色的渐变色performance_ratio (median - min) / (max - min)通过NAME_DISPLAY_MAP将内部代号映射为展示名pdelf → olmOCR、mineru → MinerU、marker → Marker、gotocr_format → GOTOCR默认从https://dolma-artifacts.org/Manrope-Medium.ttf下载并缓存 Manrope 字体首次运行需联网可用--manrope-medium-font-path指定本地字体文件规避。输出300 DPI、透明背景的 PNG隐藏无关边框仅保留左侧与底部坐标轴。仓库内预生成的 scripts/elo/boxplots.png 展示了 4 个工具在同一坐标系下的 Elo 分布对比其中 olmOCR 的箱体中位数约 1800整体高于其余三者GOTOCR 位于底部约 1200MinerU 与 Marker 居中。参数调优与注意事项基于源码实现使用该工具链时有以下可操作建议加大 bootstrap 次数--num-bootstrap默认 1000README 示例使用 5000。样本量越大置信区间与 p 值越稳定代价是运行时间线性增长脚本内部使用tqdm显示进度。控制 Elo 模拟轮数--num-elo-sims决定每个 bootstrap 样本内对局重排次数用于缓解对局顺序带来的偏差默认 10示例使用 100。固定随机种子--seed同时作用于random.seed与np.random.seed固定后可完全复现结果报告评审结论时务必声明所用种子。数据完整性ratings.csv中每行A_wins B_wins应等于该配对的有效投票总数A_rate(%)与B_rate(%)之和应约为 100。若数据中同一方法标识拼写不一致如 README 中pdfelf与数据文件中的pdelf会破坏方法集合推断需保持命名统一。K 因子取舍代码中 K 因子硬编码为 32calculate_elo与scoreelo.py的compute_elo_arena一致适用于样本量较小的快速排名如需更平滑的更新可自行降低但要注意两个脚本需同步修改以保证一致性。小结本文以 scripts/elo/README.md 为主线完整覆盖了 olmOCR Elo 评分工具链从 ratings.csv 的成对胜负数据格式到 calculate_elo_ratings.py 中期望胜率公式、K 因子、bootstrap 置信区间与两两显著性检验的实现细节再到 draw_boxplots.py 的可视化输出并向上追溯了 buildelo.py 与 scoreelo.py 组成的评审数据生产链路。这套方法论的价值在于当 OCR 解析质量没有绝对标准答案时通过成对人工投票 Elo bootstrap 显著性检验可以在有限标注成本下获得带统计置信度的工具排名为 olmOCR 这类面向 LLM 数据集构建的 PDF 线性化工具提供可复现、可审计的横向对比依据。相关文件与输出均位于仓库 scripts/elo 目录可直接按文中的命令复现。【免费下载链接】olmocrToolkit for linearizing PDFs for LLM datasets/training项目地址: https://gitcode.com/GitHub_Trending/ol/olmocr创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表