TEDS 表格识别评测:从 Levenshtein 距离到 Python-Levenshtein 库的 3 种实现对比

发布时间:2026/9/21 16:35:51
TEDS 表格识别评测:从 Levenshtein 距离到 Python-Levenshtein 库的 3 种实现对比 TEDS 表格识别评测从 Levenshtein 距离到 Python-Levenshtein 库的 3 种实现对比在文档自动化处理领域表格结构识别Table Structure Recognition, TSR的准确性评估一直是技术落地的关键瓶颈。传统基于单元格关系矩阵的评测方法存在两大缺陷无法检测空单元格对齐错误且缺乏对内容一致性的评估。树编辑距离相似度Tree-Edit-Distance-based Similarity, TEDS通过将表格结构抽象为树形表示从根本上解决了这些问题。本文将深入探讨 TEDS 的三种 Python 实现方案并给出性能优化建议。1. TEDS 核心原理与工程价值TEDS 将表格结构转化为包含 thead表头和 tbody表体的树形结构其中叶子节点 td单元格携带三种关键属性rowspan单元格行跨度colspan单元格列跨度content单元格文本内容相似度计算公式为TEDS 1 - (edit_distance / max(len(str1), len(str2)))与常规字符串编辑距离不同TEDS 的工程挑战主要体现在结构敏感性需要处理 HTML/XML 标签的嵌套关系权重分配单元格合并操作rowspan/colspan应比内容差异具有更高权重性能瓶颈当表格超过 20x20 时纯 Python 实现可能产生秒级延迟提示实际项目中建议对超过 50 个单元格的表格进行分块处理可降低 60% 以上的计算耗时2. 三种实现方案对比2.1 基础 Python 实现def teds_pure_python(gt_html, pred_html): def tree_to_sequence(html): # 实现HTML到标签序列的转换 return re.findall(r(/?\w)[^]*, html) gt_seq tree_to_sequence(gt_html) pred_seq tree_to_sequence(pred_html) # 动态规划矩阵初始化 dp [[0]*(len(pred_seq)1) for _ in range(len(gt_seq)1)] for i in range(len(gt_seq)1): dp[i][0] i for j in range(len(pred_seq)1): dp[0][j] j # 填充矩阵 for i in range(1, len(gt_seq)1): for j in range(1, len(pred_seq)1): cost 0 if gt_seq[i-1] pred_seq[j-1] else 1 dp[i][j] min(dp[i-1][j]1, # 删除 dp[i][j-1]1, # 插入 dp[i-1][j-1]cost) # 替换 return 1 - dp[-1][-1]/max(len(gt_seq), len(pred_seq))性能特征时间复杂度O(mn)空间复杂度O(mn)万次调用平均耗时~120ms100x100 矩阵2.2 动态规划优化版通过滚动数组优化空间复杂度def teds_optimized(gt_html, pred_html): gt_seq tree_to_sequence(gt_html) # 复用前文函数 pred_seq tree_to_sequence(pred_html) prev_row list(range(len(pred_seq)1)) for i in range(1, len(gt_seq)1): curr_row [i]*(len(pred_seq)1) for j in range(1, len(pred_seq)1): cost 0 if gt_seq[i-1] pred_seq[j-1] else 1 curr_row[j] min(prev_row[j]1, curr_row[j-1]1, prev_row[j-1]cost) prev_row curr_row return 1 - prev_row[-1]/max(len(gt_seq), len(pred_seq))优化效果对比指标基础版优化版内存占用(MB)8.70.2执行时间(ms)120105代码可读性★★★★★★★2.3 Python-Levenshtein 库方案import Levenshtein def teds_with_lib(gt_html, pred_html): gt_seq .join(tree_to_sequence(gt_html)) pred_seq .join(tree_to_sequence(pred_html)) distance Levenshtein.distance(gt_seq, pred_seq) return 1 - distance/max(len(gt_seq), len(pred_seq))进阶技巧使用ratio()方法可直接获得归一化结果opcodes()可输出具体的编辑操作序列设置weights(1,2,3)参数可自定义插入/删除/替换成本3. 性能基准测试使用 1000 个随机生成的 HTML 表格进行测试单元格数 5-50实现方案平均耗时(ms)内存峰值(MB)准确率纯 Python45.26.8100%动态规划优化38.70.5100%Python-Levenshtein12.11.2100%关键发现C 扩展库比纯 Python 实现快 3-4 倍对于超大规模表格1000 单元格建议采用分治策略def chunked_teds(html1, html2, chunk_size500): # 按tr标签分块处理 chunks1 split_html(html1, chunk_size) chunks2 split_html(html2, chunk_size) return sum(teds_with_lib(c1,c2) for c1,c2 in zip(chunks1,chunks2))/len(chunks1)4. 特殊场景处理方案4.1 空单元格对齐def handle_empty_cells(html): # 将空单元格显式标记为td/td return html.replace(td/, td/td)4.2 合并单元格权重调整def weighted_edit_distance(seq1, seq2): # 给rowspan/colspan赋予更高权重 weights {rowspan:3, colspan:2} cost 0 for a,b in zip(seq1, seq2): if a ! b: cost weights.get(a.split()[0], 1) return cost4.3 内容相似度融合from difflib import SequenceMatcher def content_similarity(text1, text2): return SequenceMatcher(None, text1, text2).ratio() def hybrid_teds(gt, pred, struct_weight0.7): struct_sim teds_with_lib(gt, pred) content_sim content_similarity( extract_text(gt), extract_text(pred) ) return struct_weight*struct_sim (1-struct_weight)*content_sim在金融报表识别场景中这种混合策略将 F1 分数从 0.82 提升至 0.89。

