OCR 转 Markdown 清理 Skill
针对 OCR 工具转出的 .md 文件,执行 9 项自动清理。核心脚本 scripts/ocr_md_clean.py,纯 Python 零依赖。
触发条件
用户说以下任何意图时,使用此 Skill:
- "这个 OCR 转的文件格式很乱 / 有 HTML 表格"
- "清理 PDF 转出来的 md"
- "PaddleOCR 的文件怎么全是 <table> 标签"
- "帮我整理这个 OCR md 文件"
- 文件名含
_by_PaddleOCR、OCR、pdf转的 md 文件需要整理
功能清单
| # | 功能 | 说明 |
|---|---|---|
| 1 | HTML table 解包 | OCR 把正文塞进 <table> 标签 → 提取 <td> 内容为普通段落 |
| 2 | 广告行清理 | 删除文件头部的引流广告行(加微信/公众号推广) |
| 3 | 目录区格式化 | 陈昌文:xxx.....页码 → - 陈昌文:xxx 列表 |
| 4 | LaTeX 残留清理 | 清理 $ ^{*} $ 等 OCR 带入的 LaTeX 符号残留 |
| 5 | 页眉/页脚噪声清理 | 删除重复出现的页眉标题(保留首次)、页眉变体、裸行页眉 |
| 6 | 标题修复 | 统一章节标题为 ##/###/####;补齐被埋标题;删除重复标题;多个 # 只保留书名(--keep-h1 可跳过降级) |
| 7 | OCR 错别字修复 | 内置常见词表 + 上下文规则(那人→男人);--no-typo 完全跳过 |
| 8 | 断句修复 | 修复表格边界断句("希望有一【表格】个温暖的家") |
| 9 | 空行清理 | 连续空行合并为 1 个,去首尾空行 |
使用方法
# 基本用法:输出到 <原名>_clean.md
python scripts/ocr_md_clean.py input.md
# 指定输出文件
python scripts/ocr_md_clean.py input.md -o output.md
# 跳过错别字修复(内置词表+上下文规则全跳过,只做结构清理)
# 适用于电子书直转(mobi/epub 转 md)等无 OCR 错误的文件,避免误伤原文
python scripts/ocr_md_clean.py input.md --no-typo
# 保留多个 # 一级标题(电子书直转等多章节并列文件;OCR 书籍默认会降级为 ##)
python scripts/ocr_md_clean.py input.md --no-typo --keep-h1
# 自定义错别字表(每行: 错误词 正确词)
python scripts/ocr_md_clean.py input.md --custom-typos my_typos.txt
自定义错别字表格式
# 每行: 错误词 正确词(空格分隔)
这是错字 这是对字
另一个错 另一个对
处理规则说明
HTML table 解包
- 匹配
<table>...</table>整块,提取所有<td>内容 - 每个
<td>转为一个段落(空行分隔) colspan等属性自动忽略- 残留的零散
<td>/<tr>/<table>标签一并清理
标题修复逻辑
#{1,6} 陈昌文:xxx→ 统一为## 陈昌文:xxx- 裸行
陈昌文:xxx(不含标点结尾、长度<60)→ 判定为被埋在表格里的标题:
- 若全文已有同名标题 → 删除(表格内重复)
- 否则 → 提升为##标题 - 常见章节模式归一层级:
第X部分→##、第X章→###、文案N:→###、日期→###、陈昌文方法之X→#### - 相邻重复标题兜底删除
- 多个
#一级标题:只保留第一个(书名),其余降为##
页眉噪声清理逻辑
OCR 常把书页页眉识别成标题并重复几十次。处理:
- 同一标题文本出现 ≥3 次 → 判定为页眉噪声,保留首次,其余删除
- 页眉变体(页眉+后缀,如
页眉 2023.9.2 文案 3 条)→ 剥离前缀,保留有效后缀为标题 - 裸行页眉(页眉被识别成正文行)→ 直接删除
广告行清理逻辑
- 检查文件头部 3 行 + 尾部 3 行(广告常出现在首尾)
- 模式:加微信/公众号推广、更多了解请加微信、行尾微信号等
- 注意:只清理首尾孤立广告行,正文中的营销话术不删(那是正文内容)
LaTeX 残留清理逻辑
$ ^{*} $/$^{*}$等纯符号残留 → 删除(只匹配中间为\ ^ _ { } * + -空格 的残留)- 孤立
$(后跟中文/中文标点,如$。感恩、$乐帝国)→ 删除 - 保留:货币符号(
HK$398.00)、公式($ 40\times398=16919 $)
目录区格式化逻辑
- 匹配
陈昌文:xxx.....页码和陈昌文方法之xxx.....页码两种格式 - 转为
- xxxMarkdown 列表
OCR 错别字表
内置高置信度词表(直接替换):
- 撕力竭地→歇斯底里、谎胆包天→胆大包天、果这一生→过这一生
- 莫某→某某、从新跟着→重新跟着、归回家庭→回归家庭
- 着东西→这东西、一点有了→一旦有了、按装→安装、既使→即使 等
上下文规则(仅在特定搭配时替换,避免误伤):
- 那人+动词 → 男人+动词(那人不/越/会/基本/很/更/当/觉得/非常/是/就)
- 优秀的那人 → 优秀的男人
- 重复字:您您→您、的的→的
输出
默认输出到 <原文件名>_clean.md(不覆盖原文件),并打印清理报告:
📊 清理报告:
HTML表格解包: tables=5; cells=86
广告行清理: ads_removed=1
目录格式化: toc_items=17
LaTeX残留清理: latex_removed=20
页眉噪声清理: header_noise_removed=95; header_variants_removed=10; bare_header_removed=16
标题修复: promoted=4; duplicates_removed=1; levels_normalized=253
错别字修复: 撕力竭地→歇斯底里=2; ...
断句修复: 希望有一→有一个=1; 断行合并(了)=1
空行清理: blank_lines_removed=3
注意事项
- 错别字修复基于正则匹配,可能误杀。重要文件先跑一遍看报告,再用
--no-typo或自定义词表调整。 - 上下文规则(那人→男人)有特定搭配限制,规避误伤,但不同文档的 OCR 错误模式可能不同,可通过
--custom-typos补充。 - 页眉噪声判定基于"重复 ≥3 次",阈值可用
min_repeat参数调整(脚本内函数参数)。 - LaTeX 清理只删纯符号残留(
$ ^{*} $),不会误删公式(如$ 40\times398=16919 $会保留)。 - 与 ww-md-format 配合(推荐流水线):本 Skill 清理完成后,可再跑 ww-md-format 做格式优化(中英文空格/列表/链接)。⚠️ ww-md-format 必须禁用 clean(
--no-clean):营销/推广类书籍(如陈昌文系列)正文本身大量含"加微信""日日更新"等话术,ww-md-format 的广告检测会把这些正文误删。建议组合:ww-ocr-md-clean → ww-md-format --no-clean。 - 本 Skill 处理的是格式/结构/明显错别字;语义级润色、事实核对不在范围内。