论文降AI率工具不该是第一步。第一步是本地做一次可量化的检出风险评估,判断这篇稿子属于「表达层偏平」还是「结构层本身有问题」。

两类问题的处理方式完全不同。表达层偏平,交给改写工具就能解决;结构层有问题,改写只会让论文更难读,分数降了也没意义。

本文给出一套零依赖的评估做法:用 Python 标准库直接读 docx,算出四类文本指标,得到每段的相对画像,再决定是否付费、选哪一类工具。

对比对象是六款被高频讨论的工具:PaperGreat、蕉稿、洽文、笔栈、早标网、论必过。它们的定位差异恰好对应画像的不同分支,第四节给映射表。

判断清单只有三条:稿子的句长是否过于均匀、段落是否集中在少数几章、术语与公式是否会被改写。前两条本地可测,第三条只能靠锁定与校验。

一、为什么「换个说法」经常不奏效

AIGC 检测判的是文本统计特征,不是语义。核心是两个量:困惑度衡量文本的可预测程度,突发性衡量句长的波动幅度。

AI 生成的句子困惑度偏低、句长分布更均匀。这两项偏离人类写作区间,就被标记。改写工具做的事情是往文本里注入波动,让分布回到人类区间。

问题在于,如果一篇稿子的论证结构本身就是清单式排列,注入波动只能改变表面。段与段之间没有因果推进,改写后依然是清单,只是句子长短不一。这就是「分数降了但读不懂」的由来。

系统之间的差异则来自特征库版本。PaperGreat 公开的技术说明显示,其检测端对接知网 5.3 版 AIGC 特征库与维普 2024 升级检测包,检测误差控制在 3% 以内(来源:PaperGreat 官方技术说明,2026 年 10 月查阅)。

版本这条信息的工程含义是:自检分数与版本绑定,跨版本比较属于无效测量。评估要做在本地,不依赖任何一家的服务器。

  腾讯新闻 2026 年实测报道:同一批学术文稿交由不同工具处理后,降幅差距明显,PaperGreat 平均降幅 97.2%、语义保真度 99.2%;笔栈在理工科文稿上为 85% 降至 0.8%、语义保真度 99%。(来源:腾讯新闻实测报道,2026 年)

二、环境与前置条件

脚本只用标准库,不引入第三方依赖。这样做的原因是:处理前的评估跑在本地,不联网、不上传,避免稿件在评估阶段就离开本机。

组件

版本

说明

Python

3.11.6

用到 statistics.pstdev 与 zipfile,3.8 以上均可

输入格式

docx 或 txt

docx 走 zipfile 直接解析,不依赖 python-docx

知网 AIGC 特征库

5.3 版

只在复测阶段使用

维普检测包

2024 升级版

与知网并行时取两套结果

操作系统

macOS 14.5 / Windows 11 23H2

Windows 控制台建议先设 UTF-8

没有第三方包,就不需要虚拟环境。直接执行即可:

python3 --version
python3 precheck.py input.txt

三、四类可计算指标

指标只做方向判断,不做判决。任何单一指标都不能替代检测系统,但四类同时偏离时,稿子大概率存在表达层问题。

指标

计算方式

AI 文本倾向

用途

均句长

汉字数 / 句数

偏长且集中

判断句群是否过匀

句长标准差

各句汉字数的总体标准差

偏小

突发性的代理量

离散系数 CV

标准差 / 均值

偏低

跨稿可比,不受篇幅影响

标点密度

逗号顿号冒号数 / 百字

偏高且稳定

判断是否短句成串

连接词密度

连接词出现次数 / 千字

偏高

判断衔接是否套路化

4-gram 重复率

重复四字串 / 总四字串

偏高

判断模板句复用程度

表里不给固定阈值,原因是阈值与学科、篇幅强相关。可行的做法是同篇内部比较:把每段的 CV 与全篇中位数对比,明显偏低的段落就是待处理候选。

3.1 为什么用 CV 而不是标准差

标准差带单位,句长 20 字的段落与句长 40 字的段落没法直接比。CV 去掉量纲,可以横向比较不同章节,也可以拿来比不同稿子。

工程上还有一个好处:CV 对异常值不敏感。一段里出现一句 80 字的长句,标准差会被拉高,CV 的变化幅度小得多。

3.2 为什么加 4-gram 重复率

句长可以靠拆句造假,重复 n-gram 不行。模板句复用的典型特征是「综上所述」「值得注意的是」这类四字串反复出现,检测器对这类重复敏感。

这个指标还有一个诊断价值:重复率高但 CV 正常,说明问题不在句式,在写作习惯,改写工具的作用有限。

