
zh-writing-checker 是个给中文稿子查毛病的命令行工具,纯 Python 标准库,一条命令跑完,不装依赖。
上一版只会找坏词:找到一个词报一个,报完不分层,报多少都算错,改的人只能从头改到尾,或者干脆关掉。
这一版换了做法,AI 味检测从找词改成看句子结构,报出来的第一次分出轻重:硬拦的必须改,只提醒的自己看。看着像松,其实是分档的上位文件定了,这一版只接提醒那一层:16 条硬拦、13 条只提醒、3 条是方法。松的是不拦交稿,不松的是该改还得改。
先看一眼改完的结果:一篇 2493 字的中文成稿,首扫 19 个问题、15 个硬错,改完复扫,硬错归零。
上一版什么样
v0.1.5 发布于 2026 年 9 月 12 日,做的事是把 AI 味词分成三层,致命、显著、轻微各一档,给引号里的引用和技术语境开口子,命中违禁词时直接给替换词,同时上了 SF 与 SNF 两组回归评测样本,让评测进了 CI。
v0.1.4 把一批英文社区的去 AI 味模式迁进中文,句式指纹、假替代、树靶子、过度限定、知识截止、空洞词,5 条正则加 3 个词,探针验过零误伤。
v0.1.3 做了规则外置,改规则不用改代码,还配了探针、扫描、打补丁、收敛这一套递归动作。v0.1.2 是仓库更名重构那版,AI 味收成一个维度,顺带开出五维凑成六维。
到 v0.1.5 为止,找词靠词表,剩下的靠白名单。
为什么这版要动
一是词表拦不住字面正常、语境才坏的词。白名单只堵得住见过的那一句,来一句结构一样的照样报。
评测集里有这么一句:这孩子在城里长出了白头发。按词表该报腔调,因为长出配抽象名词是典型的比喻腔,可这句是写实的,报出来就是误伤。这一版把长出这一族整个移出通用档,评测里的误杀从 1 降到 0。词表这条路走到头了。
二是找得了词,找不了句子。三段等长排比配一个拔高比喻,这种长相很固定,词表一条都不拦。
三是版本漂移没人拦。版本号写死在测试里,改了代码忘改测试,流水线不红,往往推送之后才发现。
这一版不是只动机器。这一轮出了两件文档:宪法 v5.3 定档,模板集定尺。宪法划清哪一类错了能改、哪一类不能,这一版接的就是那一层;模板集管怎么写,骨架、开场、收尾各有配法。
改了哪几个领域
**一、AI 腔从找词改成看结构。**新增三类检测:并列三项等长同构判为排比腔;连续三句以比如或例如起头判为凑篇幅;相邻两段起首字相同且篇幅相近判为段落同构。
三段式排比的匹配宽度从 8 字收到 6 字,原先太宽,贪婪匹配会吞掉前置修饰语,反倒漏掉真排比。
**二、防误伤拆成三层。**头一层只收公认的坏词;第二层是带语境的正则,判搭配,同一组字放写实句里不报,挪到抽象名词旁才报;第三层是个人红线词,另存一档、默认不加载,开不开作者自己定。
长出、长出来、长成这一批词整个移出通用档。分三层是因为机器判搭配不判单字,靠词表必然误伤。
**三、跟宪法 v5.3 接档,另出一把写稿的尺。**这一版接的是提醒那一层,硬阈空白原样留着。16 条硬拦中标着可机检的 6 条,数量词与列举项对拢、百分比求和、单位统一、同一数字前后一致、模糊量化词、的字链长度,一条都没实现。
宪法 v5.3 那轮没新增硬阈,补的全是流程缺口:例外申请、按比例释放,加检查对象扩到全载体、发布闸门签核人分离、存档与新陈代谢,五样和那 6 条硬阈处境相同,都停在文档层。
这一轮出的第二件文档是体裁模板集,管怎么写。七副骨架配七种事:更新说明讲因果四段、观点文给断据说反例、教程走痛点再转方法、复盘按之前之后搭桥。开场五类,更新说明配反差式,硬尺是前 100 字必须出现一个读者认得出来的实体。v1.2 加的两条不许造词、机器报的数要核到每一条,v1.3 把三步钉成流程,不许跳步,都是写这篇稿子时撞出来的。用法三步:宪法定档,模板选骨架开场,写完过机器兜底。模板尺和机检是两套,过了一个不等于过了另一个。
不实现为什么还写进来,也交代。变更日志标成已知空白没写理由,下面三条是补的。
一是这 6 条没有一条靠单条正则能解决,得先做全文数字抽取,和这一版改的单句检测不是一个工作面。
二是误报代价不对称,错一个数字就满屏假错误,读者从此不信这个工具。
三是变更日志给的优先项是最易判误报最低的两条,数量词对拢与的字链长度。
**四、流水线上这一版添了一道自校验。**新加的是版本号自校验:改了代码忘改变更日志,版本对不上就报错,第三条说的漏洞这么堵上。另外两样是上一版挂的,没动:风格工具端到端验证,与 SF/SNF 回归评测。这两个是同一个脚本里的两组样本,各十条,一组该被检出,一组不该判问题。这一版没给门加东西,只从里面修掉一条:正常句「这孩子在城里长出了白头发」原先被误判,现在放过去了。
改完实测出了什么
机器侧:28 项测试全通过,两个套件。检查器主套件 16 项,管版本号自校验、向后兼容与规则外置、探针收敛、六维齐备、四类检测维度、干净文本零误报、坏样本能扫出、报告行数对账、JSON 兼容字段,另有两层分档 3 项。
风格打分套件 12 项,管分数区间与归属、基线往返、指纹向量。
AI 腔例句 10 条全抓,正常句 10 条零误伤,误杀率 0,两组全过。
真稿侧:那 15 个硬错里,13 个是同一个根因,正文里用了半角直引号,中文排版该用弯引号,一条检测规则一次抓出 13 个。它报的不是 13 个错,是一处错报了 13 遍。真正要记的是剩下那 2 个,分档后它们是提醒,不改也能交,这一版的分层头一回在实际稿子上生效。
另跑单维度扫描,又带出两处毛病。单扫排比一项,机器报 10 处,逐条看下来一处真排比都没有:三处是顿号列举被切出后三项,另七处是把不同句子里的短分句凑成了等长三项。
换这篇稿子配的交稿单再跑一遍,照抄英文原文引句和链接地址,标点检测一次报 33 个硬错,而来源记录类文档恰恰必须原样引用,规则和用途天生打架,这一条记进下个版本清单。
还有一处反向验证:改写掉的那句单独存一篇,机器报腔调硬错 1,确实该改。
局限也摆出来:成稿出自作者自己,是自测。

