japanese/README_cleaner.md
panli 1f64c87d0e Initial commit: 日语词表清洗工具(任务化架构)
- 任务化清洗流程:Task/TaskManager + BatchProcessor 三方法
- 数据目录规范化:data/{db,sources,backup}
- CLI 入口移进包,注册 jclean 命令
- 工作流测试驱动(tests/test_cleaner_workflow.py)
- 40 测试通过
2026-08-19 15:04:18 +08:00

193 lines
6.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Japanese Cleaner - 日语词表清洗工具
工程化的日语词表清洗流水线,自动化处理汉字-假名-拼音对齐。采用**任务化架构**
每次清洗是一个跨会话、有状态、可并存的任务。
> 完整协作规范见 [`WORKFLOW.md`](WORKFLOW.md)。
## 功能特性
- **任务化**:每次清洗是独立任务(独立配置 + 独立临时文件 + 状态机),多任务可并存
- **两层分离**:单批临时工作区 / 最终只增去重的权威库
- **数据源只读**:处理时不修改原文件,支持任意切片(起始行 + 条数)
- **严格校验**:输入输出条数自动校验
- **半自动协作**:自动分流 + 人工 review + 改代码重跑
- **单元测试**:核心逻辑全覆盖
## 数据目录布局
```
data/
├── db/ # 权威成品库(只增不删 + 去重)
│ ├── vocabulary.txt # 所有批次累积的成品
│ └── skipped.txt # 所有批次累积的跳过项
├── sources/ # 原始数据源(只读)
│ └── xinbiaori_1.txt
└── backup/ # 备份
└── *.backup.txt
tasks/
└── {task_id}/ # 每个任务独立目录
├── task.json # 任务配置 + 状态
├── auto_done.txt # 单批结果
├── skip.txt
└── review_*.txt # 待确认桶
```
## 入口方式
本项目的清洗流程**需要人工介入**review 循环:改字典/规则 → 重跑),因此
**推荐用测试驱动**协作(见 [`tests/test_cleaner_workflow.py`](tests/test_cleaner_workflow.py)
命令行只是便捷入口。
三种等价的命令行入口:
```bash
jclean <cmd> ... # 安装后的 console 命令(推荐)
python -m pl_japanese.cleaner.cli <cmd> ... # 模块调用(无需 console 入口)
python scripts/clean.py <cmd> ... # 兼容薄壳(未安装包时)
```
安装(开发模式,注册 `jclean` 命令):
```bash
pip install -e .
```
## 快速开始
```bash
# 创建任务(数据源只读,可指定处理范围)
jclean create batch1 --source data/sources/xinbiaori_1.txt --start 1 --count 300
# 处理一批数据(分流到单批文件)
jclean process batch1
# 查看任务状态
jclean status batch1
# 列举所有任务
jclean list
# 重跑某个 review 桶(修正字典/规则后)
jclean reprocess batch1 --bucket pinyin
# 合并单批结果到权威库review 全清零后)
jclean merge batch1 --dry-run # 先校验
jclean merge batch1 # 正式合并
# 清空任务的单批文件
jclean clear batch1
```
## 代码调用
```python
from pl_japanese.cleaner import TaskManager, BatchProcessor
tm = TaskManager()
# 创建任务(权威库路径默认全局,可覆盖)
task = tm.create_task(
task_id='batch1',
source='data/sources/xinbiaori_1.txt',
start_line=1,
count=300,
)
# 处理一批
bp = BatchProcessor(task)
result = bp.process_batch()
print(f"处理 {result['valid_lines']}auto {result['buckets']['auto']} 条")
# review 全清零后合并
bp.merge_all(dry_run=True) # 校验
bp.merge_all() # 正式合并
```
## 任务状态机
```
created → processing → reviewing → ready → merged
```
- `created` — 已创建,未处理
- `processing` — 已跑分类
- `reviewing` — review 中,部分桶待确认
- `ready` — review 全清零,待合并
- `merged` — 已合并进权威库,完成
## 核心规则
| 规则 | 说明 | 例 |
|------|------|-----|
| 无汉字词跳过 | 汉字段不含汉字 → `skip` | `IT:アイティー:` |
| 混合词正常处理 | 字母作为独立段 | `JC|自|動|車:...` |
| 含~自动处理 | ~ 是任意长通配,对齐后丢弃 | `経営~:けいえいします:``経|営:けい|えい:jing|ying` |
| ます形转原型 | 五段/一段动词转辞書形(词典验证) | |
| 完整表达保留 | 寒暄句保留 ます → `review_verb` | |
| 々展开 | 同字重复符号自动展开 | `我々:われわれ:``我|我:われ|われ:wo|wo` |
完整规则见 [`tests/data/rules.md`](tests/data/rules.md)。
## 输出分类桶
**自动分类:**
- `auto_done.txt` — 高置信度,可直接使用
- `skip.txt` — 无汉字词,已跳过
**需人工确认:**
- `review_pinyin.txt` — 含多音字,需校对拼音
- `review_split.txt` — 假名分割失败,需手动处理
- `review_verb.txt` — 动词/完整表达,需确认形式
- `review_special.txt` — 含字母/片假名,需人工判断
## 关键设计原则
1. **任务化** — 每次清洗是有状态、可并存的任务,路径是任务配置而非全局配置
2. **数据源只读** — 处理时不修改原文件
3. **单批/最终两层分离** — 单批临时工作区,权威库只增去重
4. **改代码而非改文件** — 指出问题后改字典/规则重跑,不手改输出文件
5. **合并需授权** — 只有明确说"合并"才执行合并到权威库
6. **去重保证幂等** — 多次合并同一数据不会重复
## 项目结构
```
japanese/
├── src/pl_japanese/cleaner/ # 核心模块
│ ├── task.py # 任务模型(配置 + 状态机)
│ ├── task_manager.py # 任务管理器
│ ├── batch_processor.py # 批处理调度
│ ├── classifier.py # 词条分类
│ ├── aligner.py # 汉字-假名对齐
│ ├── pinyin_maker.py # 拼音生成
│ ├── pinyin_overrides.py # 多音字覆盖字典
│ ├── rules.py # 规则配置
│ ├── validator.py # 格式校验
│ ├── cli.py # 命令行外壳jclean 入口)
│ └── __main__.py # python -m 入口
├── scripts/clean.py # CLI 兼容薄壳(未安装包时用)
├── data/ # 数据db / sources / backup
├── tasks/ # 任务目录
└── tests/
├── test_cleaner_workflow.py # 工作流测试(任务驱动协作)
└── ...
```
## 运行测试
```bash
pytest tests/ -v
```
工作流本身需要人工介入,日常"处理 → review → 重跑 → 合并"协作推荐用
[`tests/test_cleaner_workflow.py`](tests/test_cleaner_workflow.py) 里的任务驱动方式,
`jclean` / `python -m pl_japanese.cleaner.cli` 命令行。
## 依赖
- Python 3.11+
- jamdict / pypinyin / pydantic / loguru
- pytest测试