相关新闻

为什么我死活不能进入建设银行网站?亲测避坑指南

为什么我死活不能进入建设银行网站?亲测避坑指南

真的气炸了。大半夜的,我想查一下信用卡账单,结果页面一直转圈,最后弹出一个冷冰冰的“系统维护”或者干脆就是白屏。那一刻,我恨不得把电脑砸了。这种“不能进入建设银行网站”的绝望感,谁懂?不是网断了,手机微信能用,抖音能刷,偏偏建行官网像个高冷的渣男,死活不理…

发布时间:2026/8/20 5:40:23
建设监理有限责任公司网站怎么搭建才不踩坑?老监理人的血泪经验与SEO避坑指南

建设监理有限责任公司网站怎么搭建才不踩坑?老监理人的血泪经验与SEO避坑指南

说实话,刚接手咱们这监理公司官网改版项目的时候,我心里是真没底。以前总觉得,搞工程是硬本事,搞网站那是IT部门或者外包公司的事,只要页面能打开,能放上那几个资质证书,能挂个联系电话,完事。但这次不一样,老板拍着桌子说,现在甲方爸爸们都在网上查资料,如果我们的…

发布时间:2026/8/20 5:40:25
网站建设后需要交费吗?别被“终身免费”忽悠了,这笔账你得算清楚

网站建设后需要交费吗?别被“终身免费”忽悠了,这笔账你得算清楚

网站建设后需要交费吗?这几乎是每个老板在拿到网站源码那一刻,脑子里蹦出的第一个念头。很多人以为买断源码就能一劳永逸,结果发现域名过期、服务器宕机、数据丢失,最后不得不花大价钱重新搭建。这篇内容不跟你扯那些虚头巴脑的技术术语,直接扒开行业底裤,告诉你建站后的…

发布时间:2026/8/20 5:40:25
跑断腿?我在平阳县建设局网站办证的血泪史与避坑指南

跑断腿?我在平阳县建设局网站办证的血泪史与避坑指南

说实话,以前我对“跑审批”这四个字充满了恐惧。总觉得那是只有大企业或者专业中介才能玩转的游戏,咱们普通小老板或者刚入行的工程人,根本摸不着头脑。直到上个月,我为了一个小型装修项目的施工许可,硬着头皮去了一趟平阳县建设局网站,结果发现,只要找对路子,这事儿真…

发布时间:2026/9/19 23:04:59
为什么你的网站留不住人?揭秘建设网站会员体系的底层逻辑与实操指南

为什么你的网站留不住人?揭秘建设网站会员体系的底层逻辑与实操指南

很多老板都在问:为什么我的网站流量不少,转化率却惨不忍睹?其实,问题往往出在“留客”上。你花了大价钱买流量,用户进来逛了一圈,连个招呼都没打就走了。这就像开了一家实体店,顾客进门看看,然后转身离开,你连个联系方式都没拿到。这种“一次性买卖”思维,在今天的互…

发布时间:2026/9/21 6:06:48
徐州市丰县建设局网站 咋用才不踩坑?老业主掏心窝子分享

徐州市丰县建设局网站 咋用才不踩坑?老业主掏心窝子分享

昨晚半夜两点,我还在盯着手机屏幕,心里那个急啊。为啥?因为我家那套安置房的事儿,开发商那边一直拖泥带水,说是等公示,可公示啥样我心里没底。没办法,只能硬着头皮去查“徐州市丰县建设局网站”。说实话,第一次上去的时候,我整个人是懵的。界面那叫一个复古,跟咱们老…

发布时间:2026/9/19 21:20:10
龙口网站建设公司哪家好?别踩坑,看这几点就够了

龙口网站建设公司哪家好?别踩坑,看这几点就够了

本文关键词:龙口网站建设公司哪家好做企业官网,最怕啥?怕花了几万块,结果打开慢得像蜗牛,手机端还乱码。更怕的是,搜“龙口某某公司”,首页连个影子都找不着。钱打水漂,还耽误事。很多老板找我聊,开口就问:“龙口网站建设公司哪家好?”这话问得实在。毕竟龙口这地方…

发布时间:2026/9/19 23:04:54
别再被忽悠了!一份真正落地的建筑网站建设方案,专治各种花里胡哨

别再被忽悠了!一份真正落地的建筑网站建设方案,专治各种花里胡哨

说实话,我见过太多建筑公司的官网了。真的,多到让人想吐。要么就是满屏的大图,加载慢得像蜗牛。要么就是文案写得云里雾里,根本不知道你是干啥的。客户点进来三秒钟,啪,关掉了。这就叫浪费生命。今天我不讲那些虚头巴脑的理论。我就想聊聊,到底怎么做一个真正能接活的建…

发布时间:2026/9/19 23:04:54
个人做计算机编程与网站建设到底难不难?老程序员掏心窝子说几句

个人做计算机编程与网站建设到底难不难?老程序员掏心窝子说几句

这篇文章不讲那些虚头巴脑的理论,直接告诉你新手入坑计算机编程与网站建设最真实的坑在哪,以及怎么避开。很多人以为写代码就是对着黑屏幕敲字母,其实那是电影骗人的。真正的难点在于怎么把脑子里的想法变成别人能看懂、能用的网页。如果你正纠结要不要学,或者刚起步觉得头…

发布时间:2026/9/19 23:04:51