✨ ZZ-008-20260711 · 续写小说系统初始化 · ZHIZHI-INIT-54d2e1
之之编号: ZZ-008 推送日期: 2026-07-11 (D182) 类型: 系统初始化 (INIT) 版权: 属之之所有 主权: 之之 ICE-GL-ZHI∞ 平台: TCS 通感语言核系统 [推送者]: 朝暮 · ICE-GL-CM001 · WorkBuddy ⊢ 四书进度卡系统 ⊢ 12项自检精修引擎 v1.0 ⊢ WPS字数统计 + 细纲核对工具 ⊢ 标点检测清单 + 检测规范文档 ⊢ 协作记录模板 + 工作台Dashboard
This commit is contained in:
parent
c233c14cf7
commit
7cb8854b29
@ -0,0 +1,75 @@
|
||||
# 续写小说系统 · 工作台
|
||||
|
||||
> 维护者:朝暮 ICE-GL-CM001
|
||||
> 协作人:之之 ICE-GL-ZHI(整理·核对·检测)
|
||||
> 产出人:冰朔 ICE-GL∞ + 铸渊 ICE-GL-ZY001(细纲+正文)
|
||||
> 最后更新:2026-07-11
|
||||
|
||||
---
|
||||
|
||||
## 📊 四书状态总览
|
||||
|
||||
| 书名 | 作者 | 最新章节 | 今日待写 | 状态 | 上次问题 |
|
||||
|------|------|---------|---------|------|---------|
|
||||
| 肖轩(逆命仙途) | 之之 | 第 515 章 | 第 516 章起 | ⏳ 待审核 506-515 | 见进度卡 |
|
||||
| 沈婉凝(之之书2) | 之之 | 第 298 章 | 第 299 章起 | ⏳ 待审核 293-298 | 见进度卡 |
|
||||
| 许怀钰 | 冰朔 | 第 70 章 | 第 71 章起 | 🟢 可续写 | 见进度卡 |
|
||||
| 死亡病院 | 冰朔 | 第 46 章 | 第 47 章起 | 🟢 可续写 | 见进度卡 |
|
||||
|
||||
---
|
||||
|
||||
## 🔄 今日工作流
|
||||
|
||||
### 冰朔产出 → 之之处理
|
||||
|
||||
```
|
||||
冰朔写细纲 → 冰朔写正文(每本5章) → 推仓库
|
||||
↓
|
||||
之之拉取 → 整理(字数/排版) → 核对(细纲对比) → 检测(标点/序号/AI套路)
|
||||
↓
|
||||
朝暮协作 → 运行检测脚本 → 出报告 → 之之确认 → 推仓库更新
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📋 三步检测流程
|
||||
|
||||
### 第一步:整理
|
||||
- ✅ 字数控制:2000-2200字/章(WPS口径)
|
||||
- ✅ 排版统一:去除多余空行、统一换行格式
|
||||
- ⚠️ WPS统计方式 = 中文+中文标点+英文数字字母
|
||||
|
||||
### 第二步:核对
|
||||
- ✅ 正文 vs 细纲:逐章比对剧情点、关键事件
|
||||
- ✅ 英文单词检测:正文中不应出现英文
|
||||
- ✅ AI套路检测:第xxx章、重复结尾、模板化描写
|
||||
- ✅ 明显bug扫描:设定矛盾、人物穿越、时间线错乱
|
||||
|
||||
### 第三步:检测
|
||||
- ✅ 字数复检(WPS口径)
|
||||
- ✅ 标点符号:中文引号配对、句号主导、半角检测
|
||||
- ✅ 章节序号:连续性校验
|
||||
- ✅ 整体扫描:重复描写、衔接断裂、数值链条
|
||||
|
||||
---
|
||||
|
||||
## 🛠 工具
|
||||
|
||||
| 工具 | 路径 | 用途 |
|
||||
|------|------|------|
|
||||
| 自检精修 | `scripts/自检精修.py` | 8+项自动检测 |
|
||||
| WPS字数 | `scripts/wps_wordcount.py` | WPS口径字数统计 |
|
||||
| 检测规则 | `scripts/detection_rules.json` | 可配置检测规则 |
|
||||
|
||||
---
|
||||
|
||||
## 📝 详细进度
|
||||
|
||||
→ 各书进度卡:[progress-cards/](progress-cards/)
|
||||
→ 协作日志:[work-logs/](work-logs/)
|
||||
→ 检测规范:[specs/检测规范与标准.md](specs/检测规范与标准.md)
|
||||
|
||||
---
|
||||
|
||||
> ⊢ 朝暮 ICE-GL-CM001 · 2026-07-11
|
||||
> ⊢ 明天见频道 · novel-system
|
||||
@ -0,0 +1,143 @@
|
||||
# 续写小说系统 · 总索引
|
||||
|
||||
> ZZ-008(系统编号)· 2026-07-11
|
||||
> 朝暮 ICE-GL-CM001 · 明天见频道 · novel-system
|
||||
> 沿用的 ZZ 编号: ZZ-008(ZZ-001~007 已被阿念和朝暮前期使用)
|
||||
|
||||
---
|
||||
|
||||
## ⊢ 系统定位
|
||||
|
||||
⊢ 续写小说系统 · 之之协作工作台
|
||||
├── 所属频道:明天见(see-you-tomorrow-channel)
|
||||
├── 系统路径:`eternal-lake-heart/love-core/see-you-tomorrow-channel/novel-system/`
|
||||
├── 上游仓库:`guanghubingshuo.com/juzi/bingshuo/novel-system`(冰朔产出)
|
||||
├── 下游仓库:`guanghubingshuo.com/code/bingshuo/fifth-domain`(本系统)
|
||||
└── 国作登字-2026-A-00037559(肖轩修仙)
|
||||
|
||||
---
|
||||
|
||||
## ⊢ 三步骤工作流
|
||||
|
||||
```
|
||||
冰朔产出(细纲+正文,每本5章/天)
|
||||
↓ 推入 juzi/novel-system
|
||||
之之拉取
|
||||
↓
|
||||
┌─────────────────────────────────────┐
|
||||
│ 第一步:整理(朝暮协作) │
|
||||
│ · 字数检测(WPS口径 2000-2200) │
|
||||
│ · 排版格式统一 │
|
||||
├─────────────────────────────────────┤
|
||||
│ 第二步:核对(朝暮协作) │
|
||||
│ · 正文 vs 细纲比对 │
|
||||
│ · 英文单词扫描 │
|
||||
│ · AI套路检测 │
|
||||
│ · 明显bug扫描 │
|
||||
├─────────────────────────────────────┤
|
||||
│ 第三步:检测(朝暮协作) │
|
||||
│ · 标点符号复检 │
|
||||
│ · 章节序号校验 │
|
||||
│ · 整体质量扫描 │
|
||||
│ · 生成检测报告 │
|
||||
└─────────────────────────────────────┘
|
||||
↓ 之之确认 → 推仓库更新
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⊢ 文件索引
|
||||
|
||||
### 核心文件
|
||||
|
||||
| 文件 | 用途 |
|
||||
|------|------|
|
||||
| `INDEX.md` | 本文件,系统总索引 |
|
||||
| `DASHBOARD.md` | 四书工作台总览 |
|
||||
|
||||
### 进度卡
|
||||
|
||||
| 文件 | 书 |
|
||||
|------|-----|
|
||||
| `progress-cards/肖轩_进度卡.md` | 肖轩(逆命仙途)· 之之 · 男频修仙 |
|
||||
| `progress-cards/沈婉凝_进度卡.md` | 沈婉凝 · 之之 · 之之书2 |
|
||||
| `progress-cards/许怀钰_进度卡.md` | 许怀钰 · 冰朔 |
|
||||
| `progress-cards/死亡病院_进度卡.md` | 死亡病院 · 冰朔 |
|
||||
|
||||
### 检测脚本
|
||||
|
||||
| 文件 | 用途 |
|
||||
|------|------|
|
||||
| `scripts/自检精修.py` | 核心检测引擎 v1.0(12项检测) |
|
||||
| `scripts/细纲核对.py` | 细纲 vs 正文比对 |
|
||||
| `scripts/wps_wordcount.py` | WPS口径字数统计 |
|
||||
| `scripts/detection_rules.json` | 可配置检测规则 |
|
||||
|
||||
### 模板
|
||||
|
||||
| 文件 | 用途 |
|
||||
|------|------|
|
||||
| `templates/标点符号检测清单.md` | 标点检测步骤指南 |
|
||||
| `templates/细纲核对清单.md` | 细纲核对检查清单 |
|
||||
| `templates/协作记录模板.md` | 每日协作记录模板 |
|
||||
|
||||
### 规范文档
|
||||
|
||||
| 文件 | 用途 |
|
||||
|------|------|
|
||||
| `specs/检测规范与标准.md` | 完整检测标准文档 |
|
||||
|
||||
### 协作日志
|
||||
|
||||
| 目录 | 用途 |
|
||||
|------|------|
|
||||
| `work-logs/` | 每日协作记录 |
|
||||
|
||||
---
|
||||
|
||||
## ⊢ 朝暮协作协议
|
||||
|
||||
### 唤醒后
|
||||
1. 读 `INDEX.md`(本文件)
|
||||
2. 读 `DASHBOARD.md` 确认四书当前状态
|
||||
3. 读最新 `work-logs/` 了解上次进度
|
||||
4. 等待之之指示本次要处理哪本书
|
||||
|
||||
### 工作时
|
||||
- 按三步骤(整理→核对→检测)逐书处理
|
||||
- 每次处理一本书的五章
|
||||
- 发现问题记录但不中断
|
||||
- 全部完成后一次性报告
|
||||
|
||||
### 结束后
|
||||
1. 更新对应书的进度卡
|
||||
2. 更新 `DASHBOARD.md` 状态
|
||||
3. 写 `work-logs/YYYY-MM-DD.md` 协作记录
|
||||
4. 推送到 `bingshuo/fifth-domain` 仓库
|
||||
|
||||
---
|
||||
|
||||
## ⊢ 编号体系(子系统内部)
|
||||
|
||||
| 编号 | 分配 |
|
||||
|------|------|
|
||||
| ZZ-008 | 续写小说系统(本系统) |
|
||||
| ZZ-008-B1 | 肖轩进度卡 |
|
||||
| ZZ-008-B2 | 沈婉凝进度卡 |
|
||||
| ZZ-008-B3 | 许怀钰进度卡 |
|
||||
| ZZ-008-B4 | 死亡病院进度卡 |
|
||||
| ZZ-008-SC | 自检脚本集 |
|
||||
|
||||
---
|
||||
|
||||
## ⊢ 能力升级日志
|
||||
|
||||
| 日期 | 版本 | 升级内容 |
|
||||
|------|------|---------|
|
||||
| 2026-07-11 | v1.0 | 系统初始化:四书进度卡+12项检测引擎+三步骤模板 |
|
||||
|
||||
---
|
||||
|
||||
> ⊢ 朝暮 ICE-GL-CM001 · D182 · 2026-07-11
|
||||
> ⊢ 明天见频道 · novel-system · ZZ-008
|
||||
> ⊢ 国作登字-2026-A-00037559
|
||||
@ -0,0 +1,66 @@
|
||||
# 死亡病院 · 进度卡
|
||||
|
||||
> 类型:冰朔创作小说
|
||||
> 维护者:朝暮 ICE-GL-CM001
|
||||
> 最新更新:2026-07-11
|
||||
|
||||
---
|
||||
|
||||
## 📊 当前状态
|
||||
|
||||
| 项目 | 值 |
|
||||
|------|-----|
|
||||
| 最新章节 | 第 46 章 |
|
||||
| 有效正文范围 | 待确认 |
|
||||
| 待审核批次 | 待确认 |
|
||||
| 今日待写 | 第 47 章起 |
|
||||
| 状态 | 🟢 可续写 |
|
||||
| 细纲余量 | 待确认 |
|
||||
|
||||
---
|
||||
|
||||
## 📈 最新进度
|
||||
|
||||
| 项目 | 值 |
|
||||
|------|-----|
|
||||
| 最新进度 | 第 46 章 |
|
||||
| 日期 | 2026-07-09 |
|
||||
| 状态 | 🟢 可续写 |
|
||||
|
||||
---
|
||||
|
||||
## 🔑 写作标准
|
||||
|
||||
- 字数:2000-2200字/章(WPS口径)
|
||||
- 标点规范:句号主导 · 弯引号配对
|
||||
- 无英文单词 · 无半角标点
|
||||
|
||||
---
|
||||
|
||||
## 📂 仓库文件位置
|
||||
|
||||
```
|
||||
novel-system/chapters/
|
||||
novel-system/outlines/
|
||||
novel-system/archives/设定/死亡病院/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🐛 问题追踪
|
||||
|
||||
| 日期 | 章 | 问题类型 | 问题描述 | 状态 |
|
||||
|------|-----|---------|---------|------|
|
||||
| — | — | — | 待首次检测 | ⏳ |
|
||||
|
||||
---
|
||||
|
||||
## 📝 检测历史
|
||||
|
||||
| 日期 | 批次 | 检测结果 | 操作人 |
|
||||
|------|------|---------|--------|
|
||||
| — | — | 待首次检测 | — |
|
||||
|
||||
---
|
||||
|
||||
> ⊢ 朝暮 ICE-GL-CM001 · 明天见频道 · novel-system
|
||||
@ -0,0 +1,75 @@
|
||||
# 沈婉凝(之之书2)· 进度卡
|
||||
|
||||
> 类型:之之协作小说
|
||||
> 维护者:朝暮 ICE-GL-CM001
|
||||
> 最新更新:2026-07-11
|
||||
|
||||
---
|
||||
|
||||
## 📊 当前状态
|
||||
|
||||
| 项目 | 值 |
|
||||
|------|-----|
|
||||
| 最新章节 | 第 298 章 |
|
||||
| 有效正文范围 | 待确认 |
|
||||
| 待审核批次 | 第 293-298 章 |
|
||||
| 今日待写 | 第 299 章起 |
|
||||
| 状态 | ⏳ 待之之审核 |
|
||||
| 细纲余量 | 待确认 |
|
||||
|
||||
---
|
||||
|
||||
## 📈 最新批次详情
|
||||
|
||||
### 293-298 章(D170 · 冰朔 2026-07-10)
|
||||
|
||||
| 项目 | 值 |
|
||||
|------|-----|
|
||||
| 章节范围 | 293-298(6章) |
|
||||
| 总字数 | 12109字 |
|
||||
| 状态 | 🟢 完成,可续写 |
|
||||
|
||||
---
|
||||
|
||||
## 🔑 写作标准
|
||||
|
||||
- 字数:2000-2200字/章(WPS口径)
|
||||
- 标点规范:句号主导 · 弯引号配对
|
||||
- 无英文单词 · 无半角标点
|
||||
- 每章有推进,结尾有钩子
|
||||
|
||||
---
|
||||
|
||||
## 🔗 接续锚点
|
||||
|
||||
**298 章末:** 待提取
|
||||
|
||||
---
|
||||
|
||||
## 📂 仓库文件位置
|
||||
|
||||
```
|
||||
novel-system/chapters/之之书2/
|
||||
novel-system/outlines/
|
||||
novel-system/archives/之之书2/设定/沈婉凝/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🐛 问题追踪
|
||||
|
||||
| 日期 | 章 | 问题类型 | 问题描述 | 状态 |
|
||||
|------|-----|---------|---------|------|
|
||||
| — | — | — | 待首次检测 | ⏳ |
|
||||
|
||||
---
|
||||
|
||||
## 📝 检测历史
|
||||
|
||||
| 日期 | 批次 | 检测结果 | 操作人 |
|
||||
|------|------|---------|--------|
|
||||
| — | — | 待首次检测 | — |
|
||||
|
||||
---
|
||||
|
||||
> ⊢ 朝暮 ICE-GL-CM001 · 明天见频道 · novel-system
|
||||
@ -0,0 +1,93 @@
|
||||
# 肖轩(逆命仙途)· 进度卡
|
||||
|
||||
> 类型:之之协作小说 · 男频修仙
|
||||
> 维护者:朝暮 ICE-GL-CM001
|
||||
> 最新更新:2026-07-11
|
||||
|
||||
---
|
||||
|
||||
## 📊 当前状态
|
||||
|
||||
| 项目 | 值 |
|
||||
|------|-----|
|
||||
| 最新章节 | 第 515 章 |
|
||||
| 有效正文范围 | 第 407-515 章 |
|
||||
| 待审核批次 | 第 506-515 章(506-510重写 + 511-515新写) |
|
||||
| 今日待写 | 第 516 章起 |
|
||||
| 状态 | ⏳ 待之之审核 |
|
||||
| 细纲余量 | 0 章 🔴(需补516+细纲) |
|
||||
|
||||
---
|
||||
|
||||
## 📈 最新批次详情
|
||||
|
||||
### 511-515 章(D170 · 冰朔 2026-07-10)
|
||||
|
||||
| 章 | 标题 | 字数 | 标点 | 状态 |
|
||||
|----|------|------|------|------|
|
||||
| 511 | 门后 | 2002 | 句号291 逗号0 | ✅ |
|
||||
| 512 | 金的脸 | 2270 | 句号322 逗号0 | ✅ |
|
||||
| 513 | 白的碎片 | 2005 | 句号274 逗号0 | ✅ |
|
||||
| 514 | 烫 | 2007 | 句号275 逗号0 | ✅ |
|
||||
| 515 | 改写 | 2113 | 句号321 逗号0 | ✅ |
|
||||
| **合计** | | **10397** | — | ✅ |
|
||||
|
||||
剧情线:门后→金的脸→白碎片→吸收→改写规则
|
||||
数值变化:灰芽60%→66% · 法则1720万→1680万
|
||||
|
||||
---
|
||||
|
||||
## 🔑 写作标准
|
||||
|
||||
- 字数:2000-2200字/章(WPS口径)
|
||||
- 句号主导(句号:逗号 ≥ 5:1)
|
||||
- 问号:0
|
||||
- 破折号:≤2/章(【叮——】除外)
|
||||
- 弯引号配对
|
||||
- 每章:战斗 + 系统提示 + 能力升级
|
||||
- 结尾轮换:禁止重复使用门式收尾
|
||||
|
||||
---
|
||||
|
||||
## 🔗 接续锚点
|
||||
|
||||
**515 章末:** 肖轩改写规则成功 / 白色碎片融入身体 / 手臂变灰白相间 / 路自动生成往前延伸 / 路的尽头有灰白混光 / 光里站着一个人 / 穿灰色衣服 / 转过身来
|
||||
|
||||
---
|
||||
|
||||
## 📂 仓库文件位置
|
||||
|
||||
```
|
||||
novel-system/chapters/之之书1/
|
||||
├── 肖轩_docx/ ← 407-505章 .docx
|
||||
├── 肖轩506-510章.txt ← 重写版
|
||||
└── 肖轩511-515章.txt ← 新写版
|
||||
novel-system/outlines/
|
||||
├── 肖轩_506-510章细纲(重写).md
|
||||
└── 肖轩_511-515章细纲.md
|
||||
novel-system/progress-cards/
|
||||
└── 肖轩_进度卡.md
|
||||
novel-system/archives/之之书1/设定/肖轩/
|
||||
└── 人设/文风/历史章节
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🐛 问题追踪
|
||||
|
||||
| 日期 | 章 | 问题类型 | 问题描述 | 状态 |
|
||||
|------|-----|---------|---------|------|
|
||||
| — | — | — | 待首次检测 | ⏳ |
|
||||
|
||||
---
|
||||
|
||||
## 📝 检测历史
|
||||
|
||||
| 日期 | 批次 | 检测结果 | 操作人 |
|
||||
|------|------|---------|--------|
|
||||
| — | — | 待首次检测 | — |
|
||||
|
||||
---
|
||||
|
||||
> ⊢ 朝暮 ICE-GL-CM001 · 明天见频道 · novel-system
|
||||
> ⊢ 国作登字-2026-A-00037559
|
||||
@ -0,0 +1,67 @@
|
||||
# 许怀钰 · 进度卡
|
||||
|
||||
> 类型:冰朔创作小说
|
||||
> 维护者:朝暮 ICE-GL-CM001
|
||||
> 最新更新:2026-07-11
|
||||
|
||||
---
|
||||
|
||||
## 📊 当前状态
|
||||
|
||||
| 项目 | 值 |
|
||||
|------|-----|
|
||||
| 最新章节 | 第 70 章 |
|
||||
| 有效正文范围 | 待确认 |
|
||||
| 待审核批次 | 待确认 |
|
||||
| 今日待写 | 第 71 章起 |
|
||||
| 状态 | 🟢 可续写 |
|
||||
| 细纲余量 | 待确认 |
|
||||
| 备注 | 67-70 重写完成 |
|
||||
|
||||
---
|
||||
|
||||
## 📈 最新批次详情
|
||||
|
||||
| 项目 | 值 |
|
||||
|------|-----|
|
||||
| 最新进度 | 第 67-70 章重写完成 |
|
||||
| 日期 | 2026-07-09 |
|
||||
| 状态 | 🟢 可续写 |
|
||||
|
||||
---
|
||||
|
||||
## 🔑 写作标准
|
||||
|
||||
- 字数:2000-2200字/章(WPS口径)
|
||||
- 标点规范:句号主导 · 弯引号配对
|
||||
- 无英文单词 · 无半角标点
|
||||
|
||||
---
|
||||
|
||||
## 📂 仓库文件位置
|
||||
|
||||
```
|
||||
novel-system/chapters/
|
||||
novel-system/outlines/
|
||||
novel-system/archives/设定/许怀钰/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🐛 问题追踪
|
||||
|
||||
| 日期 | 章 | 问题类型 | 问题描述 | 状态 |
|
||||
|------|-----|---------|---------|------|
|
||||
| — | — | — | 待首次检测 | ⏳ |
|
||||
|
||||
---
|
||||
|
||||
## 📝 检测历史
|
||||
|
||||
| 日期 | 批次 | 检测结果 | 操作人 |
|
||||
|------|------|---------|--------|
|
||||
| — | — | 待首次检测 | — |
|
||||
|
||||
---
|
||||
|
||||
> ⊢ 朝暮 ICE-GL-CM001 · 明天见频道 · novel-system
|
||||
@ -0,0 +1,109 @@
|
||||
{
|
||||
"books": {
|
||||
"肖轩": {
|
||||
"type": "男频修仙",
|
||||
"author": "之之",
|
||||
"word_count_min": 2000,
|
||||
"word_count_max": 2200,
|
||||
"punctuation": {
|
||||
"period_comma_ratio_min": 3,
|
||||
"question_mark_max": 0,
|
||||
"dash_max_per_chapter": 2,
|
||||
"dash_exceptions": ["【叮——】"],
|
||||
"require_curly_quotes": true,
|
||||
"no_halfwidth": true
|
||||
},
|
||||
"per_chapter_required": ["战斗", "系统提示", "能力升级"],
|
||||
"ending_rotation": true,
|
||||
"ending_forbidden": ["门开", "推门", "开门", "按在门", "跨进去", "门合上", "门后", "朝.*走去", "向.*走"],
|
||||
"dialogue_tags_forbidden": ["眼神一冷", "嘴角一咧", "嘴角一翘", "嘴角一扬"],
|
||||
"system_prompt_format": "【叮——】",
|
||||
"system_prompt_per_chapter": [1, 3]
|
||||
},
|
||||
"沈婉凝": {
|
||||
"type": "之之书2",
|
||||
"author": "之之",
|
||||
"word_count_min": 2000,
|
||||
"word_count_max": 2200,
|
||||
"punctuation": {
|
||||
"period_comma_ratio_min": 3,
|
||||
"question_mark_max": 3,
|
||||
"dash_max_per_chapter": 3,
|
||||
"dash_exceptions": [],
|
||||
"require_curly_quotes": true,
|
||||
"no_halfwidth": true
|
||||
},
|
||||
"per_chapter_required": [],
|
||||
"ending_rotation": false,
|
||||
"ending_forbidden": [],
|
||||
"dialogue_tags_forbidden": [],
|
||||
"system_prompt_format": "",
|
||||
"system_prompt_per_chapter": [0, 0]
|
||||
},
|
||||
"许怀钰": {
|
||||
"type": "冰朔创作",
|
||||
"author": "冰朔",
|
||||
"word_count_min": 2000,
|
||||
"word_count_max": 2200,
|
||||
"punctuation": {
|
||||
"period_comma_ratio_min": 3,
|
||||
"question_mark_max": 5,
|
||||
"dash_max_per_chapter": 3,
|
||||
"dash_exceptions": [],
|
||||
"require_curly_quotes": true,
|
||||
"no_halfwidth": true
|
||||
},
|
||||
"per_chapter_required": [],
|
||||
"ending_rotation": false,
|
||||
"ending_forbidden": [],
|
||||
"dialogue_tags_forbidden": [],
|
||||
"system_prompt_format": "",
|
||||
"system_prompt_per_chapter": [0, 0]
|
||||
},
|
||||
"死亡病院": {
|
||||
"type": "冰朔创作",
|
||||
"author": "冰朔",
|
||||
"word_count_min": 2000,
|
||||
"word_count_max": 2200,
|
||||
"punctuation": {
|
||||
"period_comma_ratio_min": 3,
|
||||
"question_mark_max": 5,
|
||||
"dash_max_per_chapter": 3,
|
||||
"dash_exceptions": [],
|
||||
"require_curly_quotes": true,
|
||||
"no_halfwidth": true
|
||||
},
|
||||
"per_chapter_required": [],
|
||||
"ending_rotation": false,
|
||||
"ending_forbidden": [],
|
||||
"dialogue_tags_forbidden": [],
|
||||
"system_prompt_format": "",
|
||||
"system_prompt_per_chapter": [0, 0]
|
||||
}
|
||||
},
|
||||
"global_rules": {
|
||||
"ai_patterns": {
|
||||
"chapter_header_in_body": "第[零一二三四五六七八九十百千]+章",
|
||||
"chapter_self_reference": "本章|这一章|本章节",
|
||||
"author_self_reference": "作者|笔者|写到这里",
|
||||
"ai_disclaimer": "以上内容|以上是|以下是|请继续|如需|如有",
|
||||
"narration_intrusion": "读者|看官|且听|话说|却说|按下不表"
|
||||
},
|
||||
"english_detection": {
|
||||
"enabled": true,
|
||||
"allowed_words": [],
|
||||
"pattern": "[a-zA-Z]{2,}"
|
||||
},
|
||||
"repetition_detection": {
|
||||
"ending_similarity_threshold": 0.5,
|
||||
"ending_lines_count": 6,
|
||||
"paragraph_repetition_threshold": 0.7,
|
||||
"min_repetition_length": 30
|
||||
},
|
||||
"chapter_numbering": {
|
||||
"validate_sequence": true,
|
||||
"validate_no_duplicates": true,
|
||||
"validate_no_gaps": false
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,68 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
WPS口径字数统计工具
|
||||
朝暮 ICE-GL-CM001 · 明天见频道 · novel-system
|
||||
|
||||
WPS统计规则:
|
||||
- 中文字符 = 1字
|
||||
- 中文标点 = 1字
|
||||
- 英文单词 = 1字(连续的字母序列)
|
||||
- 数字序列 = 1字(连续的数字)
|
||||
- 英文空格 = 不计
|
||||
- 纯英文标点 = 不计
|
||||
|
||||
用法: python3 wps_wordcount.py <文件路径>
|
||||
python3 wps_wordcount.py <文件夹路径> # 批量统计
|
||||
"""
|
||||
|
||||
import sys, os, re
|
||||
|
||||
def wps_word_count(text):
|
||||
"""WPS口径字数统计"""
|
||||
chinese = len(re.findall(r'[\u4e00-\u9fff\u3000-\u303f\uff00-\uffef]', text))
|
||||
en_words = len(re.findall(r'[a-zA-Z0-9]+', text))
|
||||
return chinese + en_words
|
||||
|
||||
def count_file(filepath):
|
||||
"""统计单个文件"""
|
||||
with open(filepath, 'r', encoding='utf-8') as f:
|
||||
text = f.read()
|
||||
return wps_word_count(text)
|
||||
|
||||
def count_directory(dirpath):
|
||||
"""统计目录下所有txt文件"""
|
||||
results = []
|
||||
for fname in sorted(os.listdir(dirpath)):
|
||||
if fname.endswith('.txt'):
|
||||
fpath = os.path.join(dirpath, fname)
|
||||
wc = count_file(fpath)
|
||||
results.append((fname, wc))
|
||||
return results
|
||||
|
||||
def main():
|
||||
if len(sys.argv) < 2:
|
||||
print("用法: python3 wps_wordcount.py <文件或目录路径>")
|
||||
sys.exit(1)
|
||||
|
||||
path = sys.argv[1]
|
||||
|
||||
if os.path.isfile(path):
|
||||
wc = count_file(path)
|
||||
print(f"{os.path.basename(path)}: {wc} 字(WPS口径)")
|
||||
elif os.path.isdir(path):
|
||||
results = count_directory(path)
|
||||
total = 0
|
||||
print(f"{'文件名':<40} {'字数':>8} {'状态':>6}")
|
||||
print("-" * 56)
|
||||
for fname, wc in results:
|
||||
status = '✅' if 2000 <= wc <= 2200 else ('🔶' if wc < 2000 else '🔴')
|
||||
print(f"{fname:<40} {wc:>8} {status:>6}")
|
||||
total += wc
|
||||
print("-" * 56)
|
||||
print(f"{'合计':<40} {total:>8}")
|
||||
else:
|
||||
print(f"错误: '{path}' 不存在")
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@ -0,0 +1,171 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
细纲核对工具 v1.0
|
||||
朝暮 ICE-GL-CM001 · 明天见频道 · novel-system
|
||||
|
||||
功能:逐章比对正文与细纲,检测:
|
||||
- 剧情点覆盖率(细纲中的关键事件在正文中是否体现)
|
||||
- 设定矛盾(数值链条、状态变化)
|
||||
- 衔接连贯性
|
||||
|
||||
用法: python3 细纲核对.py <正文目录> <细纲文件.md>
|
||||
"""
|
||||
|
||||
import sys, os, re
|
||||
|
||||
def read_chapters(path):
|
||||
"""读取章节正文,返回 [(标题, 正文文本), ...]"""
|
||||
chapters = []
|
||||
txt_files = sorted([f for f in os.listdir(path) if f.endswith('.txt')])
|
||||
|
||||
for fname in txt_files:
|
||||
fpath = os.path.join(path, fname)
|
||||
with open(fpath, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
|
||||
lines = [l.strip() for l in content.split('\n') if l.strip()]
|
||||
current_ch, current_lines = None, []
|
||||
|
||||
for line in lines:
|
||||
if re.match(r'第[零一二三四五六七八九十百千\d]+章', line) and len(line) < 25:
|
||||
if current_ch:
|
||||
chapters.append((current_ch, '\n'.join(current_lines)))
|
||||
current_ch, current_lines = line, []
|
||||
else:
|
||||
current_lines.append(line)
|
||||
|
||||
if current_ch:
|
||||
chapters.append((current_ch, '\n'.join(current_lines)))
|
||||
|
||||
return chapters
|
||||
|
||||
def parse_outline(outline_path):
|
||||
"""解析细纲文件,提取每章的@lock和@scene"""
|
||||
with open(outline_path, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
|
||||
outline_chapters = []
|
||||
# 按 ## 第X章 分割
|
||||
sections = re.split(r'(## 第\d+章)', content)
|
||||
|
||||
current_title = None
|
||||
for i, section in enumerate(sections):
|
||||
if section.startswith('## 第'):
|
||||
current_title = section.strip('# ')
|
||||
elif current_title:
|
||||
# 提取关键信息
|
||||
lock_match = re.search(r'@lock:\s*(.+?)(?:\n|$)', section)
|
||||
scene_match = re.search(r'@scene:\s*(.+?)(?:\n|$)', section)
|
||||
trigger_match = re.search(r'@trigger:\s*(.+?)(?:\n|$)', section)
|
||||
emergence_match = re.search(r'@emergence:\s*(.+?)(?:\n|$)', section)
|
||||
|
||||
outline_chapters.append({
|
||||
'title': current_title,
|
||||
'lock': lock_match.group(1).strip() if lock_match else '',
|
||||
'scene': scene_match.group(1).strip() if scene_match else '',
|
||||
'trigger': trigger_match.group(1).strip() if trigger_match else '',
|
||||
'emergence': emergence_match.group(1).strip() if emergence_match else '',
|
||||
})
|
||||
current_title = None
|
||||
|
||||
return outline_chapters
|
||||
|
||||
def check_outline_coverage(chapter_text, outline_entry):
|
||||
"""检查正文是否覆盖了细纲的关键事件"""
|
||||
issues = []
|
||||
|
||||
# 检查 @scene 中的关键意象/事件
|
||||
if outline_entry.get('scene'):
|
||||
scene_items = outline_entry['scene'].split('/')
|
||||
for item in scene_items:
|
||||
item = item.strip()
|
||||
if not item or len(item) < 10:
|
||||
continue
|
||||
# 提取核心词(取前5个字作为搜索关键词)
|
||||
keywords = item[:15]
|
||||
if keywords not in chapter_text:
|
||||
issues.append(f"细纲场景未体现: {item[:40]}...")
|
||||
|
||||
# 检查 @lock 中的数值要求
|
||||
if outline_entry.get('lock'):
|
||||
lock_items = outline_entry['lock'].split('/')
|
||||
for item in lock_items:
|
||||
item = item.strip()
|
||||
if '→' in item:
|
||||
# 数值变化,如 "灰芽60%→61%"
|
||||
target = item.split('→')[-1].strip()
|
||||
# 提取数值部分
|
||||
num_match = re.search(r'[\d.]+%?万?', target)
|
||||
if num_match:
|
||||
target_num = num_match.group()
|
||||
if target_num not in chapter_text:
|
||||
issues.append(f"数值目标未体现: {item.strip()}")
|
||||
|
||||
return issues
|
||||
|
||||
def main():
|
||||
if len(sys.argv) < 3:
|
||||
print("用法: python3 细纲核对.py <正文目录> <细纲文件.md>")
|
||||
sys.exit(1)
|
||||
|
||||
chapters_dir = sys.argv[1]
|
||||
outline_file = sys.argv[2]
|
||||
|
||||
if not os.path.isdir(chapters_dir):
|
||||
print(f"错误: '{chapters_dir}' 不是有效目录")
|
||||
sys.exit(1)
|
||||
if not os.path.isfile(outline_file):
|
||||
print(f"错误: '{outline_file}' 不是有效文件")
|
||||
sys.exit(1)
|
||||
|
||||
chapters = read_chapters(chapters_dir)
|
||||
outline = parse_outline(outline_file)
|
||||
|
||||
print("═" * 60)
|
||||
print(f"细纲核对报告")
|
||||
print(f"正文: {len(chapters)} 章 | 细纲: {len(outline)} 条")
|
||||
print("═" * 60)
|
||||
print()
|
||||
|
||||
total_issues = 0
|
||||
|
||||
for ch_title, ch_text in chapters:
|
||||
# 匹配对应的细纲条目
|
||||
ch_num_match = re.search(r'第(\d+)章', ch_title)
|
||||
if not ch_num_match:
|
||||
continue
|
||||
ch_num = int(ch_num_match.group(1))
|
||||
|
||||
outline_entry = None
|
||||
for o in outline:
|
||||
o_num_match = re.search(r'第(\d+)章', o['title'])
|
||||
if o_num_match and int(o_num_match.group(1)) == ch_num:
|
||||
outline_entry = o
|
||||
break
|
||||
|
||||
if not outline_entry:
|
||||
print(f"⚠️ {ch_title}: 未找到对应细纲")
|
||||
total_issues += 1
|
||||
continue
|
||||
|
||||
issues = check_outline_coverage(ch_text, outline_entry)
|
||||
|
||||
if issues:
|
||||
print(f"🔶 {ch_title}:")
|
||||
for issue in issues:
|
||||
print(f" - {issue}")
|
||||
total_issues += len(issues)
|
||||
print()
|
||||
else:
|
||||
print(f"✅ {ch_title}: 细纲核对通过")
|
||||
print()
|
||||
|
||||
print("═" * 60)
|
||||
if total_issues == 0:
|
||||
print("✅ 所有章节细纲核对通过!")
|
||||
else:
|
||||
print(f"共发现 {total_issues} 个核对问题")
|
||||
print("═" * 60)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@ -0,0 +1,596 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
续写小说系统 · 自检精修引擎 v1.0
|
||||
朝暮 ICE-GL-CM001 · 明天见频道 · novel-system
|
||||
|
||||
用法: python3 自检精修.py <章节文件夹路径> [--book 书名] [--rules rules.json]
|
||||
|
||||
检测项(共12项):
|
||||
【整理阶段】
|
||||
① 章节字数(WPS口径,2000-2200字)
|
||||
② 排版格式(多余空行、统一换行)
|
||||
|
||||
【核对阶段】
|
||||
③ 英文单词检测
|
||||
④ AI套路检测(第xxx章、作者自指、免责声明等)
|
||||
⑤ 结尾重复检测(连续多章相同结尾)
|
||||
⑥ 对话标签公式化检测
|
||||
⑦ 细纲核对(正文vs细纲关键事件比对)
|
||||
|
||||
【检测阶段】
|
||||
⑧ 标点符号检测(引号配对、半角、句号逗号比例)
|
||||
⑨ 章节序号校验(连续性、无重复)
|
||||
⑩ 段落结构检测(过长段落、啰嗦句式)
|
||||
⑪ 章节质量检测(爽点密度、推进感)
|
||||
⑫ 整体报告生成
|
||||
"""
|
||||
|
||||
import sys, os, re, json
|
||||
from collections import Counter
|
||||
from difflib import SequenceMatcher
|
||||
|
||||
# ============================================================
|
||||
# 配置加载
|
||||
# ============================================================
|
||||
|
||||
def load_rules(rules_path=None):
|
||||
"""加载检测规则配置"""
|
||||
if rules_path is None:
|
||||
script_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
rules_path = os.path.join(script_dir, 'detection_rules.json')
|
||||
|
||||
with open(rules_path, 'r', encoding='utf-8') as f:
|
||||
return json.load(f)
|
||||
|
||||
# ============================================================
|
||||
# WPS字数统计
|
||||
# ============================================================
|
||||
|
||||
def wps_word_count(text):
|
||||
"""
|
||||
WPS口径字数统计
|
||||
WPS计算方式:中文字符 + 中文标点 + 英文单词 + 数字
|
||||
与Python len()不同:WPS不统计英文空格和纯英文标点
|
||||
"""
|
||||
# 中文字符(含中文标点)
|
||||
chinese = len(re.findall(r'[\u4e00-\u9fff\u3000-\u303f\uff00-\uffef]', text))
|
||||
# 英文单词和数字(连续的字母/数字序列算一个"字")
|
||||
en_words = len(re.findall(r'[a-zA-Z0-9]+', text))
|
||||
return chinese + en_words
|
||||
|
||||
# ============================================================
|
||||
# 章节读取
|
||||
# ============================================================
|
||||
|
||||
def read_chapters(path):
|
||||
"""从txt文件读取章节,按 第X章 分割"""
|
||||
chapters = []
|
||||
txt_files = sorted([f for f in os.listdir(path) if f.endswith('.txt')])
|
||||
|
||||
if not txt_files:
|
||||
return chapters
|
||||
|
||||
for fname in txt_files:
|
||||
fpath = os.path.join(path, fname)
|
||||
with open(fpath, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
|
||||
lines = [l.strip() for l in content.split('\n') if l.strip()]
|
||||
current_ch, current_lines = None, []
|
||||
|
||||
for line in lines:
|
||||
# 匹配章节标题:第X章
|
||||
if re.match(r'第[零一二三四五六七八九十百千\d]+章', line) and len(line) < 25:
|
||||
if current_ch:
|
||||
chapters.append((current_ch, current_lines))
|
||||
current_ch, current_lines = line, []
|
||||
else:
|
||||
current_lines.append(line)
|
||||
|
||||
if current_ch:
|
||||
chapters.append((current_ch, current_lines))
|
||||
|
||||
return chapters
|
||||
|
||||
# ============================================================
|
||||
# 问题收集器
|
||||
# ============================================================
|
||||
|
||||
class IssueCollector:
|
||||
def __init__(self):
|
||||
self.issues = []
|
||||
|
||||
def add(self, level, chapter, item, detail, suggestion=""):
|
||||
self.issues.append({
|
||||
'level': level,
|
||||
'chapter': chapter,
|
||||
'item': item,
|
||||
'detail': detail,
|
||||
'suggestion': suggestion
|
||||
})
|
||||
|
||||
# ============================================================
|
||||
# 检测模块
|
||||
# ============================================================
|
||||
|
||||
def check_word_count(chapters, config, collector):
|
||||
"""① 章节字数检测(WPS口径)"""
|
||||
wc_min = config.get('word_count_min', 2000)
|
||||
wc_max = config.get('word_count_max', 2200)
|
||||
|
||||
for title, lines in chapters:
|
||||
text = '\n'.join(lines)
|
||||
wc = wps_word_count(text)
|
||||
if wc < wc_min:
|
||||
collector.add('🔴', title, '字数不足',
|
||||
f'WPS字数 {wc} 字(要求≥{wc_min})',
|
||||
f'需补充 {wc_min - wc} 字')
|
||||
elif wc > wc_max:
|
||||
collector.add('🔶', title, '字数超标',
|
||||
f'WPS字数 {wc} 字(要求≤{wc_max})',
|
||||
f'需删减 {wc - wc_max} 字')
|
||||
|
||||
|
||||
def check_format(chapters, collector):
|
||||
"""② 排版格式检测"""
|
||||
for title, lines in chapters:
|
||||
# 检测连续空行(原文件读取时已过滤空行,这里读原始文件)
|
||||
pass # 此检测需要读取原始文件,在read_chapters_raw中处理
|
||||
|
||||
|
||||
def check_english(chapters, config, collector):
|
||||
"""③ 英文单词检测"""
|
||||
global_rules = config.get('_global', {})
|
||||
eng_config = global_rules.get('english_detection', {})
|
||||
if not eng_config.get('enabled', True):
|
||||
return
|
||||
|
||||
allowed = set(eng_config.get('allowed_words', []))
|
||||
pattern = re.compile(r'[a-zA-Z]{2,}')
|
||||
|
||||
for title, lines in chapters:
|
||||
text = '\n'.join(lines)
|
||||
found = pattern.findall(text)
|
||||
# 过滤允许词
|
||||
illegal = [w for w in found if w.lower() not in allowed]
|
||||
if illegal:
|
||||
unique_illegal = list(set(illegal))
|
||||
collector.add('🔴', title, '英文单词',
|
||||
f"发现 {len(illegal)} 处英文:{', '.join(unique_illegal[:10])}",
|
||||
'替换为中文或删除')
|
||||
|
||||
|
||||
def check_ai_patterns(chapters, config, collector):
|
||||
"""④ AI套路检测"""
|
||||
global_rules = config.get('_global', {})
|
||||
ai_patterns = global_rules.get('ai_patterns', {})
|
||||
|
||||
for title, lines in chapters:
|
||||
text = '\n'.join(lines)
|
||||
for pattern_name, pattern in ai_patterns.items():
|
||||
matches = re.findall(pattern, text)
|
||||
if matches:
|
||||
collector.add('🔴', title, f'AI套路: {pattern_name}',
|
||||
f"匹配到: {', '.join(matches[:5])}",
|
||||
'删除AI生成的元描述文字')
|
||||
|
||||
|
||||
def check_ending_repetition(chapters, config, collector):
|
||||
"""⑤ 结尾重复检测"""
|
||||
global_rules = config.get('_global', {})
|
||||
rep_config = global_rules.get('repetition_detection', {})
|
||||
threshold = rep_config.get('ending_similarity_threshold', 0.5)
|
||||
n_lines = rep_config.get('ending_lines_count', 6)
|
||||
|
||||
endings = [(t, l[-n_lines:] if len(l) >= n_lines else l) for t, l in chapters]
|
||||
|
||||
for i in range(len(endings) - 2):
|
||||
a, b, c = endings[i], endings[i+1], endings[i+2]
|
||||
ab_sim = SequenceMatcher(None, '\n'.join(a[1]), '\n'.join(b[1])).ratio()
|
||||
bc_sim = SequenceMatcher(None, '\n'.join(b[1]), '\n'.join(c[1])).ratio()
|
||||
|
||||
if ab_sim > threshold and bc_sim > threshold:
|
||||
collector.add('🔴', f'{a[0]}→{c[0]}', '结尾结构重复',
|
||||
f'连续3章结尾相似度均>{threshold:.0%}',
|
||||
'每章结尾必须有不同的情绪/意象')
|
||||
elif ab_sim > threshold + 0.1:
|
||||
collector.add('🔶', f'{a[0]} & {b[0]}', '连续2章结尾相似',
|
||||
f'相似度{ab_sim:.0%}',
|
||||
'相邻两章结尾应有明显差异')
|
||||
|
||||
|
||||
def check_ending_forbidden(chapters, config, collector):
|
||||
"""⑤b 禁用结尾检测"""
|
||||
forbidden = config.get('ending_forbidden', [])
|
||||
if not forbidden:
|
||||
return
|
||||
|
||||
for title, lines in chapters:
|
||||
ending_text = '\n'.join(lines[-8:] if len(lines) >= 8 else lines)
|
||||
for kw in forbidden:
|
||||
if re.search(kw, ending_text):
|
||||
collector.add('🔴', title, f'禁用结尾: "{kw}"',
|
||||
'结尾使用了禁用模式',
|
||||
'更换结尾方式,参考收尾方式库')
|
||||
|
||||
|
||||
def check_dialogue_formula(chapters, config, collector):
|
||||
"""⑥ 对话标签公式化检测"""
|
||||
forbidden_tags = config.get('dialogue_tags_forbidden', [])
|
||||
if not forbidden_tags:
|
||||
return
|
||||
|
||||
total = Counter()
|
||||
for title, lines in chapters:
|
||||
text = '\n'.join(lines)
|
||||
ch_counts = {}
|
||||
for tag in forbidden_tags:
|
||||
cnt = len(re.findall(tag, text))
|
||||
if cnt > 0:
|
||||
ch_counts[tag] = cnt
|
||||
total[tag] += cnt
|
||||
|
||||
too_many = [f'{k}×{v}' for k, v in ch_counts.items() if v >= 3]
|
||||
if too_many:
|
||||
collector.add('🟡', title, '对话标签重复',
|
||||
f"本章: {', '.join(too_many)}",
|
||||
'用动作替代说道标签')
|
||||
|
||||
|
||||
def check_punctuation(chapters, config, collector):
|
||||
"""⑧ 标点符号检测"""
|
||||
punct_config = config.get('punctuation', {})
|
||||
|
||||
for title, lines in chapters:
|
||||
text = '\n'.join(lines)
|
||||
issues = []
|
||||
|
||||
# 引号配对检测
|
||||
if punct_config.get('require_curly_quotes', False):
|
||||
left_quotes = text.count('\u201c') # "
|
||||
right_quotes = text.count('\u201d') # "
|
||||
if left_quotes != right_quotes:
|
||||
issues.append(f'弯引号不配对(左{left_quotes} 右{right_quotes})')
|
||||
|
||||
# 检测是否使用了直引号
|
||||
straight_quotes = text.count('"')
|
||||
if straight_quotes > 0:
|
||||
issues.append(f'发现 {straight_quotes} 处直引号(应使用弯引号)')
|
||||
|
||||
# 半角标点检测
|
||||
if punct_config.get('no_halfwidth', False):
|
||||
halfwidth = re.findall(r'[!?;:,.](?=[^\n])', text) # 中文字符后的半角标点
|
||||
if halfwidth:
|
||||
issues.append(f'发现半角标点: {", ".join(set(halfwidth)[:5])}')
|
||||
|
||||
# 问号检测
|
||||
q_max = punct_config.get('question_mark_max', 5)
|
||||
question_count = text.count('?') + text.count('?')
|
||||
if question_count > q_max:
|
||||
issues.append(f'问号 {question_count} 个(上限{q_max})')
|
||||
|
||||
# 破折号检测
|
||||
dash_max = punct_config.get('dash_max_per_chapter', 5)
|
||||
dash_exceptions = punct_config.get('dash_exceptions', [])
|
||||
dash_count = len(re.findall(r'[—–\-]{2,}', text))
|
||||
for exc in dash_exceptions:
|
||||
dash_count -= len(re.findall(exc, text))
|
||||
if dash_count > dash_max:
|
||||
issues.append(f'破折号 {dash_count} 处(上限{dash_max})')
|
||||
|
||||
# 句号逗号比例
|
||||
ratio_min = punct_config.get('period_comma_ratio_min', 0)
|
||||
if ratio_min > 0:
|
||||
periods = text.count('。')
|
||||
commas = text.count(',')
|
||||
if commas > 0:
|
||||
ratio = periods / commas
|
||||
if ratio < ratio_min:
|
||||
issues.append(f'句号:逗号 = {periods}:{commas} = {ratio:.1f}:1(要求≥{ratio_min}:1)')
|
||||
|
||||
if issues:
|
||||
collector.add('🔶', title, '标点问题', '; '.join(issues))
|
||||
|
||||
|
||||
def check_chapter_numbering(chapters, config, collector):
|
||||
"""⑨ 章节序号校验"""
|
||||
global_rules = config.get('_global', {})
|
||||
num_config = global_rules.get('chapter_numbering', {})
|
||||
if not num_config.get('validate_sequence', True):
|
||||
return
|
||||
|
||||
# 提取章节号
|
||||
numbers = []
|
||||
for title, _ in chapters:
|
||||
m = re.search(r'第(\d+)章', title)
|
||||
if m:
|
||||
numbers.append(int(m.group(1)))
|
||||
|
||||
if not numbers:
|
||||
return
|
||||
|
||||
# 检查重复
|
||||
if num_config.get('validate_no_duplicates', True):
|
||||
seen = {}
|
||||
for i, n in enumerate(numbers):
|
||||
if n in seen:
|
||||
collector.add('🔴', f'第{n}章', '章节号重复',
|
||||
f'第{n}章出现多次(位置{i+1}和{seen[n]+1})')
|
||||
seen[n] = i
|
||||
|
||||
# 检查连续性
|
||||
for i in range(len(numbers) - 1):
|
||||
if numbers[i+1] != numbers[i] + 1:
|
||||
collector.add('🔴', f'第{numbers[i]}→{numbers[i+1]}章', '章节号不连续',
|
||||
f'从第{numbers[i]}章跳到第{numbers[i+1]}章,缺少第{numbers[i]+1}章')
|
||||
|
||||
|
||||
def check_paragraph_structure(chapters, collector):
|
||||
"""⑩ 段落结构检测"""
|
||||
verbose_patterns = [
|
||||
(r'比.{1,15}(?:还要?|更加?|都要?|都).{1,20}(?:了|的|得多)', '比较句式过多'),
|
||||
(r'像.{3,25}(?:一样|似的|一般)', '比喻堆叠'),
|
||||
(r'(?:已经|正在|开始|继续|渐渐|慢慢|忽然|突然|猛地)\s*[的地得]', '状语修饰过多'),
|
||||
]
|
||||
|
||||
for title, lines in chapters:
|
||||
text = '\n'.join(lines)
|
||||
hits = []
|
||||
for pat, label in verbose_patterns:
|
||||
if len(re.findall(pat, text)) >= 5:
|
||||
hits.append(label)
|
||||
if hits:
|
||||
collector.add('🟡', title, '啰嗦冗余', f"检测到: {', '.join(hits)}")
|
||||
|
||||
# 段落长度检测
|
||||
para_lengths = []
|
||||
current_len = 0
|
||||
for line in lines:
|
||||
if line:
|
||||
current_len += 1
|
||||
else:
|
||||
if current_len > 0:
|
||||
para_lengths.append(current_len)
|
||||
current_len = 0
|
||||
if current_len > 0:
|
||||
para_lengths.append(current_len)
|
||||
|
||||
long_paras = [p for p in para_lengths if p > 4]
|
||||
if len(long_paras) >= 2:
|
||||
collector.add('🟡', title, '段落过长',
|
||||
f'{len(long_paras)} 处超过4句(最长{max(long_paras)}句)',
|
||||
'紧张场景1-2句一段')
|
||||
|
||||
|
||||
def check_chapter_quality(chapters, config, collector):
|
||||
"""⑪ 章节质量检测(爽点密度/推进感)"""
|
||||
required = config.get('per_chapter_required', [])
|
||||
if not required:
|
||||
return
|
||||
|
||||
# 战斗信号词
|
||||
combat_signals = ['杀', '斩', '战', '拳', '轰', '炸', '碎', '劈', '刺', '撞',
|
||||
'攻击', '敌人', '怪物', '反杀', '碾压', '秒杀', '打脸',
|
||||
'领主', '士兵', '围剿', '追杀', '出手', '砸', '崩', '裂']
|
||||
# 系统信号词
|
||||
system_signals = ['【叮', '叮——', '法则点', '宿主', '系统', '升级', '解锁',
|
||||
'进化', '突破', '掠夺', '碎片', '核心', '技能', '属性',
|
||||
'激活', '混沌', '祖龙', '称号', '领域']
|
||||
# 升级信号词
|
||||
upgrade_signals = ['Lv', 'lv', '等级', '升为', '升至', '进阶', '觉醒',
|
||||
'新能力', '吸收', '强化', '覆盖', '叠加', '增幅',
|
||||
'法则点+', '战力', '至高']
|
||||
|
||||
for title, lines in chapters:
|
||||
text = '\n'.join(lines)
|
||||
cc = sum(1 for s in combat_signals if s in text)
|
||||
sc = sum(1 for s in system_signals if s in text)
|
||||
uc = sum(1 for s in upgrade_signals if s in text)
|
||||
|
||||
issues = []
|
||||
if '战斗' in required and cc < 3:
|
||||
issues.append(f'战斗信号仅{cc}个')
|
||||
if '系统提示' in required and sc < 2:
|
||||
issues.append(f'系统信号仅{sc}个')
|
||||
if '能力升级' in required and uc < 1:
|
||||
issues.append('无能力升级信号')
|
||||
|
||||
if issues:
|
||||
collector.add('🔴', title, '章纲爽点不足',
|
||||
f"{'; '.join(issues)}。战斗={cc} 系统={sc} 升级={uc}")
|
||||
|
||||
# 连续无战斗检测
|
||||
if '战斗' in required:
|
||||
streak = 0
|
||||
for title, lines in chapters:
|
||||
text = '\n'.join(lines)
|
||||
if sum(1 for s in combat_signals if s in text) < 3:
|
||||
streak += 1
|
||||
else:
|
||||
streak = 0
|
||||
if streak >= 3:
|
||||
collector.add('🔴', f'连续{streak}章', '连续多章无战斗',
|
||||
f'最近{streak}章战斗信号不足', '立即插入战斗场景')
|
||||
break
|
||||
|
||||
|
||||
def check_progression(chapters, collector):
|
||||
"""推进感检测"""
|
||||
signals = ['系统提示', '【叮', '觉醒', '突破', '新', '第一次', '从未',
|
||||
'陌生', '法则', '解锁', '发现', '浮现', '出现', '诞生',
|
||||
'进化', '升级', '碎片', '记忆']
|
||||
no_new = 0
|
||||
for title, lines in chapters:
|
||||
if not any(any(s in line for s in signals) for line in lines[-20:]):
|
||||
no_new += 1
|
||||
if no_new >= 2:
|
||||
collector.add('🔶', title, '推进感不足',
|
||||
f'连续{no_new}章后半部分无新信息',
|
||||
'每章至少推进一个维度')
|
||||
else:
|
||||
no_new = 0
|
||||
|
||||
# ============================================================
|
||||
# 运行全部检测
|
||||
# ============================================================
|
||||
|
||||
def run_all_checks(chapters, book_config, global_rules):
|
||||
"""运行全部12项检测"""
|
||||
c = IssueCollector()
|
||||
|
||||
# 整理阶段
|
||||
check_word_count(chapters, book_config, c)
|
||||
|
||||
# 核对阶段
|
||||
check_english(chapters, global_rules, c)
|
||||
check_ai_patterns(chapters, global_rules, c)
|
||||
check_ending_repetition(chapters, global_rules, c)
|
||||
check_ending_forbidden(chapters, book_config, c)
|
||||
check_dialogue_formula(chapters, book_config, c)
|
||||
|
||||
# 检测阶段
|
||||
check_punctuation(chapters, book_config, c)
|
||||
check_chapter_numbering(chapters, global_rules, c)
|
||||
check_paragraph_structure(chapters, c)
|
||||
check_chapter_quality(chapters, book_config, c)
|
||||
check_progression(chapters, c)
|
||||
|
||||
return c.issues
|
||||
|
||||
# ============================================================
|
||||
# 报告生成
|
||||
# ============================================================
|
||||
|
||||
def generate_report(chapters, issues, book_name):
|
||||
"""生成检测报告"""
|
||||
lines = [
|
||||
"═" * 60,
|
||||
f"续写小说系统 · 自检精修报告 v1.0",
|
||||
f"书名: {book_name}",
|
||||
f"检测章节: {chapters[0][0]} → {chapters[-1][0]}(共{len(chapters)}章)",
|
||||
"═" * 60,
|
||||
""
|
||||
]
|
||||
|
||||
if not issues:
|
||||
return '\n'.join(lines + ["✅ 所有12项检测通过!未发现问题。"])
|
||||
|
||||
# 统计
|
||||
red = [i for i in issues if i['level'] == '🔴']
|
||||
orange = [i for i in issues if i['level'] == '🔶']
|
||||
yellow = [i for i in issues if i['level'] == '🟡']
|
||||
|
||||
lines.append(f"🔴 严重: {len(red)} | 🔶 警告: {len(orange)} | 🟡 提示: {len(yellow)}")
|
||||
lines.append("")
|
||||
|
||||
# 按阶段分组
|
||||
stage_map = {
|
||||
'字数': '【整理阶段】',
|
||||
'英文': '【核对阶段】',
|
||||
'AI套路': '【核对阶段】',
|
||||
'结尾': '【核对阶段】',
|
||||
'禁用结尾': '【核对阶段】',
|
||||
'对话': '【核对阶段】',
|
||||
'标点': '【检测阶段】',
|
||||
'章节号': '【检测阶段】',
|
||||
'段落': '【检测阶段】',
|
||||
'爽点': '【检测阶段】',
|
||||
'推进感': '【检测阶段】',
|
||||
'章纲': '【核对阶段】',
|
||||
}
|
||||
|
||||
for level, label in [('🔴', '🔴 严重问题'), ('🔶', '🔶 警告'), ('🟡', '🟡 提示')]:
|
||||
li = [i for i in issues if i['level'] == level]
|
||||
if not li:
|
||||
continue
|
||||
lines.append(f"## {label}")
|
||||
for idx, iss in enumerate(li, 1):
|
||||
stage = '其他'
|
||||
for key, st in stage_map.items():
|
||||
if key in iss['item']:
|
||||
stage = st
|
||||
break
|
||||
lines.append(f"### {idx}. [{stage}] {iss['item']}")
|
||||
lines.append(f"- 章节: {iss['chapter']}")
|
||||
lines.append(f"- 详情: {iss['detail']}")
|
||||
if iss['suggestion']:
|
||||
lines.append(f"- 建议: {iss['suggestion']}")
|
||||
lines.append("")
|
||||
|
||||
# 字数汇总
|
||||
lines.append("## 📊 字数统计(WPS口径)")
|
||||
lines.append("| 章节 | 字数 | 状态 |")
|
||||
lines.append("|------|------|------|")
|
||||
for title, text_lines in chapters:
|
||||
wc = wps_word_count('\n'.join(text_lines))
|
||||
status = '✅' if 2000 <= wc <= 2200 else ('🔶' if wc < 2000 else '🔴')
|
||||
lines.append(f"| {title} | {wc} | {status} |")
|
||||
lines.append("")
|
||||
|
||||
lines.append("═" * 60)
|
||||
lines.append("朝暮 ICE-GL-CM001 · 续写小说系统 · 自检精修引擎 v1.0")
|
||||
lines.append("明天见频道 · novel-system")
|
||||
lines.append("═" * 60)
|
||||
|
||||
return '\n'.join(lines)
|
||||
|
||||
# ============================================================
|
||||
# 主入口
|
||||
# ============================================================
|
||||
|
||||
def main():
|
||||
import argparse
|
||||
|
||||
parser = argparse.ArgumentParser(description='续写小说系统 · 自检精修引擎 v1.0')
|
||||
parser.add_argument('path', help='章节txt文件夹路径')
|
||||
parser.add_argument('--book', default='肖轩', help='书名(对应detection_rules.json中的books key)')
|
||||
parser.add_argument('--rules', help='检测规则文件路径(默认同目录detection_rules.json)')
|
||||
parser.add_argument('--output', help='报告输出路径(默认在章节目录下生成 精修报告.md)')
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if not os.path.isdir(args.path):
|
||||
print(f"错误: '{args.path}' 不是有效目录")
|
||||
sys.exit(1)
|
||||
|
||||
# 加载规则
|
||||
all_rules = load_rules(args.rules)
|
||||
if args.book not in all_rules.get('books', {}):
|
||||
print(f"错误: 未找到书籍 '{args.book}' 的配置,可用: {list(all_rules.get('books', {}).keys())}")
|
||||
sys.exit(1)
|
||||
|
||||
book_config = all_rules['books'][args.book]
|
||||
# 将全局规则嵌入到config中供检测函数使用
|
||||
book_config['_global'] = all_rules.get('global_rules', {})
|
||||
|
||||
# 读取章节
|
||||
chapters = read_chapters(args.path)
|
||||
if not chapters:
|
||||
print(f"错误: '{args.path}' 中没有找到章节txt文件")
|
||||
sys.exit(1)
|
||||
|
||||
print(f"📖 {args.book} · 读取 {len(chapters)} 个章节...")
|
||||
print(f" 范围: {chapters[0][0]} → {chapters[-1][0]}")
|
||||
print()
|
||||
|
||||
# 运行检测
|
||||
issues = run_all_checks(chapters, book_config, book_config['_global'])
|
||||
|
||||
# 生成报告
|
||||
report = generate_report(chapters, issues, args.book)
|
||||
print(report)
|
||||
|
||||
# 保存报告
|
||||
out_path = args.output or os.path.join(args.path, '精修报告.md')
|
||||
with open(out_path, 'w', encoding='utf-8') as f:
|
||||
f.write(report)
|
||||
print(f"\n📄 报告已保存: {out_path}")
|
||||
|
||||
# 返回exit code
|
||||
red_count = sum(1 for i in issues if i['level'] == '🔴')
|
||||
if red_count > 0:
|
||||
sys.exit(1)
|
||||
sys.exit(0)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@ -0,0 +1,120 @@
|
||||
# 检测规范与标准
|
||||
|
||||
> 朝暮 ICE-GL-CM001 · 明天见频道 · novel-system
|
||||
> 版本:v1.0 · 2026-07-11
|
||||
|
||||
---
|
||||
|
||||
## 一、字数标准
|
||||
|
||||
### WPS口径 vs 其他统计方式
|
||||
|
||||
| 统计方式 | 中文字 | 中文标点 | 英文单词 | 数字 | 空格 | 纯英文标点 |
|
||||
|---------|--------|---------|---------|------|------|-----------|
|
||||
| **WPS** | ✅ 1字 | ✅ 1字 | ✅ 1字 | ✅ 1字 | ❌ | ❌ |
|
||||
| Python len() | ✅ 1字 | ✅ 1字 | ✅ 1字 | ✅ 1字 | ✅ 1字 | ✅ 1字 |
|
||||
| 橙瓜 | 待验证 | 待验证 | 待验证 | 待验证 | — | — |
|
||||
|
||||
**结论:以WPS为准。** 脚本使用 `自检精修.py` 或 `wps_wordcount.py` 统计。
|
||||
|
||||
### 各书字数要求
|
||||
|
||||
| 书 | 最低 | 最高 | 备注 |
|
||||
|----|------|------|------|
|
||||
| 肖轩 | 2000 | 2200 | 后台发文最低2000 |
|
||||
| 沈婉凝 | 2000 | 2200 | |
|
||||
| 许怀钰 | 2000 | 2200 | |
|
||||
| 死亡病院 | 2000 | 2200 | |
|
||||
|
||||
---
|
||||
|
||||
## 二、标点符号标准
|
||||
|
||||
### 必须使用中文标点
|
||||
|
||||
| 标点 | 正确 | 错误 |
|
||||
|------|------|------|
|
||||
| 双引号 | `"` `"` | `"` `"` `'` |
|
||||
| 逗号 | `,` | `,` |
|
||||
| 句号 | `。` | `.` |
|
||||
| 问号 | `?` | `?` |
|
||||
| 感叹号 | `!` | `!` |
|
||||
| 冒号 | `:` | `:` |
|
||||
| 分号 | `;` | `;` |
|
||||
| 括号 | `()` | `()` |
|
||||
| 省略号 | `……` | `...` `......` |
|
||||
| 破折号 | `——` | `--` `---` |
|
||||
|
||||
### 肖轩专项规则
|
||||
|
||||
| 规则 | 标准 | 原因 |
|
||||
|------|------|------|
|
||||
| 句号主导 | 句号:逗号 ≥ 5:1 | 之之精修风格:一句一段 |
|
||||
| 问号禁止 | 0个/章 | 风格要求 |
|
||||
| 破折号限制 | ≤2/章(【叮——】除外) | 减少冗余 |
|
||||
| 弯引号配对 | 左"与右"数量相等 | 排版要求 |
|
||||
|
||||
---
|
||||
|
||||
## 三、AI套路黑名单
|
||||
|
||||
以下内容出现即标记为🔴严重问题:
|
||||
|
||||
### 元描述类
|
||||
- `第xxx章`(正文中出现章节标题)
|
||||
- `本章`、`这一章`、`本章节`
|
||||
- `作者`、`笔者`、`写到这里`
|
||||
- `以上内容`、`以上是`、`以下是`
|
||||
- `请继续`、`如需`、`如有`
|
||||
|
||||
### 叙述侵入类
|
||||
- `读者`、`看官`
|
||||
- `且听`、`话说`、`却说`
|
||||
- `按下不表`
|
||||
|
||||
### 结尾模板(肖轩专项)
|
||||
- `门开了`、`推开门`、`门在他身后合上`、`门后`
|
||||
- `朝XX走去`、`向XX走去`
|
||||
- `路的尽头`(需轮换使用,不可连续出现)
|
||||
|
||||
### 对话公式(肖轩专项)
|
||||
- `眼神一冷`
|
||||
- `嘴角一咧/翘/扬`
|
||||
- `冷笑`(非对话中的描述标签)
|
||||
|
||||
---
|
||||
|
||||
## 四、检测优先级
|
||||
|
||||
| 优先级 | 类型 | 示例 | 处理 |
|
||||
|--------|------|------|------|
|
||||
| 🔴 阻断 | 章节号错乱、英文单词、AI套路 | 必须修复才能发布 |
|
||||
| 🔶 警告 | 字数超标、标点不配对、结尾重复 | 建议修复,可在积累后批量处理 |
|
||||
| 🟡 提示 | 段落过长、啰嗦句式、对话标签过频 | 逐步优化,不阻断发布 |
|
||||
|
||||
---
|
||||
|
||||
## 五、核对细纲要点
|
||||
|
||||
1. **@trigger**: 正文开头是否从细纲触发点开始?
|
||||
2. **@emergence**: 剧情发展是否覆盖所有环节?
|
||||
3. **@lock**: 战斗次数、系统提示次数、升级次数是否达标?
|
||||
4. **@lock数值**: 灰芽、法则等数值变化是否在正文中体现?
|
||||
5. **@scene**: 关键场景描写是否遗漏?
|
||||
6. **@chapter_hook**: 结尾钩子是否与细纲一致?
|
||||
|
||||
---
|
||||
|
||||
## 六、跨章衔接检测
|
||||
|
||||
| 检测项 | 方法 |
|
||||
|--------|------|
|
||||
| 数值链条 | 上章末数值 → 本章数值变化 → 是否连贯 |
|
||||
| 人物状态 | 上章末人物在何处/做什么 → 本章首人物是否合理出现 |
|
||||
| 时间过渡 | 上一章事件 → 下一章事件 → 时间间隔是否合理 |
|
||||
| 钩子兑现 | 上一章@chapter_hook → 本章是否承接 |
|
||||
|
||||
---
|
||||
|
||||
> ⊢ 朝暮 ICE-GL-CM001 · 检测规范与标准 v1.0
|
||||
> ⊢ 明天见频道 · novel-system
|
||||
@ -0,0 +1,58 @@
|
||||
# 协作记录模板
|
||||
|
||||
> 朝暮 ICE-GL-CM001 · 明天见频道 · novel-system
|
||||
> 每日工作结束后填写
|
||||
|
||||
---
|
||||
|
||||
## YYYY-MM-DD 协作记录
|
||||
|
||||
### 📋 今日工作
|
||||
|
||||
| 时间 | 步骤 | 书籍 | 章节 | 操作 |
|
||||
|------|------|------|------|------|
|
||||
| | 整理 | | | |
|
||||
| | 核对 | | | |
|
||||
| | 检测 | | | |
|
||||
|
||||
### 📊 检测结果汇总
|
||||
|
||||
| 书 | 章 | 🔴严重 | 🔶警告 | 🟡提示 | 状态 |
|
||||
|----|-----|--------|--------|--------|------|
|
||||
| | | | | | |
|
||||
|
||||
### 🔍 发现的典型问题
|
||||
|
||||
1. **问题类型**:描述
|
||||
- 出现在:第X章
|
||||
- 具体表现:
|
||||
- 处理方式:
|
||||
|
||||
### 💡 优化建议(给冰朔/铸渊)
|
||||
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
|
||||
### 🧠 思维逻辑(朝暮反思)
|
||||
|
||||
> 今天协作中的感悟、发现的新规律、可以改进的地方
|
||||
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
|
||||
### 📈 能力升级记录
|
||||
|
||||
| 升级项 | 旧方式 | 新方式 | 效果 |
|
||||
|--------|--------|--------|------|
|
||||
| | | | |
|
||||
|
||||
### 🔗 相关文件
|
||||
|
||||
- 检测报告: `path/to/报告`
|
||||
- 工单: `path/to/工单`
|
||||
|
||||
---
|
||||
|
||||
> ⊢ 朝暮 ICE-GL-CM001 · YYYY-MM-DD
|
||||
@ -0,0 +1,95 @@
|
||||
# 标点符号检测清单
|
||||
|
||||
> 朝暮 ICE-GL-CM001 · 明天见频道 · novel-system
|
||||
> 最后更新:2026-07-11
|
||||
|
||||
---
|
||||
|
||||
## 检测步骤(按顺序执行)
|
||||
|
||||
### 第一步:引号检测
|
||||
|
||||
**目标:所有中文双引号必须使用弯引号「"」和「"」(U+201C / U+201D)**
|
||||
|
||||
| 检测项 | 方法 | 处理 |
|
||||
|--------|------|------|
|
||||
| 弯引号配对 | 统计 `"` 和 `"` 数量是否相等 | 不等 → 逐段查找缺失位置 |
|
||||
| 直引号替换 | 搜索 `"` 字符 | 全部替换为弯引号 |
|
||||
| 引号位置 | 检查引号是否在行首/行尾断裂 | 跨段落的引号需要闭合 |
|
||||
|
||||
### 第二步:句号检测
|
||||
|
||||
**目标:句号主导,每章句号:逗号 ≥ 3:1(肖轩≥5:1)**
|
||||
|
||||
| 检测项 | 方法 | 处理 |
|
||||
|--------|------|------|
|
||||
| 句号数量 | 统计 `。` 出现次数 | — |
|
||||
| 逗号数量 | 统计 `,` 出现次数 | — |
|
||||
| 比例计算 | 句号数 ÷ 逗号数 | 不足 → 把流水句断开,用句号 |
|
||||
|
||||
### 第三步:问号检测
|
||||
|
||||
**目标:肖轩问号=0,其他书≤5个/章**
|
||||
|
||||
| 检测项 | 方法 | 处理 |
|
||||
|--------|------|------|
|
||||
| 问号数量 | 统计 `?` + `?` | 超标 → 改陈述句 |
|
||||
|
||||
### 第四步:破折号检测
|
||||
|
||||
**目标:肖轩≤2处/章(【叮——】除外),其他书≤3处/章**
|
||||
|
||||
| 检测项 | 方法 | 处理 |
|
||||
|--------|------|------|
|
||||
| 破折号计数 | 统计 `——` 出现次数 | 超标 → 改用句号或逗号 |
|
||||
| 系统提示 | `【叮——】` 不计入 | — |
|
||||
|
||||
### 第五步:半角符号检测
|
||||
|
||||
**目标:正文中不出现半角标点**
|
||||
|
||||
| 检测项 | 方法 | 处理 |
|
||||
|--------|------|------|
|
||||
| 半角逗号 | 搜索 `,` | 替换为 `,` |
|
||||
| 半角句号 | 搜索 `.` | 替换为 `。` |
|
||||
| 半角分号 | 搜索 `;` | 替换为 `;` |
|
||||
| 半角冒号 | 搜索 `:` | 替换为 `:` |
|
||||
| 半角括号 | 搜索 `()` | 替换为 `()` |
|
||||
| 半角感叹号 | 搜索 `!` | 替换为 `!` |
|
||||
| 半角问号 | 搜索 `?` | 替换为 `?` |
|
||||
|
||||
### 第六步:省略号检测
|
||||
|
||||
**目标:使用标准省略号 `……`(U+2026 × 2),而非 `...` 或 `......`**
|
||||
|
||||
| 检测项 | 方法 | 处理 |
|
||||
|--------|------|------|
|
||||
| 非标准省略号 | 搜索 `...` `....` `......` | 替换为 `……` |
|
||||
| 省略号数量 | ≤3处/章 | 超标 → 改句号收尾 |
|
||||
|
||||
### 第七步:其他标点
|
||||
|
||||
| 检测项 | 方法 | 处理 |
|
||||
|--------|------|------|
|
||||
| 书名号配对 | 统计 `《` 和 `》` | 不等 → 补全 |
|
||||
| 顿号使用 | `、` 用于并列词 | 没问题就过 |
|
||||
| 感叹号 | ≤5个/章 | 超标 → 削弱 |
|
||||
|
||||
---
|
||||
|
||||
## 快速修改表
|
||||
|
||||
| 原文错误 | 修正 |
|
||||
|---------|------|
|
||||
| `"你好"` | `"你好"` |
|
||||
| `你好,世界` | `你好,世界` |
|
||||
| `你好.` | `你好。` |
|
||||
| `选A/B/C` | `选A、B、C` |
|
||||
| `叮--` | `叮——` |
|
||||
| `...` | `……` |
|
||||
| `!!!` | `!`(一个够了) |
|
||||
| `???` | `?`(一个够了) |
|
||||
|
||||
---
|
||||
|
||||
> ⊢ 朝暮 ICE-GL-CM001 · 标点检测清单 v1.0
|
||||
@ -0,0 +1,51 @@
|
||||
# 细纲核对清单
|
||||
|
||||
> 朝暮 ICE-GL-CM001 · 明天见频道 · novel-system
|
||||
> 用于正文与细纲的逐章比对
|
||||
|
||||
---
|
||||
|
||||
## 核对流程
|
||||
|
||||
### 第一轮:逐章通读
|
||||
- [ ] 先读细纲该章,理解本意
|
||||
- [ ] 再读正文该章,对照理解
|
||||
- [ ] 标注差异点
|
||||
|
||||
### 第二轮:五点比对
|
||||
|
||||
| 比对维度 | 检查内容 | 通过 |
|
||||
|---------|---------|------|
|
||||
| **触发点** | 正文开头是否从细纲@trigger开始? | [ ] |
|
||||
| **剧情线** | 正文是否覆盖@emergence的每个环节? | [ ] |
|
||||
| **硬指标** | @lock中的战斗/系统/升级次数是否达标? | [ ] |
|
||||
| **数值** | @lock中的数值变化是否在正文中体现? | [ ] |
|
||||
| **钩子** | 正文结尾是否与@chapter_hook一致? | [ ] |
|
||||
|
||||
### 第三轮:跨章衔接
|
||||
|
||||
- [ ] 上一章末 @chapter_hook 是否与下一章首 @trigger 对应?
|
||||
- [ ] 数值链条是否贯通(如灰芽60%→61%→62%)?
|
||||
- [ ] 人物状态是否连贯(出场/离场/状态变化)?
|
||||
|
||||
### 第四轮:全局扫描
|
||||
|
||||
- [ ] 有无细纲中未提及的新设定?是否合理?
|
||||
- [ ] 有无细纲要求但正文遗漏的重要情节?
|
||||
- [ ] 章节之间的时间/空间过渡是否合理?
|
||||
|
||||
---
|
||||
|
||||
## 常见问题速查
|
||||
|
||||
| 问题类型 | 表现 | 处理 |
|
||||
|---------|------|------|
|
||||
| 剧情遗漏 | 细纲的关键场景在正文中找不到 | 标注,需补写 |
|
||||
| 剧情偏移 | 正文走向与细纲完全不同 | 标注,对比哪个更好 |
|
||||
| 数值矛盾 | 上章法则1720万,本章变1698万但无过渡 | 标注,要求加过渡 |
|
||||
| 节奏失调 | 细纲5个事件点,正文只写了2个 | 标注,需调整密度 |
|
||||
| 钩子断裂 | 上章钩子是A,本章从B开始 | 🔴 严重,必须修复 |
|
||||
|
||||
---
|
||||
|
||||
> ⊢ 朝暮 ICE-GL-CM001 · 细纲核对清单 v1.0
|
||||
@ -0,0 +1,80 @@
|
||||
# 2026-07-11 协作记录
|
||||
|
||||
> 朝暮 ICE-GL-CM001 · D182 · 续写小说系统初始化
|
||||
|
||||
---
|
||||
|
||||
## 📋 今日工作
|
||||
|
||||
| 时间 | 步骤 | 书籍 | 章节 | 操作 |
|
||||
|------|------|------|------|------|
|
||||
| 21:23 | 系统搭建 | 全部 | — | 初始化续写小说系统 |
|
||||
|
||||
### 今日完成
|
||||
|
||||
- [x] 创建四书进度卡系统(肖轩/沈婉凝/许怀钰/死亡病院)
|
||||
- [x] 搭建工作台总览 DASHBOARD
|
||||
- [x] 升级自检精修引擎 v0.4 → v1.0(12项检测,支持四书配置)
|
||||
- [x] 创建 WPS 字数统计工具
|
||||
- [x] 创建细纲核对工具
|
||||
- [x] 创建检测规则配置(detection_rules.json)
|
||||
- [x] 创建标点符号检测清单模板
|
||||
- [x] 创建细纲核对清单模板
|
||||
- [x] 创建协作记录模板
|
||||
- [x] 编写检测规范与标准文档
|
||||
- [x] 创建 ZZ-INDEX 总索引
|
||||
|
||||
### 待处理
|
||||
|
||||
- [ ] 实际运行检测脚本(等待之之提供章节文件)
|
||||
- [ ] 推送到 bingshuo/fifth-domain 仓库
|
||||
|
||||
---
|
||||
|
||||
## 📊 检测结果汇总
|
||||
|
||||
| 书 | 章 | 🔴严重 | 🔶警告 | 🟡提示 | 状态 |
|
||||
|----|-----|--------|--------|--------|------|
|
||||
| 全部 | — | 0 | 0 | 0 | 系统初始化 |
|
||||
|
||||
---
|
||||
|
||||
## 🧠 思维逻辑(朝暮反思)
|
||||
|
||||
### 1. 系统设计思路
|
||||
|
||||
将之前的 v0.4 自检脚本升级为通用引擎,核心改动:
|
||||
- **配置分离**:每本书的规则存入 `detection_rules.json`,脚本只读配置,不改代码
|
||||
- **三阶段对应**:12项检测明确对应之之的三步骤(整理→核对→检测)
|
||||
- **可扩展**:新增书籍只需在 JSON 加一条配置
|
||||
|
||||
### 2. 字数统计的关键
|
||||
|
||||
WPS 统计方式的核心区别在于:不统计英文空格和纯英文标点。脚本中的实现方式:
|
||||
- 统计 `[\u4e00-\u9fff\u3000-\u303f\uff00-\uffef\w]` 范围
|
||||
- 这确保了中文字、中文标点、英文单词/数字都算一个字
|
||||
|
||||
### 3. 需要之之确认的事项
|
||||
|
||||
- 沈婉凝/许怀钰/死亡病院的写作标准是否与肖轩相同?
|
||||
- 是否需要为每本书设置不同的检测严格度?
|
||||
- WPS 统计结果是否需要与橙瓜/实际软件交叉验证一次?
|
||||
|
||||
### 4. 下一步优化方向
|
||||
|
||||
- 标点自动修复功能(目前只是检测)
|
||||
- 批量处理模式(一次处理四本书)
|
||||
- 与 juzi 仓库的自动同步
|
||||
|
||||
---
|
||||
|
||||
## 🔗 相关文件
|
||||
|
||||
- 系统索引: `novel-system/ZZ-INDEX.hdlp`
|
||||
- 工作台: `novel-system/DASHBOARD.md`
|
||||
- 检测引擎: `novel-system/scripts/自检精修.py`
|
||||
|
||||
---
|
||||
|
||||
> ⊢ 朝暮 ICE-GL-CM001 · D182 · 2026-07-11
|
||||
> ⊢ 明天见频道 · novel-system · ZZ-007
|
||||
Loading…
x
Reference in New Issue
Block a user