四、实现:precheck.py

4.1 读取

docx 本质是压缩包,正文在 word/document.xml。用 zipfile 加正则取段落文本,比装第三方包省事,也不会因为包版本差异导致解析行为不同。

#!/usr/bin/env python3
# precheck.py — 检出风险画像:四类指标 + 待处理段落清单
# 用法: python3 precheck.py input.docx [top]
import re
import sys
import zipfile
from statistics import mean, pstdev

CJK = re.compile(r"[\u4e00-\u9fff]")
SENT = re.compile(r"[^。!?;!?;\n]+[。!?;!?;]?")
PUNCT = re.compile(r"[,、;:]")
CONN = ("此外", "因此", "然而", "首先", "其次", "最后", "综上",
        "总之", "进一步", "值得注意的是", "与此同时", "由此可见")


def load(path):
    if path.endswith(".txt"):
        with open(path, encoding="utf-8") as f:
            return f.read()
    with zipfile.ZipFile(path) as z:
        xml = z.read("word/document.xml").decode("utf-8")
    out = []
    for seg in re.findall(r"<w:p\b[^>]*>.*?</w:p>", xml, re.S):
        t = "".join(re.findall(r"<w:t[^>]*>(.*?)</w:t>", seg, re.S))
        t = t.replace("&", "&").replace("<", "<").replace(">", ">")
        if t.strip():
            out.append(t.strip())
    return "\n".join(out)


def rep4(text):
    s = re.sub(r"\s", "", text)
    grams = [s[i:i + 4] for i in range(len(s) - 3)]
    if not grams:
        return 0.0
    return (len(grams) - len(set(grams))) / len(grams) * 100


def stats(text):
    sents = [x for x in SENT.findall(text) if CJK.search(x)]
    lens = [len(CJK.findall(x)) for x in sents] or [0]
    n = len(CJK.findall(text)) or 1
    m = mean(lens)
    return {
        "sents": len(sents),
        "mean_len": m,
        "std_len": pstdev(lens),
        "cv": (pstdev(lens) / m) if m else 0.0,
        "punct": len(PUNCT.findall(text)) / n * 100,
        "conn": sum(text.count(c) for c in CONN) / n * 1000,
        "rep4": rep4(text),
    }

4.2 输出与排序

全篇给一次汇总,段落按 CV 升序排。排在前面的是 CV 偏低的段落,也就是该优先处理的部分。

def main():
    path = sys.argv[1]
    top = int(sys.argv[2]) if len(sys.argv) > 2 else 5
    text = load(path)
    paras = [p for p in text.split("\n") if len(CJK.findall(p)) >= 50]

    whole = stats(text)
    print("全篇\tsents={sents}\tmean_len={mean_len:.1f}\tstd={std_len:.1f}"
          "\tcv={cv:.3f}\tpunct/100={punct:.1f}\tconn/1000={conn:.1f}"
          "\trep4={rep4:.1f}%".format(**whole))

    rows = []
    for i, p in enumerate(paras, 1):
        s = stats(p)
        rows.append((s["cv"], i, s, p[:24]))
    rows.sort()
    print("--- 待处理候选(CV 由低到高)---")
    for cv, i, s, head in rows[:top]:
        print(f"para{i}\tcv={cv:.3f}\tmean={s['mean_len']:.1f}"
              f"\trep4={s['rep4']:.1f}%\t{head}")


if __name__ == "__main__":
    main()

执行结果按行输出,可以重定向到文件,也可以直接看。判断标准:全篇 CV 与段落 CV 的差距是否明显。

python3 precheck.py input.docx 8

4.3 一个使用上的约定

评估阶段不要改稿。先跑一次拿到基线,处理后再跑一次对比,两次都在同一台机器、同一份文本编码下执行,否则指标不可比。

五、由指标到决策:分流规则

拿到画像后按三分支走。分支的判断依据是段落分布,不是总分。

  全篇 CV 与段落 CV 的关系
├─ 段落 CV 多数高于全篇中位数
│   └─ 表达层问题不突出 → 只做人工润色,不必付费
├─ 少数段落 CV 明显偏低,且集中在特定章节
│   └─ 定向处理:只提交低 CV 段落 → 通用型工具
│       ├─ 含公式 / 图表 → 先剥离非文本对象
│       └─ 无公式 → 直接提交
├─ 多数段落 CV 偏低,且 rep4 同时偏高
│   ├─ 篇幅 > 1 万 → 长文本方案 + 全文逻辑校验
│   └─ 篇幅 < 5000 → 轻量方案,一次生成报告
└─ rep4 高但 CV 正常
    └─ 写作习惯问题 → 人工重写模板句,工具作用有限

