清洗管线重构为严格三层架构:
- tango_analyser.py(底层:单词分析)
- task_processor.py(中层:文件 I/O、桶管理)
- workflow.py(顶层:状态机、任务推进)
- 移除旧的 batch_processor.py
新增配置文件系统:
- config.py:TOML 配置,相对路径相对配置文件目录解析
- 查找优先级 --config > cwd > 项目根 > ~ > 默认值
- count=None 语义为处理到文件末尾
项目目录整理:
- 根脚本归档到 scripts/analysis 与 scripts/legacy
- 文档归档到 docs/{design,history,analysis}
- 临时报告移到 reports/(已 gitignore)
文档质量:
- 新增 .markdownlint.json 与 scripts/mdlint.cmd
- 修复全部 14 个 md 文件的 markdownlint 警告
测试:74 passed(8 cleaner + 31 workflow + 6 tango + 15 validator + 14 config)
5.2 KiB
5.2 KiB
日语词表处理规则(铁律)
本文件记录 xinbiaori_tobe.txt → xinbiaori.txt 的所有处理约定,流水线和人工都遵循。
数据格式
每行三段,用 : 分隔,段内用 | 对齐:
汉字|分段:假名|分段:拼音|分段
示例:中|国|人:ちゅう|ごく|じん:zhong|guo|ren
- 汉字段:每个汉字单独一段;连续假名(送り仮名/前后缀)合并为一段
- 假名段:与汉字段一一对应
- 拼音段:汉字对应拼音,假名段留空
处理规则
1. 词中没有汉字的 → 跳过不处理
汉字段不含任何汉字(纯英文、纯符号、纯片假名外来语等),直接跳过,放入单批忽略文件 skip.txt。
- 例:
IT:アイティー:、WTO:...、Japan Railways:...、%:パーセント: - 判断标准:汉字段用正则
[\u4e00-\u9fff]匹配不到任何字符
2. 含字母+汉字的混合词 → 正常处理
字母作为独立段,拼音填小写字母本身。
- 例:
阿|Q|正|伝:あ|キュー|せい|でん:a|q|zheng|zhuan - 例:
JC|自|動|車:ジェーシー|じ|どう|しゃ:jc|zi|dong|che
3. ~ 标记 → 作为任意长通配符对齐,~ 对应部分不输出
~(全角 ~ 或半角 ~)表示"省略的、无对应汉字的假名部分"。处理时把 ~ 当作
任意长通配符,与汉字 token 一起对齐,~ 吸收到的假名段和纯标点段都从输出中删除,
只保留汉字段和与汉字紧邻的送り仮名。
- する 动词:
発明~:はつめいします:→発|明:はつ|めい:fa|ming(~ 吸收「します」) - 名词省略前半:
~賞:ノーベルしょう:→賞:しょう:shang(~ 吸收「ノーベル」) - 名词省略后半:
飲料~:いんりょうメーカー:→飲|料:いん|りょう:yin|liao - 送り仮名保留:
干し~:ほしブドウ:→干|し:ほ|し:gan|(し 保留,~ 吸收「ブドウ」) - 对齐成功 → auto(无多音字)或 review_pinyin(含多音字)
- 对齐失败/多解无法定夺 → review_split,人工确认
4. ます形动词 → 转辞書形(原型)
- 五段:ます前 i段音 → u段音(かり→かる、き→く、し→す)
- 一段:ます → る(げます→げる)
- 用 jamdict 词典验证动词身份
- 词典唯一解 → 直接处理
- 词典歧义(如 にます→にる/ぬ)→ 放入 review_verb,人工查证
- 例:
預かります:あずかります:→預|かる:あず|かる:yu|
5. 完整表达/惯用句 → 保留原样(不砍词尾)
带 お/に/ください 等构成完整寒暄的整句,保留 します/でした。
- 例:
お先に失礼します→お|先|に|失|礼|します:お|さき|に|しつ|れい|します:|xian||shi|li|
6. 々(同字重复符号)→ 展开为前一个字
- 例:
我々:われわれ:→我|我:われ|われ:wo|wo - 例:
佐々木:ささき:→佐|佐|木:さ|さ|き:zuo|zuo|mu
7. 熟字训/特殊读音 → 词典无法分割的放 review_split 人工处理
- 例:田舎(いなか)、明日(あす)、お父さん(おとうさん)
拼音规则
- 多音字:只标记高频多音字黑名单(行/长/重/传等),其他直接用最常见读音
- 日本新字体:按对应的中文字标拼音(楽→le、伝→chuan、価→jia)
条数校验(铁律)
输入条数 = 各输出文件条数之和。条数不对,结果一定不对,必须排查。 去掉纯英文等跳过项后,剩余条数也要能对上。
工作流(任务化架构)
每次清洗是一个任务(Task),有独立配置、独立临时文件、状态机。
详见 WORKFLOW.md。核心流程:
- 创建任务:指定数据源 + 处理范围,任务独立目录
tasks/{id}/jclean create <id> --source data.txt --start 1 --count 300 - 处理一批:数据源只读,分流到单批文件(auto_done/skip/review_*)
jclean process <id> - 逐个 review:你指出问题 → AI 只记录 → 单文件说完后 AI 汇总
- 改代码重跑:AI 改字典/规则(不手改输出文件),重跑单个 review 桶
jclean reprocess <id> --bucket pinyin - 核对总数:review 全清零后,auto_done + skip == 原始输入有效条数
- 你说合并:AI 才合并(auto_done→vocabulary、skip→skipped,去重)
jclean merge <id>
命令行等价写法:
jclean=python -m pl_japanese.cleaner.cli=python scripts/clean.py。 流程需人工介入,推荐用tests/test_cleaner_workflow.py测试驱动协作。
两层文件结构
- 单批(临时,任务独立):auto_done / skip / review_{pinyin,split,verb,special}
- 最终权威(累积,只增去重):xinbiaori.txt / skipped_total.txt
铁律
- 数据源只读,绝不修改原文件
- review 是中间态,确认完必须清零
- 改代码而非手改输出文件
- 合并需人工授权,最终库只增不删
- 所有路径都是任务配置项,可覆盖
编码注意
- 所有文件用 UTF-8 无 BOM,换行 \n
- 写文件时禁止引入 BOM(EF BB BF)
- 控制台是 GBK,脚本输出避免使用非 ASCII 符号(如 ✅⚠️)