长篇文风量化改造与连续性审校
把"这章读起来干巴巴的""AI 味太重"这类主观感受,转成一组可测量、可复现、可验收的指标;再用三层审校法找出机械扫描抓不到的硬伤。
本技能由一位中文长篇小说作者的实战流程提炼而成,全部方法在数十章真实稿件的打磨中校准过。示例均已抽象为通用写法。
目录
- 快速参考
- 第一部分:文风量化改造
- 1. 八项核心指标
- 2. 改造手法(按优先级)
- 3. 冷钩前置:让开场不平淡
- 4. 密度陷阱
- 5. 标准流水线
- 第二部分:连续性三层审校
- 第一层:机械全量扫描
- 第二层:并行精读审稿
- 第三层:回原文逐条取证
- 第三部分:硬伤类型学
- 第四部分:AI 腔的量化判别
- 第五部分:定稿前的最后精读
- 附:工具脚本
快速参考
| 场景 | 操作 |
|---|---|
| 某章"太短促/碎" | 看指标 → 跑 style_check.py → 按 §2 手法改 |
| 某章"AI 味重" | 跑 ai_tell_check.py,按 §4 分类处理 |
| 某章"开场平淡" | 用 §3 冷钩前置手法,只调信息顺序 |
| 字数不足(如目标 5500+) | §2 补成段环境 + 体貌,不硬灌情节 |
| 写完一卷要查跨章 | 走 §第二部分三层审校 |
| 定稿封版前 | 走 §第五部分人工精读,工具全绿 ≠ 可封版 |
| 写完一章必做 | 转引号 → 双核验 → 更新台账 |
| 想看实例 | assets/example.md,四组改前改后对照(含实测指标) |
第一部分:文风量化改造
1. 八项核心指标
改造前先跑一遍指标,方向可能每章相反——先看数据再动手。
| 指标 | 建议阈值 | 说明 |
|---|---|---|
| 正文 CJK 字数 | ≥ 5000(按目标调) | 中文字符数,不含标点空格 |
| 均句长 | ≥ 15 | 句子切分以 。!?; 为界 |
| ≤12 字短句占比 | ≤ 48% | 短句过多读起来碎 |
| ≤6 字超短句占比 | ≤ 22% | 最刺眼的碎感来源 |
| 均段长 | 40–70,目标 50–55 | <40 太碎,>70 太密 |
| 对话占比(dia) | 30%–48% | 含左引号的段落的字数 / 全文 CJK |
| 体貌动作词密度 | ≥ 2.4% | 肩/喉/眉/腕/袖/咳嗽/蹲 等词表词 |
| 感官词密度 | ≥ 2.0% | 湿/冷/风/尘/影/亮/暗/香/热 等词表词 |
两个反直觉事实:
- 均段长每题方向可能相反。同一部书里,上一章初稿均段长 78(太密要拆),下一章初稿 29(太碎要并)。不要套模板,先量。
- 对话占比按"含左引号的段落"的字数计,不是按引号内字数。所以「一问一答拆两行」时只有答语那行算进 dia——这一点决定了后续几种无损调平手法为什么有效。
2. 改造手法(按优先级)
按此顺序尝试,前面的性价比最高:
① 碎问答并进叙述长句
把一问一答的短对白改写成叙述句:
- 改前:
"几点?"他问。/"亥时。"答。 - 改后:
他问几点,答说亥时。
一次压 dia、short、very_short 三项,且不改语义。
② 补成段环境
每章 ≥3 处,每处 ≥80 字,必须含三感(嗅/听/视)+ 光影。环境要参与叙事,不能是静态布景——它得和这一章的气氛、人物的心理状态咬合。
③ 补人物特写与行为特征
原则:出场即画像,一人一口吻。给每个角色一个属于他自己的习惯动作(不是通用的"笑",而是"笑起来只动嘴不动眼"或"不大笑,嘴角提一提落得更快")。详见 §硬伤类型学「同一描写复用」。
④ 单字对白改造
"是。" / "嗯。" / "我知道。" 这类单字对白,改成带承接叙述的形式:他应了一声:是,是摔过。
⑤ 撞击点保留短句
关键的戏剧短句(一句定调、一句戳心的话)要保留,这是节奏。每章最多留 3–5 条。判断标准:这句话删了,这一段的力道就散了——那就留。
⑥ 无损调平(不动一个字,只调段落切分)
当 dia 偏低时,不要靠加对话。利用"dia 只计含引号段落"的特性:把「叙述行(无引号)」与紧随其后的「答语行(含引号)」并成一行——叙述字数即整体计进 dia。默认按叙述行字数从大到小取,凑够目标值即停。
3. 冷钩前置:让开场不平淡
诊断:单元故事/章节最常见的钝法是「先铺环境、后出事」——钩子被埋到第四段以后,读者前三屏无事发生。
手法:只改信息排列顺序,不动案核、不动人物、不动框架。
- 找出本章的异常核——一条违反常识的事实、一条奇怪的规矩、一件放错位置的东西。
- 首句直给异常核,用 2–4 句独立成段把它立住(可含一句撞击短句)。
- 紧接一句反扣或疑问("没人问过""没有一个人见过""说不通的是"),制造悬置。
- 环境段、人物出场、查证过程全部后移。
- 跑双核验——冷钩前置会略微抬高短句率,用「碎问答并进叙述」对冲。
抽象后的改前 → 改后对照:
| 改前首句(平铺) | 改后首句(冷钩) |
|---|---|
| 那年的雨水特别多 | 库房里少了一样东西。银子一块没动,少的是一本账——贼为它开了一道整块铁板做的门。 |
| 铺子开在城南 | 城里有六只碗。谁买走其中一只,不出三年那只碗必要缺一处。没人问过:那些缺,到底缺在哪儿。 |
| 夜里的风很冷 | 那已是第七回。七回里,没有一回丢过东西。 |
4. 密度陷阱
补字数时,分母也在变大。
实测教训:补一段感官描写后,加 82 字含 6 个感官词 → 密度 1.9%(仍不达标);再加 180 字含 12 个 → 2.0%(达标)。
判断标准:新增字数 ÷ 达标所需词数 ≤ 12。即每 12 个新字至少要含 1 个词表词,否则白补。
更优解:在已有句子里加词,别猛加新段。 新段会同时扰动 dia/均段/句长三项。优先在已有叙述句与已有引语句内部插入词表词——引语句内加词不新增 dia 段落,性价比最高。优先补当前频次为 0 的词(笑/叹/摇头/咳嗽/蹲/尘/香/热),这些词在自然叙事里几乎不违和。
5. 标准流水线
单章打磨的固定顺序(顺序不可乱,转引号必须紧跟写改动作):
Write/Edit → 转引号 → 短段合并 → 尾巴合并 → 并接悬空
→ 手工回读并接处(粘连的拆回)→ 转引号 → 双核验
关键约束:
- 每次 Write/Edit 之后必须立刻转引号。写改工具会把手写的中文弯引号转成 ASCII 直引号,不转会同时踩两个坑:正文核验报"英文直引号 N 处",且 dia 因左引号缺失而暴跌(实测某章从 30.9% 掉到 14.7%)。
- 不要攒到章末才转,改一段转一次,成对出现。
- 合并器必须有 CJK 守恒断言。用
for i in range(...) + del out[i] + break的写法会静默丢字(实测一次丢掉 2256 字,CJK 13342→11090,而断言因写错位置仍报"守恒")。正确写法是索引式单趟推进:
i = 1
while i < len(out):
if 满足合并条件:
合并; continue # 不前进
i += 1
第二部分:连续性三层审校
文风核验只看单章。跨章冲突——锚点漂移、时间线打架、伏笔自相矛盾——它一个都抓不到。写完一卷必须单独跑这一轮。
第一层:机械全量扫描
写脚本 grep 全部正文,别用肉眼。 覆盖项:
- 红线:真实姓名泄漏、禁用词、英文残留、年份违规、序号小标题、ASCII 直引号
- 锚点:每个角色/道具的固定写法首次登场章 vs 设定档案是否一致
- 种子命中:伏笔关键词在各章的命中情况
- 密度:主要叙事线每 N 章的密度是否断层
- 口径:人物姓名、称呼在设定档与总表之间是否统一
第二层:并行精读审稿
按 5 章一组分派给并行子代理精读。prompt 里必须写死这三条约束,否则返回一堆赞美、浪费 token:
- "只报问题,不许写'写得好'"
- "每条必引原文短句作为证据"
- "给出严重度分级"
第三层:回原文逐条取证
子代理报的结论不能直接采信。 写脚本 grep 回原文确认语境,再决定改不改。
实测数据:某轮 10 条疑点逐条验证全部为真;另一轮 15 条里有 2 条经核实不成立。虚报与真 bug 都常见,流程不能省——省掉这一步,就会把"误报"当成 bug 去改好文本。
第三部分:硬伤类型学
按根因归类,比按表象归类更有用。以下每类都附了"修法原则"。
A. 锚点与时间线(最高频,多数硬伤的根因)
| 类型 | 表现 | 修法 |
|---|---|---|
| 锚点漂移 | 同一道具的属性在各章不一致(表壳"银的" vs 全书"黄铜") | 建锚点表,全书统一 |
| 时间账自述 | 角色自述"在某地待了多久"与编年表对不上 | 按编年表算,改成符合设定的模糊表述 |
| 通信时差 | 甲章寄信、乙章收信,间隔与信中所述"走了一个月"矛盾 | 按两章时间差核对 |
| 设定数字打架 | 同一句话里两个数字矛盾("干了十二年" vs 档案"三十八年") | 列出正文所有 \d+年,回设定档核对 |
| 年龄算错 | 出生年 → 当前年推算有误 | 建人物生年表 |
B. 道具与身份(容易被读者一眼抓住)
| 类型 | 表现 | 修法 |
|---|---|---|
| 道具名同义漂移 | 同一物件被叫成两个近义词("拓纸" vs "抽纸") | 全章搜该物件所有称呼,统一;顺手查动词是否也重复 |
| 道具/职业漂移 | 角色的手艺、职业在多章间变化 | 回原章核对实物 |
| 在场身份错位 | 角色在某章的实际身份与后文追述不符 | 回原章核对 |
| 住处/地名混用 | 把组织的地方说成主角的住处 | 建地点归属表 |
| 配角凭空具姓 | 后章说"那个探子姓王",前章只写"一个探子" | 回前章补姓 |
C. 逻辑与时序(最严重,也最难被工具抓到)
| 类型 | 表现 | 修法 |
|---|---|---|
| 人物已离场仍在场 | 角色已下楼,后文仍写"两个人的影子" | 凡"两人同框"描写,逐一核对发生时间 |
| 计数前后不符 | 刚列了三样,下一句说"这四样" | 凡出现"第X条/这X样",回头数一遍 |
| 补叙插错位置 | 一段"出门前问了什么"被放在"出来后"之后 | 整块(含空行)移到正确位置 |
| 同一状态写两次 | 灯在 A 处已灭,B 处又灭一次 | 列全文状态关键词行号核对 |
| 改名/名号不一 | 同一人在不同章称呼不同 | 建人物口径表 |
D. 叙事层(最严重,文风与正文核验都查不出)
提前泄底:配角在破案/揭晓前,说出全章甚至全书核心设定的解释。
- 修法:配角只说"规矩",不说"解释"。「这东西是给死人用的」→「坏了的东西不许修,也不许问」。规矩比解释更有压迫感,且读者自己推得出来。
- 检查法:搜「这说明」「就是」「原来」+ 核心名词的组合。
改写后的连锁反应:
- 会引入新重复——改写段落后,相邻段落可能说了同样的话。每次 Edit 后必须回读相邻 2–3 段。
- 感官词密度最容易掉——改写压缩描写会把密度拉低。按"每 12 新字含 1 个词表词"补。
E. 五个"改错方向"的铁律
- 多文件冲突改"少数派":1 对 4 时改那 1 个,否则牵连五个文件。
- 改一处必问"对面那章的实物是什么":跨章引用必须回原章核对实物。
- bug 尽量转成好的叙事层次,而不是改数字:称呼矛盾可以改成"排行老三、街坊叫老四、纸上写姐是敬称",由角色现场推出——比单纯统一称呼有价值。
- 最后一处可能不是 bug:章末的主题句、推理枢纽句,即使形态像 AI 腔也要留。
- 别把修辞性叠用当重复:「粗细不一样、深浅不一样」是修辞,不是 bug。
F. 补章前伏笔(公平推理原则)
后章引用前章的物证时,前章必须已经明写。
判断口径:破案关键线索,在破案之前是否已明写给读者?没有就是严重 bug。
实测案例:后章某角色凭"火药味"识破主角摸过箱子,但前章从未提过箱子里有火药——需回前章补写"压舱那头搁了一包火药",两个问题一次解决。
第四部分:AI 腔的量化判别
密集 ≠ AI 签名,堆叠才是。 判定"AI 腔"必须先跑同段堆叠统计。
> 完整的词表与句式库见 references/ai-tell-lexicon.md(300+ 条目,按毒级排序,ai_tell_check.py 会自动扫描)。
判定方法
# 找同段内 ≥3 次的堆叠簇——这才是一眼机器的地方
import re
P = re.compile(r'不是[^。!?,]{0,18}[,,]?\s*(?:而)?是[^。!?]{0,25}')
for para in paras:
if len(P.findall(para)) >= 3:
print(para) # 命中即堆叠,必改
| 指标 | 阈值/做法 |
|---|---|
| 「不是…是…」对举 | 全章计数;>6 处即 AI 腔,压到 2–3 处留最有力的 |
| 同段堆叠(≥3 次) | 出现即改,这是硬伤 |
| 独立短句「这不是…」 | 逐条列出人工判,最容易出"AI 金句" |
| 论文式条目 | 叙述段以「第X条,」「一、」「他先说第X种:」开头且 >60 字 → 改叙述 |
| 原话复述 | 角色 A 说完,角色 B 原样重复 → 删 |
| 一级禁用词命中数 | 见词表 §二,逐类统计(情态/动作/表情/心理/判断/形容) |
| 虚伪精确数字 | 0.3秒、一步跨50cm 这类无意义精确 → 删 |
关键判据:分布式节奏签名(如全篇均匀分布的某种句式)即使每千字 0.63 处也不必改,只改堆叠簇。
「不是A而是B」的四个变种(小说重灾区)
普通对举检测抓不到变种,必须分开判:
| 变种 | 例 | 问题 |
|---|---|---|
| 假靶子 | 改变的不是工具,而是生产关系 | 没人说过是工具 |
| 同义替换 | 她不是在演风,而是在演一种失控感 | 风 ≈ 失控感 |
| 无关硬凑 | 他不是传统的跟踪片,而是愿望反噬 | 两者无关 |
| 拆分式 | 这不意味着X。它意味着Y。 | 跨句对举,最隐蔽 |
修法:删前半句 / 合并同义 / 直接写后半句。
AI 腔真正该改的 4 类
- 违禁副词:「意味深长地」「淡淡地说」「缓缓开口」——清单明列,必删。
- 同一描写复用于不同角色(最典型、最容易漏):两个角色用了一字不差的动作描写。
- 修法不是换措辞,是各给一个属于他的习惯动作。 - 格言式金句收口:「有些东西,散了比聚的好」→ 改成动作 + 具体物证("他伸出干瘦的手指,在桌沿上点了三下……那只碗,缺过三回,三回都在同一个地方")。
- 直接命名情绪:「神情极复杂,既像…又像…」→ 改用手部动作("把手松开,又缩回自己袖子里")。
中文对白 AI 腔(小说高频,结构检测抓不到)
| 类型 | 表现 | 修法 |
|---|---|---|
| 五官套路 | 眼中闪过一丝X、嘴角勾起一抹Y、瞳孔微缩、指节泛白 | 用整体动作替代(垂下眼、笑了一下没到眼底) |
| 心内套路 | 心中一动、心头一震、心下了然、不由得 | 用身体反应,或直接删 |
| 万能状语 | 「,带着一丝不易察觉的嘲讽」 | 拆短句 |
| 无信息对话 | 死里逃生现场还在问"你这刀法练了多久" | 对话必须有信息量,或删 |
| 升华收尾 | 这一刻,他终于明白了…… | 用具体物件收束 |
检查法:把词表 §一、§二的"表情类""心理类"逐词 grep 一遍,命中即人工判。
改写后自查五项(来自 humanizer 方法)
改写完成后,专门搜这五个最常残留的痕迹:
- 一个「不是X而是Y」对举
- 一句单行收尾(重复前文意思的空句)
- 一个破折号
- 一组三段式排比
- 一个加粗标签
同时核对:改写是否增加或丢失了任何事实、名字、数字、日期、引用?无依据的新增算错误。
分句长节奏:真实写作长短交替。如果改写后每句都一样长,那是另一种机器味。
元叙述出戏扫描(必跑,最刺眼)
写死一个词表 grep 全部正文(先去章头 HTML 注释,否则注释里的"卷一/大纲"全是误报):
卷一|卷二|到此收束|全书|本章|读者|作者|前文|后文|伏笔|暗线|这一章|剧情|叙事|结构|节奏
- 判定:正文(非注释)里出现"到此收束""读者""作者"= 当场出戏,必改。
- 但"上回/下回/节奏/结构"在对白与普通叙述里是正常汉语,不能一刀切误杀。
章节号漏改进正文(工具完全查不出)
写跨章回忆时手滑把骨架里的编号写进正文,读起来像作者在指路。
- 扫描:
re.findall(r'[,、]\s*0\d\d\s|0\d\d 那|0\d\d 他|0\d\d 她', 正文),命中即改。 - 修法:一律改成叙事词——
上回/前一张/那一次。 - 根因:正文是"人物在场"视角,读者在同一本书里不会看到编号——编号只属于大纲和台账。
第五部分:定稿前的最后精读
双核验全绿、引号配对全对之后,逐字读一遍正文,仍能抓出机械扫描查不出的问题。 实测某章一次抓到 13 处硬伤。这一步不可替代。
精读前先跑这三条机械扫描(能覆盖其中一半)
# 1) 重复段落(合并器最容易复制出来的)
from collections import Counter
c = Counter(l.strip() for l in lines if len(l.strip()) > 15)
[k for k, v in c.items() if v > 1]
# 2) 粘连:逗号后接人名且后跟动词
re.finditer(r',([^“”\n]{0,40}?)(人名A|人名B)(说|把|在|也|没有|又|站|走到)', line)
# 3) 繁体混入 / 段尾无终止符
for ch in '隻個們這樣時': ...
注意:第 2 条有约三分之一误报(,"X。"他说,"Y。" 是合法的一人两段引语),要肉眼看。
更狠的重复扫描:段内 n-gram(n=6~8,滑窗)
普通的"重复行"扫描查不到行内重复。修辞性叠用(粗细不一样、深浅不一样)会误报,人工判。
seen = {}
for i, ln in enumerate(body.split('\n')):
s = re.sub(r'[\u3000\s]', '', ln)
for j in range(len(s) - 11):
seen.setdefault(s[j:j+12], []).append(i + 1)
{k: v for k, v in seen.items() if len(set(v)) > 1}
精读要盯的 6 类
| 类 | 表现 | 修法 |
|---|---|---|
| 重复段落 | 同一段连续出现两次 | 删掉重复的那一段 |
| 描写重复 | 同一处描写被合并器复制两遍 | 保留写得细的一处 |
| 繁体混入 | 个别字是繁体 | 改简体 |
| 量词错 | 用错量词("两具断手"——具是数尸体的) | 改正确量词 |
| 叙事粘连 | 「盖住,他是中午来的。」 | 逗号改句号,必要时分两段 |
| 逻辑/时序矛盾 | 开头某人已在现场答话,后文却写"他中午才来" | 重写该句使其自洽 |
写作噪声注入(每次写完必扫)
扫:[A-Za-z]{3,}、⊆、重写、holder、**、ASCII 直引号、\ufffd(替换字符)。
实测常见残留:变量名漏进正文、---(重写这一段) 占位符、并接工具制造的 ,,(须批量拆回)。
章末钩子评分
具体物件 = 5 分,升华/内心意象 = 1 分。
- ❌ 纯内心意象:「那孩子,好像正从纸上看出来」——读者不知下一步期待什么。
- ✅ 具体物件 + 对照:「他把表壳凑到灯下……一个是二十年前落的墨,一个是今天才有的光」。
- 状态陈述也常合格:「那女孩已经走了」前紧接两声无人应 → 物件即钩。
台账写入后扫 \ufffd
Python 脚本里手写长中文串时容易混入替换字符。每次写完 md 台账必扫:'\ufffd' in s。
附:工具脚本
| 脚本 | 用途 | 调用 |
|---|---|---|
scripts/style_check.py |
八项文风指标核验 | python style_check.py 正文文件.md |
scripts/ai_tell_check.py |
AI 腔与元叙述扫描 | python ai_tell_check.py 正文文件.md |
scripts/dup_scan.py |
重复段落 + 段内 n-gram 扫描 | python dup_scan.py 正文文件.md |
scripts/convert_quotes.py |
弯引号修复(每次写改后必跑) | python convert_quotes.py 正文文件.md --write |
脚本用绝对路径调用,不要先 cd 到脚本目录。Windows 下建议在脚本头部加 sys.stdout.reconfigure(encoding='utf-8') 避免中文乱码。
详细参考见 references/ 目录,改前改后实例见 assets/example.md。
脚本自检(可复现)
四个脚本均已用样本实测通过,可自行复验:
| 脚本 | 验证方式 | 实测结果 |
|---|---|---|
style_check.py |
喂入碎对白样本 | 均句长 5.6 / 超短句 61.5%,并进叙述后变为 12.3 / 0% |
ai_tell_check.py |
喂入三连对举样本 | 正确报出「同段堆叠 ≥3 次」硬伤 |
dup_scan.py |
喂入两个角色同一描写 | 正确定位到隔行的 8 处 12-gram 重复 |
convert_quotes.py |
喂入 ASCII 引号正文 | 8 个直引号全部转为弯引号,dia 由 0% 回升 |
创作原则小结
- 量化替代感觉——"读起来碎"要能说成"超短句占比 26%",才可验收。
- 先量后改——每题方向可能相反,套模板必错。
- 工具全绿 ≠ 可封版——机器只能覆盖一半,最后一遍必须人眼读。
- 改一处必回读相邻段——改写会引入新重复、稀释密度。
- 冲突改少数派,别改多数派——别为一处错牵连五个文件。
- 泄底最严重,规矩比解释高级——让读者自己推出来。