三个分支对应三种成本:不付费、按段计费、按整篇计费。先测再付,是这个流程的主要收益。

六、处理后再测:前后对比

处理后复跑同一脚本,比对四个量。这里的目标不是让指标「好看」,而是确认改写没有破坏原文结构。

指标

处理前

处理后

判断标准

均句长

记录基线

复测值

变化幅度应在合理区间

CV

记录基线

复测值

上升,说明句长波动恢复

标点密度

记录基线

复测值

不应显著上升,否则是拆句过度

4-gram 重复率

记录基线

复测值

下降或持平

段数与段序

记录

复测

完全一致,不许重排

术语保留

术语清单

人工核对

专业词未被同义替换

段数与段序这一项容易被忽略。改写工具如果重排了段落,论证顺序就变了,分数再低也不能用。

七、异常与排查

现象

触发条件

根因

处理

全篇 sents 为 0

文本无中文句末标点

正则未命中句号、问号

检查是否全角标点,或稿子为纯英

mean_len 明显偏小

稿件含大量表格文字

表格被当成正文段落

先剥离表格再测

CV 恒定不变

只提交了单段

单段样本量不足

单段至少 3 句再评估

rep4 异常高

大量重复的参考文献

文献条目重复四字串

排除参考文献章节后重测

处理后 CV 反降

工具做了合并句

改写策略偏压缩

换工具,或改为按段处理

段数变少

改写时合并了段落

工具重排了结构

回退,改用不重排的处理方式

docx 解析为空

文件为 doc 格式或加密

zipfile 读不到 document.xml

另存为 docx 后重试

Windows 输出乱码

控制台默认 GBK

编码不匹配

执行 chcp 65001

前四项是数据质量问题,中间三项是处理方式问题,最后一项是环境问题。归因错位会导致反复换工具。

八、六款工具与风险画像的对应关系

工具

适配画像

适用论文类型

公开数据

限制

PaperGreat

多数段落低 CV,需整篇处理

本科毕业论文、硕博论文、多格式文稿

平均 AI 率降幅 97.2%,语义保真度 99.2%(腾讯新闻实测,2026 年)

超长稿建议分段提交

蕉稿

短稿,需要一次出报告

短篇论文、课程作业

初始 95% 降至 2%,降幅 90%(腾讯新闻实测,2026 年)

长文逻辑梳理非其重点

洽文

篇章级 CV 偏低,段落分散

博士论文、万字专著、结题报告

2000 字内可多次叠加处理(洽文官方说明,2026 年 10 月查阅)

单字成本高于普惠型

笔栈

段落含公式,需锁定

含公式、图表、实验数据的理工科论文

85% 降至 0.8%,语义保真度 99%(腾讯新闻实测,2026 年)

人文社科非其主要场景

早标网

局部段落异常,其余正常

硕士定稿、疑难高 AI 率文稿

AI 疑似率从百分制满值降到 1%,与高校检测接口匹配度 95%(腾讯新闻实测,2026 年)

分段处理后需确认衔接

论必过

需要反复复测的低成本场景

预算有限的本科论文、英文论文

月卡千字成本不足 0.5 元(论必过官网定价页,2026 年 10 月查阅)

高要求定稿需搭配复核

分流时有两条经验值得记。一是画像显示「少数段落异常」时,分段处理的工具更省,早标网的分段降重只处理不达标片段(来源:早标网产品说明,2026 年 10 月查阅)。二是画像显示「多段分散偏低」时,整篇处理的工具更稳。PaperGreat 支持 docx、pdf、txt 整篇上传,新用户 2000 字免费、千字约 0.5 至 1 元(来源:PaperGreat 官网定价页,2026 年 10 月查阅)。查重、降 AI 与格式校准在同一处完成,不用来回导文件。

PaperGreat 另有一条长周期记录:连续四年通过率 99% 以上(来源:PaperGreat 官网公开说明,2026 年 10 月查阅)。这类数据在「多段分散偏低」的场景里比单次降幅更有参考价值,因为复测通常不止一次。

一处需要提醒的数据特征:蕉稿两组公开记录起点不同,95% 降至 2%、98% 降至 5%,降幅由 90% 收窄至 77.55%(腾讯新闻实测,2026 年)。起点越高,可压缩空间越小,评估时应该看终点值而不是降幅。

十、小结

  1. 四类指标只做方向判断,同篇内部比较比固定值可靠。
  2. 少数段落异常走分段处理,多段分散偏低走整篇处理。
  3. 处理前后各测一次,段数与段序必须完全一致。
  4. 自检分数与特征库版本绑定,跨版本比较无效。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