book-splitter — 小说全文分类索引工具
概述
将一本小说按 章节→分类 二维拆解,一次运行生成两套输出结构:
- 按章分 — 每章一个文件夹,内部按 父类→子类 存放该章片段
- 语料库 — 所有章节的片段按分类汇总到
语料库/,去掉章节层级,纯分类目录
快速开始
# 一步到位(小说可以是 .txt 或 .md,编码自动检测 UTF-8/GBK)
python .reasonix/skills/book-splitter/scripts/run_book_pipeline.py 你的小说.txt
运行完成后,当前目录下会生成:
你的小说/或你的小说_output/— 章节输出语料库/— 分类汇总语料库
命令参考
# 完整流程
python .reasonix/skills/book-splitter/scripts/run_book_pipeline.py <小说.txt> [输出目录名]
# 分步执行
python .reasonix/skills/book-splitter/scripts/split_chapter.py <小说.txt> [输出目录]
python .reasonix/skills/book-splitter/scripts/classify_chapter.py <章目录>
python .reasonix/skills/book-splitter/scripts/build_book_index.py <章节输出目录> [语料库目录]
# 查看规则引擎
python .reasonix/skills/book-splitter/scripts/rules.py
输出结构
输出A — 按章分
{输出目录}/
├── meta.json # 全书元信息
├── _全局统计.json # 全局分类分布
│
├── 第1章_章名/
│ ├── raw.md # 本章完整原文
│ ├── _分类统计.json # 本章分类统计
│ ├── 人物/
│ │ ├── 身份属性/
│ │ │ └── 身份属性_s0001-内容摘要前20字.md
│ │ ├── 性格心理/
│ │ ├── 对话/
│ │ └── ...
│ ├── 背景/
│ ├── 环境/
│ ├── 场景/
│ ├── 道具/
│ ├── 动作/
│ └── 叙述/
├── 第2章_章名/
│ └── ...
└── ...
输出B — 语料库
和章节输出同级,目录名为 语料库/:
语料库/ ← 数据语料库
├── _索引统计.json # 各子类文件数
│
├── 人物/
│ ├── 身份属性/ # 全书所有身份属性片段
│ │ ├── 第1章_章名_身份属性_s0001-内容摘要前20字.md
│ │ └── 第3章_章名_身份属性_s0005-内容摘要前20字.md
│ ├── 性格心理/
│ ├── 对话/
│ ├── 能力体系/
│ ├── 关系网络/
│ ├── 人物弧光/
│ └── 日历/
├── 背景/
│ ├── 时代与世界/
│ ├── 世界观/
│ ├── 势力阵营/
│ ├── 种族物种/
│ ├── 文化习俗/
│ ├── 经济货币/
│ └── 语言术语/
├── 环境/
│ ├── 自然环境/
│ └── 感官氛围/
├── 场景/
│ ├── 场景标识/
│ ├── 场景功能/
│ └── 场景内道具/
├── 道具/
│ ├── 道具档案/
│ └── 流转轨迹/
├── 动作/
│ └── 战斗/
└── 叙述/
├── 修辞文风/
├── 结构/
├── 章节信息/
└── 时间线/
文件名格式:{章名}_{子类}_{编号}-{内容摘要}.md
单个分类文件的格式
# 人物 · 身份属性
**来源片段**: `s0001`
**置信度**: 0.92
**实体**: 人物名A · 人物名B
**LLM待复核**: 否
**摘要**: 少年约莫十七八岁,身穿洗得发白的青布长衫...
---
(完整原文片段)
文件命名规则
- 语料库中:
第1章_浮村初遇_身份属性_s0001-少年约莫十七八岁.md={章目录名}_{子类}_{片段编号}-{内容摘要}.md - 同一片段可出现在多个分类目录(一文多归)
- 片段编号
s{序号}按原文顺序排列,保留阅读顺序
检索方式
# 在语料库中查找某实体
grep -r "主角名" --include="*.md" 语料库/
# 查看语料库统计
cat 语料库/_索引统计.json
# 查看某章的完整分类统计
cat 第1章_章名/_分类统计.json
# 全书统计
cat _全局统计.json
分类体系(26 个子类)
| 父类 | 子类 | 说明 | |------|------|------| | 人物 | 身份属性 | 姓名/年龄/外貌/职业 | | 人物 | 性格心理 | 个性/欲望/内心活动 | | 人物 | 日历 | 时间节点/昼夜 | | 人物 | 能力体系 | 功法/招式/境界 | | 人物 | 关系网络 | 社会/情感/利益关系 | | 人物 | 对话 | 内容/对象/情绪/潜台词 | | 人物 | 人物弧光 | 成长轨迹/隐藏秘密 | | 背景 | 时代与世界 | 纪年/历史节点/节日 | | 背景 | 世界观 | 底层法则/超凡规则 | | 背景 | 势力阵营 | 门派/家族/国家 | | 背景 | 种族物种 | 非人族群特征 | | 背景 | 文化习俗 | 礼仪/禁忌/服饰饮食 | | 背景 | 经济货币 | 货币体系/物价/资源 | | 背景 | 语言术语 | 特有词汇/黑话/咒语 | | 环境 | 自然环境 | 地理/气候/天象(客观) | | 环境 | 感官氛围 | 视听嗅触描写/情绪基调(主观) | | 场景 | 场景标识 | 名称/描述/场景切换 | | 场景 | 场景功能 | 推进/展示/营造 | | 场景 | 场景内道具 | 场景关联道具 | | 道具 | 道具档案 | 名称/类型/功能/设定 | | 道具 | 流转轨迹 | 持有者变化/传承 | | 动作 | 战斗 | 战斗描写 | | 叙述 | 修辞文风 | 比喻/象征/句式 | | 叙述 | 结构 | 顺叙/倒叙/插叙/视角切换 | | 叙述 | 章节信息 | 章名/字数/视角 | | 叙述 | 时间线 | 时间推进标记 |
分类规则引擎逻辑
- 规则匹配:关键词命中 + 正则模式 → 置信度 0.00-0.99
- 置信度分级:
- ≥0.80 → 直接入库(规则确定,
LLM待复核: 否) - 0.40-0.79 → 标记
LLM待复核: 是(需精分) - <0.40 → 丢弃 / 兜底归入"叙述·章节信息"
- ≥0.80 → 直接入库(规则确定,
- LLM 精分:对低置信度或多重匹配的片段,预留了 LLM 调用的桥接接口(
segment_has_llm_work()) - 一文多归:同一片段可匹配多个分类,全部写入对应目录
工作流
当用户请求解析一本小说时:
- 确认小说文件路径
- 运行:
python .reasonix/skills/book-splitter/scripts/run_book_pipeline.py <小说文件名> - 查看输出统计:
- 拆了多少章、多少语义片段
- 分类覆盖率、需要 LLM 精分的片段数
- 各分类的分布
- 向用户报告结果,询问下一步(浏览/搜索/LLM精分)
注意事项
- 编码:自动检测 UTF-8 / GBK / GB18030,无需手动指定
- 章节识别:支持
第X章/第X卷/序章/楔子/引子/尾声/番外等格式;无标题时自动按 4000 字分卷 - 语料库:每次运行清空重建,不保留旧数据
- LLM 精分:当前仅实现了规则引擎,
LLM待复核: 是的片段预留了 bridge,需自行触发 - 文件编码:所有输出文件为 UTF-8
Scan to join WeChat group