重置项目并建立文档治理基础架构
- 移除旧清洗器、规则、测试和打包配置 - 增加 AGENTS.md 与 CLAUDE.md 同步协作规范 - 建立 research-wiki 文档生命周期和首个设计记录
This commit is contained in:
@@ -1,93 +1,67 @@
|
||||
# govdoc-md-cleaner
|
||||
|
||||
政务文档(招标 / 投标 / 采购 / 合同)**PDF→Markdown 产物**的规则化清洗工具。
|
||||
政务文档 PDF→Markdown 清洗方向的独立研究与治理仓库。
|
||||
|
||||
上游解析管线(MinerU / OCR)把 PDF 转成 Markdown 后,会带入大量非正文噪音:
|
||||
逐页重复的页眉页脚、页码行、目录点线、死链图片引用、压成单行的 HTML 表格、
|
||||
行尾硬换行双空格,以及 OCR 重复崩坏段。本工具用一套 **YAML 声明、按序应用、
|
||||
逐条统计** 的规则把它们清掉,输出可直接进入比对 / RAG / 审核管线的干净 Markdown。
|
||||
本仓库用于澄清清洗问题、记录设计选择、积累可复核证据,并在方案获得确认后再建立实现。
|
||||
它目前不是可安装的 Python 包,也不提供命令行工具或生产接口。
|
||||
|
||||
## 数据来源
|
||||
## 当前阶段
|
||||
|
||||
清洗目标为 `/home/lihaoze/gov_test_data`(律所上传的真实政务文件的筛选子集,
|
||||
详见其 `compare/readme.md`),未来会持续接入更多批次的 Markdown 文件。
|
||||
**本项目只包含清洗代码与规则,不包含任何业务数据**——测试数据不入库。
|
||||
2026-08-20 已完成仓库重置与最小文档治理骨架:
|
||||
|
||||
## 清洗规则(rules/default.yaml)
|
||||
- 原有 Python 实现、YAML 规则、测试和打包配置已经移除;
|
||||
- `AGENTS.md` 与 `CLAUDE.md` 提供同步的协作规则;
|
||||
- `research-wiki/` 按文档生命周期区分设计、说明、参考、指南和草稿;
|
||||
- `research-wiki/design/0001-repository-foundation.md` 记录本次基础架构选择。
|
||||
|
||||
| 顺序 | 规则 | 处理对象 | 示例 |
|
||||
|---|---|---|---|
|
||||
| 10 | `strip_page_lines` | 页码行 | `第 3 页 共 53 页`、`第4页共4页`、`Page 3 of 10`、`- 4 -` |
|
||||
| 20 | `strip_repeated_short_lines` | 页眉页脚 + OCR 崩坏 | 全篇重复 ≥3 次的短行;连续刷屏 ≥5 次(实测"审计程序"×1359) |
|
||||
| 30 | `strip_toc_dots` | 目录点线 | `第一章 投标邀请函 ………… 2` → 保留标题,删点线页码 |
|
||||
| 40 | `drop_images` | 死链图片 | ``、base64 内嵌图 |
|
||||
| 50 | `normalize_tables` | HTML 表格 | `<table><tr><td>…` 单行压缩 → Markdown 管道表格 |
|
||||
| 60 | `strip_stray_html` | 散落标签 | `<br/>` |
|
||||
| 70 | `rstrip_lines` | 行尾空白 | MinerU 每行行尾的双空格硬换行 |
|
||||
| 80 | `collapse_blank_lines` | 空行折叠 | 连续空行 → 1 行;裁掉文首文末 |
|
||||
当前没有清洗算法、可执行命令、运行依赖、测试套件或已批准的输入输出契约。
|
||||
目录存在只代表文档落点已经建立,不代表相应能力已经完成。
|
||||
|
||||
### 防误伤设计(来自真实数据踩坑)
|
||||
## 项目边界
|
||||
|
||||
- **protect 正则**:`投标人:(公章)`、`法定代表人签名:`、`日期: 年 月 日`、
|
||||
`致:xxx`、声明函结尾句——标书里逐章重复,**是正文模板不是页眉**,默认保护。
|
||||
- **内容形态豁免**:编号条款 `(1)…`、`1、…`、`一、…`、列表/表格行、
|
||||
`乙方:xxx` 字段行——平行结构天然重复,引擎侧直接不参与页眉判定。
|
||||
- **burst 检测**:同一短行连续刷屏 ≥5 次(间隔 ≤2 行)判为 OCR 重复崩坏,
|
||||
直接删除(003-10 案例出现"审计程序"连续 1359 行)。
|
||||
- 研究对象是 MinerU、OCR 等 PDF→Markdown 管线产生的噪音与清洗方法;
|
||||
- `/home/lihaoze/gov_test_data` 中的真实材料属于外部只读数据,不复制、不修改、不提交;
|
||||
- 任何清洗语义、规则格式、评估指标、代码目录或运行依赖,都应先形成设计记录并获得确认;
|
||||
- 研究结果只有经过独立评审后,才能进入其他产品或生产仓库。
|
||||
|
||||
## 安装
|
||||
## 目录结构
|
||||
|
||||
```bash
|
||||
pip install -e . # 或直接 python -m cleaner.cli(仅需 PyYAML)
|
||||
```
|
||||
|
||||
## 使用
|
||||
|
||||
```bash
|
||||
# 单文件:清洗 + 打印统计
|
||||
md-clean single input.md -o output.md --diff
|
||||
|
||||
# 批量:递归清洗目录下所有 .md,输出到平行目录 + JSON 报告
|
||||
md-clean batch /path/to/uploads -o /path/to/uploads_cleaned \
|
||||
--pattern "*.md" --report report.json
|
||||
|
||||
# 用自定义规则集(复制 default.yaml 改参数即可)
|
||||
md-clean batch uploads/ --rules rules/strict.yaml
|
||||
```
|
||||
|
||||
`--diff` 输出 unified diff,`report.json` 记录每个文件每条规则的命中数,
|
||||
清洗过程完全可审计、可回滚(重跑即得原结果的对照)。
|
||||
|
||||
## 项目结构
|
||||
|
||||
```
|
||||
```text
|
||||
govdoc-md-cleaner/
|
||||
├── cleaner/
|
||||
│ ├── cleaner.py # 引擎:按序应用规则,输出 CleanResult(text, stats)
|
||||
│ ├── rules.py # 规则实现 + REGISTRY + YAML 加载
|
||||
│ └── cli.py # single / batch 两个子命令
|
||||
├── rules/
|
||||
│ └── default.yaml # 默认规则集(顺序、开关、参数、protect 列表)
|
||||
├── tests/
|
||||
│ └── test_rules.py # 每条规则的最小样例 + 防误伤回归
|
||||
└── docs/
|
||||
└── RULES.md # 规则编写指南(新增规则的方法)
|
||||
├── AGENTS.md
|
||||
├── CLAUDE.md
|
||||
├── README.md
|
||||
└── research-wiki/
|
||||
├── README.md
|
||||
├── design/ # 方案选择与冻结决策
|
||||
├── explanation/ # 当前有效机制及原因
|
||||
├── reference/ # 需要准确查询的稳定事实
|
||||
├── guides/ # 已实际验证的操作步骤
|
||||
└── scratch/ # 调研笔记和未收敛草稿
|
||||
```
|
||||
|
||||
## 新增一条规则
|
||||
## 开始工作
|
||||
|
||||
1. `cleaner/rules.py`:实现 `_your_rule(text, params, stats) -> text`,注册进 `REGISTRY`;
|
||||
2. `rules/default.yaml`:追加 `- name: your_rule / order: / params:`;
|
||||
3. `tests/test_rules.py`:加一个真实数据浓缩出的最小样例。
|
||||
进入仓库后依次阅读:
|
||||
|
||||
原则:**规则只删噪音不删正文**;拿不准的形态默认保留,靠 protect/exempt 收紧。
|
||||
1. 本文件,确认当前阶段;
|
||||
2. `AGENTS.md` 或 `CLAUDE.md`,确认协作与安全边界;
|
||||
3. `research-wiki/README.md`,确认文档应放在哪里;
|
||||
4. 与任务直接相关的 `research-wiki/design/` 记录。
|
||||
|
||||
## 测试
|
||||
下一项实质工作开始前,应新增下一编号的 design,明确问题、备选方案、输入范围、验收方法和非目标。
|
||||
|
||||
## 当前可用检查
|
||||
|
||||
```bash
|
||||
python -m unittest discover tests -v
|
||||
# 两份 Agent 入口除标题外必须一致;无输出且退出码为 0 表示通过
|
||||
diff -u <(tail -n +2 AGENTS.md) <(tail -n +2 CLAUDE.md)
|
||||
|
||||
# 查看当前 Wiki 中实际存在的文档
|
||||
find research-wiki -maxdepth 2 -type f | sort
|
||||
|
||||
# 检查本地变更
|
||||
git status --short
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
MIT
|
||||
当前没有测试命令;在真实实现和测试体系获批并落地前,不应声明测试通过。
|
||||
|
||||
Reference in New Issue
Block a user