DataCurator — 本地数据清洗·提质·标签工具包
纯本地运行,零 API Token;三层流水线剔除低俗/重复/错别字/逻辑混乱数据, 用轻量打分器筛出高信息密度语料,并自动贴标签分类管理。
为什么不用纯 Skill?
| 维度 | Skill | 本地脚本(本工具) | |------|-------|------------------| | Token 成本 | 每次调用都烧 | 0(全本地) | | 批量能力 | 受上下文限制 | 百万级 | | 打分精度 | LLM 准但贵 | 小模型/统计够用且免费 | | 复用性 | 进会话才有 | 随时跑 |
结论:核心做成 Python 工具包,Skill 仅作可选调用入口(见下文方式 B)。
✨ v0.2.0 新特性
- CLI 美化:进度条 / 结果面板 / 指标表格使用 Rich 渲染(缺 rich 自动降级纯文本);Windows 终端中文不再乱码。
- 看板暗色模式:右上角 🌙 按钮一键切换深/浅色,适配暗色 IDE。
- 预览全文 tooltip:看板预览表鼠标悬停显示该条文本完整内容(不再截断 120 字)。
- 打分器去耦合:
typo_signal改为score(text, typo_signal=...)参数传入,移除跨层实例属性突变(修复非线程安全隐患)。 - completeness 维度重做:旧公式对正常文本恒为 0.925(纯噪声),新公式基于停用词密度+标点健康度+长度区间,对灌水/无标点长文能有效区分。
- Agent 无关 SKILL.md:自带通用
SKILL.md(agent_agnostic=true),任何能执行 shell 的 agent(WorkBuddy / 云端 agent / CI / 手动)用同一套 CLI 即可调用,不绑定任何私有协议。
架构
原始语料 → [L1 清洗] → [L2 打分] → [L3 标签] → 优质语料库
零Token 零Token* 零Token
- L1 清洗:SimHash 去重 / 错别字检测 / 低俗过滤 / 格式规范化
- L2 打分:纯统计特征(默认,零依赖)或 DistilBERT-tiny(可选)
- L3 标签:主题分类 / 难度等级 / 自定义标签,存 SQLite + JSON
安装
pip install -e . # 基础版(统计打分,约 5MB 依赖)
pip install -e ".[model]" # 额外启用模型打分器(~500MB)
三种使用方式
A. CLI 直接运行(推荐·批量·0 Token)
data-curator run \
--input ./sample_data/raw_sample.jsonl \
--output ./output/ \
--config config.example.yaml
可选参数:--no-excel(不导出 xlsx)· --no-dashboard(不生成看板)· --min-score N(覆盖阈值)· --db path(落 SQLite)· --verbose(打印逐条处理进度)
安装后也可用控制台脚本 data-curator run ...;未安装时直接用 python -m data_curator.cli run ...。
B. Skill 入口(可选·~500 Token/次调度)
本仓库自带 SKILL.md(agent_agnostic=true,不绑定 WorkBuddy 或任何 agent 平台)。
任何能执行 shell 命令的 agent 都按同一条 CLI 命令调用,例如 WorkBuddy 中通过 @skill:data-curator 触发后落到的就是上面的 run 子命令:
@skill:data-curator --input ./raw/ --output ./clean/ --min-score 60
SKILL.md 末尾另附「如何注册到 WorkBuddy」的可选步骤(不影响功能,云端 agent 无需该步骤)。
C. Python API 嵌入(集成到其他项目·0 Token)
from data_curator import Pipeline
pipe = Pipeline.from_config("config.example.yaml")
results = pipe.run([{"text": "高信息密度的优质语料..."}])
for r in results.kept:
print(r.text, r.score, r.tags)
配置(config.example.yaml)
所有阈值 / 词库 / 标签体系均在 YAML 中可调,无需改代码:
clean:
min_length: 10 # 低于此字符数直接丢弃
max_length: 5000 # 高于此字符数截断或丢弃
dedup_threshold: 3 # SimHash 汉明距离阈值(越小越严格)
profanity_action: "remove" # remove | flag
score:
mode: "stat" # stat(默认)| model
min_score: 60 # 低于此分丢弃
weights: # 统计维度权重
info_density: 0.4
coherence: 0.3
completeness: 0.3
tag:
difficulty_levels: ["L1入门", "L2进阶", "L3专业", "L4专家"]
custom_labels: [] # 用户自定义标签规则
通用标签体系
默认内置一套通用标签(详见 data_curator/taggers/default_tags.yaml):
| 大类 | 示例标签 | |------|---------| | 主题 | 科技/商业/教育/文学/生活/医疗/法律/其他 | | 文体 | 叙事/说明/议论/对话/列表/代码 | | 难度 | L1入门 / L2进阶 / L3专业 / L4专家 | | 质量信号 | 高信息密度/逻辑清晰/含实例/含数据 |
标签可通过 YAML 自由扩展,支持关键词映射与正则规则。
Token 成本实测
| 场景 | Token | |------|-------| | 1万条语料全流水线(CLI) | 0 | | Skill 调度一次(仅返回摘要) | ~500 |
输出产物
--output 目录下生成:
| 文件 | 说明 |
|------|------|
| curated.jsonl | 优质语料(text/score/维度分/tags/meta),供二次处理 |
| curated.csv | 同上,CSV 格式(UTF-8-BOM,Excel 直接打开中文不乱码) |
| curated.xlsx | 同上,Excel 格式(需 pandas+openpyxl) |
| dropped.jsonl / .csv / .xlsx | 被丢弃的语料及原因(duplicate/profanity/low_score/length) |
| dashboard.html | 标签可视化看板(交互版):概览卡片 + 标签分布(可点击筛选)+ 质量分直方图(阈值线)+ 丢弃原因 + 预览表(离线自包含,双击浏览器打开) |
| report.json / report.md | 机器/人类可读的统计报告 |
看板为纯手写 SVG + 原生 JS,无 CDN 依赖,离线可用;中文靠浏览器字体正常显示。交互能力:① 标签条可点击筛选(多选取并集,再点取消,顶部显示已选标签可单独移除);② 分数阈值滑动条,与「当前显示条数 / 占比 / 平均质量分」实时卡、标签图、直方图(红虚线标记当前阈值)、预览表实时联动;③ 一键「重置筛选」;④ 右上角 🌙 按钮切换暗色模式;⑤ 预览表行文本悬停显示全文(tooltip 不再截断 120 字)。阈值滑动条默认值为流水线 min_score。
License
MIT
Scan to join WeChat group