exergyleizhou-ux/PaperGuard
GitHub: exergyleizhou-ux/PaperGuard
PaperGuard 是一个开源工具,用于筛查研究数据中的统计异常,以辅助学术诚信评估。
Stars: 1 | Forks: 0
# PaperGuard
[](https://github.com/exergyleizhou-ux/PaperGuard/actions/workflows/ci.yml)
[](https://pypi.org/project/paperguard/)






[](https://huggingface.co/spaces/exergyleizhou/paperguard-demo)
[**📚 文档/INDEX.md**](docs/INDEX.md) · [**技术报告**](docs/paperguard_technical_report.md) · [**JOSS论文**](paper/paper.md) · [**HuggingFace Space**](https://huggingface.co/spaces/exergyleizhou/paperguard-demo) · [**中文 README**](README.zh.md)
## 最新动态 — 2.16.0
## 状态
**稳定版 (2.16.0)**。41 个内置检测器 (37 个学术领域 + 4 个工业领域)
+ 12 个工业领域模板 + 插件系统 + 可选多租户模式
Web 界面。覆盖数字取证、统计重计算
(statcheck 单/双尾;GRIM/GRIMMER/SPRITE/TIVA/P-curve),Carlisle
基线不平衡 (支持多臂随机对照试验),图像重复 (包含
pHash 跨图像比对、Bik 风格图像内 ORB 匹配、拼接/复制移动
取证、持久化跨论文 pHash 存储),EXIF/rsid 元数据
取证、文本与语料库相似度、折磨性短语 (150+ 论文工厂
指纹)、AI 文本启发式检测 (T6 词法 + T7 困惑度 + T8
DetectGPT + T9 学习的 TF-IDF/LR 分类器,可选启用 — 详见
[docs/llm_detection_real_endpoints.md](docs/llm_detection_real_endpoints.md)
关于端点范围说明)、文体计量学、临床试验结果
一致性、论文工厂引用图谱签名、工业流程
取证 (质量平衡闭合、SCADA 时间戳完整性、
批次重复检测、趋势过度平滑),以及 DOI / PubPeer /
Retraction Watch / ORI 交叉核查。符合 WCAG 2.1 AA 标准的 HTML 报告。可选
LLM 辅助解释。查看路线图了解待办事项。
## 工具功能
- ✅ 检测可疑的**末位数字分布** (Mosimann 1995) 及 **末位数字 0/5 偏好** (Geng 法, 2025)
- ✅ 检测宽动态范围列上的**首位数字 / Benford** 偏差
- ✅ 检测**列间算术关系** (常数差 / 常数比)
- ✅ 检测**小数一致性**和**不合理数值** (哨兵值检测)
- ✅ 运行 **GRIM** (Brown & Heathers 2017), **GRIMMER** (Anaya 2016), **SPRITE** (Heathers 2018) 合理性检查
- ✅ **重算报告的 p 值** (statcheck 用于 t/F/χ²/r/z/Q,单尾和双尾) 并标记决策反转
- ✅ **TIVA** (Schimmack 2014), **P-curve** (Simonsohn 2014), **残差平滑度** (Stapel 案例), **缺失模式** (Carlisle) 检验
- ✅ **Carlisle 基线不平衡** 检验 (针对随机对照试验),支持多臂设计并自动提取试验注册号 (NCT, ISRCTN, ChiCTR, ACTRN, EudraCT, DRKS)
- ✅ 图像取证:**跨图像 pHash** (F1), **图像内 ORB+RANSAC** (Bik 风格, F2), **拼接/复制移动** 统计取证 (F3), **持久化跨论文 pHash 存储** (F4), **EXIF 聚类** (F5)
- ✅ EXIF **时间取证** (G1), docx **rsid 取证** (G3), 文件元数据 **出版商白名单** 审计 (G4)
- ✅ 文本:与语料库的**相似度** (T1), **临床试验结果一致性** (T2), **数据可用性 + 伦理 + 利益冲突** 审计 (T3), **150+ 折磨性短语论文工厂指纹** (T4), **文体计量学** (T5), **AI 文本启发式检测** (T6)
- ✅ **论文工厂引用图谱签名** (M1) — OpenAlex 子图 + 4 个结构化指纹
- ✅ 交叉核查 **DOI 元数据** (OpenAlex), **撤稿信息** (CrossRef + Retraction Watch CSV), **公众关注** (PubPeer), **ORI 制裁** (本地 CSV)
- ✅ **插件系统** — 通过入口点组 `paperguard.detectors` 添加第三方检测器
- ✅ **多租户 Web 界面** (可选启用) — 邀请制账户、持久化项目、按报告设置可见性 (私有/组织/公开)
- ✅ **批量模式**,HTML/JSON 导出,**5 语言国际化**,符合 **WCAG 2.1 AA** 的报告,可选 **LLM 辅助解释**
## 工具**不具**备的功能
- ❌ **不提供同行评审欺诈信号** (无公开数据源)
- ❌ **无经过机器学习训练的图像分类器** 用于识别蛋白质印迹重复 (需要带标签的语料库和 GPU)
- ❌ **非完整的 Cabanac PDCN 模型** (M1 检测器是本地子图版本)
- ❌ **不能替代** **期刊编辑、机构诚信办公室或专家评审**
一个标记是**邀请更仔细地审视**。它绝不是结论。
## 认识论立场
该工具报告**统计异常**,而非学术不端。"欺诈"、"造假"、"不端"等词汇不会出现在任何 PaperGuard 报告中。
每项发现均包含:
- 一个 `p_value` (如适用),并对所有发现进行 BH–FDR 校正
- 一个 `innocent_explanations` 列表 — 至少三种合理的非欺诈性原因
- 一个 `academic_reference`,指向所依据方法的学术文献
一个标记是邀请更仔细地审视。它不是一个结论。
## 示例输出
在 `tests/fixtures/fabricated_geng_style.csv` (一个
故意构造的 Geng 方法造假模式) 上运行 PaperGuard:
```
╭────────────────────── PaperGuard Audit Report ──────────────────────╮
│ Overall: CRITICAL │
│ File: fabricated_geng_style.csv │
╰─────────────────────────────────────────────────────────────────────╯
Total findings: 7 | CRITICAL: 2, SUSPICIOUS: 3, CONCERN: 1
Independent evidence clusters: 2
╭── A1 — Terminal Digit Distribution Analysis ───────────── CRITICAL ──╮
│ Column 'Cell_Count' last-digit distribution is non-uniform │
│ χ²(9) = 148.29, p = 0.00e+00, FDR-adjusted p = 0.00e+00 │
│ Cramér's V = 0.485 │
│ Digits 0 and 5 account for 52.9% (expected 20%) │
│ │
│ Possible innocent explanations: │
│ • Instrument quantisation (e.g. balance with 0.05 step display) │
│ • Manual rounding to a specific precision at entry time │
│ • Cultural digit preference in self-reported data │
│ • Derived values where the formula constrains the last digit │
│ │
│ Reference: Mosimann et al. (1995). Data fabrication: Can people │
│ generate random digits? Accountability in Research, 4(1), 31-55. │
╰──────────────────────────────────────────────────────────────────────╯
╭── A3 — Inter-Column Arithmetic Relation ─────────────── SUSPICIOUS ──╮
│ Columns 'Control_OD' and 'Treatment_OD' differ by a constant │
│ -0.3000 (precision σ = 2.19e-16) │
│ … (4 innocent explanations and reference shown) │
╰──────────────────────────────────────────────────────────────────────╯
… 5 more findings …
DISCLAIMER: PaperGuard flags statistical anomalies, not fraud.
Every finding lists possible innocent explanations. Use the output as
a starting point for further inquiry, never as a conclusion.
```
在 `tests/fixtures/genuine_random.csv` (真实的独立同分布数据) 上运行
其结果注定是无聊的:
```
Overall: PASS — 0 findings across 30 detectors.
```
## 安装
```
# 来自 GitHub(当前版本)
git clone https://github.com/exergyleizhou-ux/PaperGuard.git
cd PaperGuard
python -m venv .venv
# Linux/macOS:
source .venv/bin/activate
# Windows PowerShell:
.\.venv\Scripts\Activate.ps1
pip install -e ".[dev]"
cp .env.example .env # edit to set your email (used for API polite pools)
```
一旦 PyPI 版本发布,您也可以直接:
```
pip install paperguard # CLI + library only
pip install paperguard[webui] # adds FastAPI multi-tenant Web UI
```
## 使用方法
### 扫描本地数据文件
```
paperguard scan -f data.xlsx
paperguard scan -f manuscript.pdf --doi 10.1038/xxx --output-json report.json
paperguard scan -f manuscript.docx --output-html report.html
paperguard scan -f tests/fixtures/fabricated_geng_style.csv
```
### 批量模式
```
paperguard batch --glob 'papers/*.pdf' --out-dir reports/
# 生成 reports/.json + reports/.html + reports/summary.json
```
### Web 界面 (匿名,单用户)
```
pip install paperguard[webui]
paperguard webui --host 127.0.0.1 --port 8765
# 打开 http://127.0.0.1:8765/ —— 上传、选择语言、获取 HTML 报告。
# JSON 端点:POST /scan.json,携带 multipart file=
# 自省:GET /detectors
```
### Web 界面 (多租户,可选启用)
PaperGuard 2.0 在 `/app/*` 路径下新增了一个**邀请制多租户界面**:
用户账户、持久化项目、存储的扫描报告并支持按报告设置可见性 (`private` / `org` / `public`),以及管理员邀请流程。
```
pip install paperguard[webui]
export PAPERGUARD_MULTITENANT=1
export PAPERGUARD_SECRET_KEY="$(python -c 'import secrets;print(secrets.token_urlsafe(48))')"
export PAPERGUARD_ADMIN_EMAIL="admin@your-org.example"
export PAPERGUARD_ADMIN_PASSWORD="$(python -c 'import secrets;print(secrets.token_urlsafe(24))')"
paperguard webui --host 127.0.0.1 --port 8765
# 登录 http://127.0.0.1:8765/app/login
```
多租户模式**仅当**设置了 `PAPERGUARD_DB_URL` 或
`PAPERGUARD_MULTITENANT=1` 时激活;否则行为与 1.x 版本相同。后端使用 SQLAlchemy async (默认 SQLite,通过 URL 可切换至 PostgreSQL/MySQL)。会话存储在 HttpOnly 签名的 Cookie 中 — 无 JWT,无 OAuth,无第三方身份提供商。详见
[`docs/webui_multitenant.md`](docs/webui_multitenant.md) 了解完整
架构、环境变量参考、邀请流程、可见性语义以及
生产环境检查清单。
### 语言
报告可以渲染为 `en` 或 `zh-CN`:
```
paperguard scan -f data.csv --lang zh-CN
# 或通过环境变量设置:
PAPERGUARD_LANG=zh-CN paperguard scan -f data.csv
```
### 编写插件检测器
第三方包可以通过 `paperguard.detectors`
入口点组注册检测器:
```
# 在你的插件的 pyproject.toml 文件中:
[project.entry-points."paperguard.detectors"]
my_detector = "my_pkg.detectors:MyDetector"
```
`MyDetector` 必须是一个设置了 `id` 的 `BaseDetector` 子类。它将
由 `DetectorRegistry().register_default()` 自动加载。参见
[`examples/03_custom_detector.py`](examples/03_custom_detector.py) 获取
检测器模板。
在 Windows 上,如果您有 CJK 内容,请确保标准输出使用 UTF-8 编码:
```
$env:PYTHONIOENCODING="utf-8"
```
### 按作者搜索论文
```
paperguard search --author "Watson J"
paperguard search --author "George Church" --year-from 2015 --limit 30
```
## 检测方法
| ID | 名称 | 类型 | 学术依据 |
|----|------|------|----------|
| A1 | 末位数字分布 | 数字取证 | Mosimann 等 (1995) |
| A2 | Benford 首位数字 | 数字取证 | Benford (1938); Nigrini (2012) |
| A3 | 列间算术关系 | 数字取证 | 独立测量噪声原理 |
| A5 | 小数一致性 | 数字取证 | 伪造连续数据的离散性 |
| A6 | 不合理值检查 | 数据质量 | Anaya, van der Zee, Brown (2017); Wansink 案例 |
| A7 | 末位数字 0/5 偏好 | 数字取证 | Geng Hongwei (2025); Mosimann (1995) |
| B1 | GRIM 检验 | 汇总统计一致性 | Brown & Heathers (2017) |
| B4 | Statcheck (p 值重算) | 统计报告 | Nuijten 等 (2016) |
| B5 | TIVA (z-方差) | 统计报告 | Schimmack (2014) |
| B6 | GRIMMER (均值+标准差+N) | 统计报告 | Anaya (2016); Allard (2018) |
| B7 | P-Curve (发表偏倚) | 统计报告 | Simonsohn, Nelson & Simmons (2014) |
| B8 | SPRITE 合理性检验 | 汇总统计一致性 | Heathers, Anaya, van der Zee & Brown (2018) |
| C1 | Carlisle 基线平衡 | 随机对照试验完整性 | Carlisle (2017) |
| D1 | 残差平滑度 | 方差结构 | Stapel 报告 (Levelt 等 2012) |
| D2 | 缺失数据模式 | 方差结构 | Carlisle (2017); Buyse 等 (1999) |
| F1 | 图像重复 (pHash) | 图像取证 | Bik 等 (2016); 标准感知哈希 |
| F2 | 图像内部重复 (ORB+RANSAC) | 图像取证 | Bik 等 (2016); Brown & Lowe (2003) |
| F3 | 拼接 / 复制移动 (统计斑块) | 图像取证 | Cozzolino & Verdoliva (2015) Splicebuster |
| F4 | 跨论文图像重复 | 图像取证 | Masliah (NIH 2024); Hwang (2005) |
| F5 | EXIF 跨图像聚类 | 图像取证 | 标准数字取证;ORI 图像审计 |
| G1 | 图像 EXIF 时间取证 | 数字取证 | 标准 EXIF 取证;ORI 图像审计 |
| G3 | Docx rsid 取证 | 数字取证 | OOXML ECMA-376 §17.15.1.55 |
| G4 | 文件元数据取证 | 数字取证 | NIST SP 800-101; ORI 工具包 |
| M1 | 论文工厂引用图谱 | 网络取证 | Cabanac 等 (2025) JDIS PDCN |
| T1 | 文本相似度 (n-gram 分段) | 文本取证 | Brin 等 (1995); Schleimer 等 (2003) |
| T2 | 临床试验结果一致性 | 试验完整性 | Goldacre 等 (2019) |
| T3 | 数据可用性 + 伦理审计 | 合规性 | ICMJE; Gabelica 等 (2022); FAIR 原则 |
| T4 | 折磨性短语 (论文工厂签名) | 文本取证 | Cabanac 等 (2021); PPS |
| T5 | 文体计量学 (Stapel 语言指纹) | 文本取证 | Markowitz & Hancock (2014) PLOS ONE |
| T6 | AI 生成文本启发式检测 | 文本取证 | Cabanac 等 (2024); Kobak 等 (2025) |
## 输出严重程度
| 级别 | 含义 |
|------|------|
| PASS | 无异常 |
| NOTE | 值得关注的小问题,归档参考 |
| CONCERN | 值得检查 (单个检测器 p < 0.01) |
| SUSPICIOUS | 多个独立假设聚类中的多个检测器标记 |
| CRITICAL | 包含 CRITICAL 级发现 或 ≥ 3 个跨聚类的 CONCERN+ 级发现 |
升级逻辑见 [`src/paperguard/evidence/combiner.py`](src/paperguard/evidence/combiner.py)。
## 测试与开发
```
pytest -m "not network" -v # skip network-dependent tests (default for CI)
pytest -v # run everything
ruff check src/ tests/
mypy src/
```
## 项目结构
```
src/paperguard/
├── cli.py # click CLI entrypoints (scan / search)
├── config.py # pydantic-settings (env-driven)
├── core/ # Severity, Finding, AuditReport, BaseDetector, Registry, AuditLog
├── detectors/ # A1, A3, A5, B1, G4
├── evidence/combiner.py # BH-FDR + severity escalation
├── extractor/ # Excel/CSV/PDF/docx-tables/metadata
├── fetcher/ # OpenAlex / CrossRef / Unpaywall
├── reporter/ # Rich terminal report + JSON export
└── utils/ # SHA-256, float helpers
tests/
├── fixtures/ # Two paired CSVs (fabricated vs genuine) + generators
└── test_*/ # Detector, combiner, extractor, e2e, fetcher tests
```
## 文档
| 文档 | 内容概览 |
|---|---|
| [docs/paperguard_technical_report.md](docs/paperguard_technical_report.md) | **技术报告** — 方法,LLM 文本家族 (T6 / T7 / T8),N=85 实证研究,T6 角色的校准 |
| [docs/quickstart.md](docs/quickstart.md) | **5 分钟快速入门** — 安装,扫描一份伪造的 CSV,扫描一份真实的撤稿 PDF (Wansink 2015),阅读报告 |
| [docs/llm_detection_v2.md](docs/llm_detection_v2.md) | **LLM 文本检测指南** — T6 词法 + T7 困惑度 + T8 DetectGPT,包含校准后的实证立场 |
| [docs/llm_detection_real_endpoints.md](docs/llm_detection_real_endpoints.md) | **2.2.7 — T7/T8 端点范围 (权威版)** — 逐端点兼容性矩阵。T7 需要具有真实对数概率的非推理 LM;T8 需要能偏离原始分布的非推理改写模型。推理模型 (o-series, DeepSeek-v4, Qwen3-thinking) 存在结构性不兼容 |
| [docs/recall_test_v8.md](docs/recall_test_v8.md) | **2.0.16 — N=50 LR+ 研究 (仅 T6)** — 首次针对发表后撤稿数据的集中 LR+ 测量 |
| [docs/recall_test_v9.md](docs/recall_test_v9.md) | **2.1.0 — N=30 重测 + 透明的 T7/T8 数据集** — 扩展 v8,T7/T8 列标注了端点限制信息 |
| [docs/recall_image_v1.md](docs/recall_image_v1.md) | **2.1.2 — 图像层 LR+ 研究** — 首个基于精选撤稿图像复用语料库的 F1/F4 实证数据 |
| [docs/recall_image_v5.md](docs/recall_image_v5.md) | **2.3.1 — 图像层 LR+ (N=200) (诚实修订)** — 在默认 `z=6 / cluster=8` 阈值下,F1/F4/F6 的 Wilson 95% CI。F6 LR+ ≈ 0.92 [0.75, 1.20] — 将 v4 的 1.63 (N=159) 下调,更大的 v5 样本揭示早期数据为小样本向上噪声。F4 ≈ 4.36 [0.48, 41.28],方向积极但统计功效不足 |
| [docs/crossval_statcheck.md](docs/crossval_statcheck.md) | **2.1.3 — B4 statcheck 交叉验证** — N=41 真实标注语料库,B4 召回率 100% / 决策反转召回率 94% |
| [paper/paper.md](paper/paper.md) | **JOSS 格式论文草稿** 附参考文献 (`paper/paper.bib`) — 已准备好投稿至《Journal of Open Source Software》 |
| [docs/recall_test_v2.md](docs/recall_test_v2.md) | **N=100+100 召回率/精确率研究** — 量化表明仅扫描 PDF *并非* 可靠的撤稿检测器;解释原因及替代方案 |
| [docs/recall_test_v3.md](docs/recall_test_v3.md) | **2.0.4 后续研究** — 单规则重新校准将 LR+ 从 0.77 (差于抛硬币) 提升至 ∞ (零误报),代价是召回率从虚高的 68% 降至真实的 13% |
| [docs/recall_test_v4.md](docs/recall_test_v4.md) | **2.0.5 后续研究** — 收紧 T5 文体计量学规则,消除了报告中近乎普遍的 NOTE 级噪声,同时召回率/误报率保持在 v3 水平 (T5 从未达到 CONCERN 级,因此不影响整体严重程度) |
| [docs/recall_test_v5.md](docs/recall_test_v5.md) | **2.0.6 后续研究 (进行中)** — PMC 优先的开放获取抓取器,将部分样本中的下载成功率从 ~28% (v2) 提升至 ~60%,通过在 Unpaywall 和 OpenAlex 之前经由 Europe PMC 路由 |
| [README.md](README.md) | 本文件 — 概述、用法、安装 |
| [README.zh.md](README.zh.md) | 中文版 |
| [CHANGELOG.md](CHANGELOG.md) | 完整发布历史 0.1 → 2.1.3 |
| **[HuggingFace Space 演示](https://huggingface.co/spaces/exergyleizhou/paperguard-demo)** | **在线浏览器演示** — 粘贴 DOI / 上传 PDF / 粘贴文本,获取完整的 PaperGuard 报告 |
| [docs/detectors/](docs/detectors/) | 自动生成的各检测器深度解析 (30+ 页及索引) |
| [docs/fraud_case_studies.md](docs/fraud_case_studies.md) | 9 个真实案例 (Stapel, Fujii, Hwang, Schön, Macchiarini, Wansink, Masliah, Geng-style, Bik 2016) 与检测器映射 |
| [docs/webui_multitenant.md](docs/webui_multitenant.md) | 多租户 Web 界面架构、环境变量、邀请流程、生产环境检查清单 |
| [CONTRIBUTING.md](CONTRIBUTING.md) | 如何添加检测器、代码风格、测试 |
| [SECURITY.md](SECURITY.md) | 安全政策及负责任披露联系方式 |
| [CITATION.cff](CITATION.cff) | 引用本软件 |
| [ROADMAP.md](ROADMAP.md) | 下一步计划 |
## 路线图
已发布至 2.0.1。仍待完成 (详见 [`ROADMAP.md`](ROADMAP.md):
- 在 500 万节点的引用图谱上实现完整的 Cabanac 2025 PDCN 模型 (M1 是本地子图变体)
- 经机器学习训练的蛋白质印迹专用图像分类器 (需要带标签的语料库和 GPU)
- 审稿人欺诈信号提取 (目前无公开数据源)
- Web 界面 2.x:密码重置、项目级共享成员、审计日志界面
欢迎提交 Pull Request。新检测器应遵循 `A1` 模板 — 参见
[`CONTRIBUTING.md`](CONTRIBUTING.md)。
## 引用
如果 PaperGuard 对您的工作有帮助,请引用
[`CITATION.cff`](CITATION.cff) 中的软件条目 (GitHub 会在右侧栏渲染
“引用此仓库”按钮)。
## 许可证
[MIT](LICENSE)。
标签:AI 文本检测, Python, TCP SYN 扫描, Web UI, 临床试验数据, 国际化, 图像 forensics, 学术不端检测, 学术诚信, 数据科学, 数据质量, 文本相似性, 无后门, 无障碍访问, 研究数据筛查, 统计学, 统计异常检测, 统计方法验证, 表格数据分析, 资源验证, 逆向工具