exergyleizhou-ux/PaperGuard

GitHub: exergyleizhou-ux/PaperGuard

PaperGuard 是一个开源工具,用于筛查研究数据中的统计异常,以辅助学术诚信评估。

Stars: 1 | Forks: 0

# PaperGuard [![持续集成](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/46bd8f9943035129.svg)](https://github.com/exergyleizhou-ux/PaperGuard/actions/workflows/ci.yml) [![PyPI](https://img.shields.io/pypi/v/paperguard?label=PyPI)](https://pypi.org/project/paperguard/) ![Python版本](https://img.shields.io/badge/python-3.11%2B-blue) ![测试](https://img.shields.io/badge/tests-616%20passing-brightgreen) ![检测器](https://img.shields.io/badge/detectors-41-blue) ![许可证](https://img.shields.io/badge/license-MIT-green) ![国际化](https://img.shields.io/badge/i18n-en%20%7C%20zh%20%7C%20es%20%7C%20ja%20%7C%20de-blue) ![WCAG](https://img.shields.io/badge/WCAG-2.1%20AA-success) [![🤗 在线演示](https://img.shields.io/badge/%F0%9F%A4%97-Live%20demo-yellow)](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, 学术不端检测, 学术诚信, 数据科学, 数据质量, 文本相似性, 无后门, 无障碍访问, 研究数据筛查, 统计学, 统计异常检测, 统计方法验证, 表格数据分析, 资源验证, 逆向工具