还差什么
九条按类摆成两组,每条都能下个版本回查。
规则写错,会误伤正常中文稿
破折号检测把中文里规范的破折号也判成 AI 味,这条会误伤正常中文稿
技术语境豁免没接上,正文里技术词照样判 AI 味,v0.1.5 写好的白名单引号包起来也不放行
标点检测分不出正文与命令示例,示例里的文件名会判成中英标点混用
日期检测抓的正好是它建议的那一种写法,写成 YYYY-MM-DD 会被自己报一遍
版本号联动刚加,接进流水线要自己配
还没有的能力
16 条硬拦里标着可机检的 6 条,本版 0 实现,下个版本按最易判的两条先上
机器能判的是 6 个检测维度,语言层 4 项加表达层 2 项,和那 16 条不是一回事
等长排比判据会跨分句误报,本篇自己的稿子报 10 处,逐条核过一处真排比都没有,误报率 100%,比上一篇的 36% 高
跨载体一致性,标题、图注、摘要之间对不对得上,只能人工核
本篇当场撞上这九条四处,都改了写法:一个技术词、一个中文破折号、示例里的文件名、一个还留在词表里的搭配。剩五条照原文列着。
用起来是一行命令
python zh_writing_checker.py article.md
把 article 换成稿子名就行。开个人词档加一个环境变量,词表自己维护。
适用边界
这套东西给写中文、稿子还要拿给别人看的人。公众号日更的,技术长文要过审稿的,报告与对外文案都要过一遍手的,错了收不回来。
稿子只发给自己存档的,用不上这一套。
v0.1.6,2026 年 10 月 2 日发布,范围就上面四块。仓库外脚本一行没动,六套主题都在 md2wechat.py 里,本稿取宣纸那一套。
开源库地址 https://github.com/zhengjinjun1975/zh-writing-checker,Apache-2.0 协议,一条命令跑完。