# 可复现实验说明

三组实验均由 `scripts/run_experiments.py` 实际执行，不调用 LLM、外部服务或付费 API。输出在 `experiments/`；网页数据由构建脚本复制，页面不硬造结果。

## 复现

```sh
python -m pip install -r requirements.txt
python scripts/run_experiments.py
python scripts/build_site.py
python scripts/validate_site.py
```

本次环境：Python 3.13.5、NumPy 2.4.4、SciPy 1.15.3、scikit-learn 1.6.1。输入 JSONL.GZ 的 SHA256 为 `3bc13b0608a8f460aa528330007afa8d6a05d9f684c49bef4ca49310fd061bd9`。完整环境、时间和指纹见 `environment.json`。执行时间仅为本机参考，不作为性能基准。

随机种子固定；NMF 在不同操作系统、底层数学库或线程环境中可能出现微小浮点差异。CI 提供手动 `Reproduce experiments` 工作流，保留完整运行产物供比较。

## 实验 1：结构化数据一致性

读取所有记录，与原汇总和清单比对：

| 检查 | 本次结果 |
| --- | --- |
| 总记录数 / 唯一记录 ID | 29,304 / 29,304 |
| 一般项目共同层 | 27,395 |
| 重复非空批准号 | 0 |
| 重复题名超出首条的数量 | 72（保留，非自动判重） |
| 清单文件记录数 | 56/56 一致 |
| 年度总数与一般项目分母 | 九年均一致 |
| 缺失或非法页码锚点 | 0 |

**边界**：结构检查不能证明提取内容准确。原 PDF 缺失，页码内容和 PDF 哈希未重新核验。申请人、学校和题名质量不视为已人工逐条审校。

## 实验 2：已知项目查找压力测试

问题是“从删改后的题名能否找回指定项目”，而非“能否回答真实科研问题”。

- 从九年一般项目中，每年抽取 10 个规范化后唯一、正常提取、长度至少 18 字的题名，共 90 个；NumPy 随机种子 413。
- 每题生成三条查询：完整规范题名、中间连续 10 字、每 5 字删除第 5 字的规则删字题名，共 270 条。
- 候选为全部 29,304 条记录，指定唯一原记录为目标。原记录刻意保留在索引中。
- 对比字面连续包含、二元组 Jaccard、二元组 IDF 加权余弦。三者同分均按原库顺序；目标无正分记为未命中。
- Hit@1/5 为目标进入前 1/5 位的比例；MRR 为目标排名倒数均值。每个查询类型与方法组合 n=90。

| 查询 | 方法 | Hit@1 | Hit@5 | MRR |
| --- | --- | --- | --- | --- |
| 完整题名 | 字面包含 | 100.0% | 100.0% | 1.000 |
| 完整题名 | Jaccard | 100.0% | 100.0% | 1.000 |
| 完整题名 | IDF 余弦 | 100.0% | 100.0% | 1.000 |
| 中间 10 字 | 字面包含 | 98.9% | 100.0% | 0.994 |
| 中间 10 字 | Jaccard | 95.6% | 98.9% | 0.973 |
| 中间 10 字 | IDF 余弦 | 98.9% | 100.0% | 0.994 |
| 规则删字 | 字面包含 | 0.0% | 0.0% | 0.000 |
| 规则删字 | Jaccard | 100.0% | 100.0% | 1.000 |
| 规则删字 | IDF 余弦 | 100.0% | 100.0% | 1.000 |

合理解读：规则删字破坏连续包含，但保留很多二元组，二元组方法在这组合成查询上可以找回目标。字面包含在连续片段查询中也表现良好；不能据此泛称 IDF 对所有实际问题都更好。

**边界**：查询直接来自目标，不是独立、盲评或留出的语义问题集；只有一个指定目标，其他可能相关项目未人工判断；没有相关性召回率、科学新颖性或显著性检验结论。100% 仅指该已知项目压力测试中的 90 个规则删字目标。完整查询、目标、逐方法排名都保存在 `retrieval.json`。

## 实验 3：NMF 随机初始化稳定性

新增明确范围的子集，而非复现原始 24 簇或心理子集：

```text
人工智能|机器学习|深度学习|大语言模型|大模型|生成式|智能体|(?<![a-z])AI(?![a-z])|ChatGPT
```

不区分大小写，对题名匹配得到 1,352 条。这个范围不同于原“AI 严格”词表，不混用计数。

预处理去“研究、机制、路径、影响、视域、背景、赋能”和数字；字符 2—4 gram TF-IDF，`min_df=3, max_df=.4, max_features=12000, sublinear_tf=True`。固定 NMF `k=8, init=random, max_iter=350, tol=.0005`，分别运行种子 413、614、1024。主簇取最大载荷，零载荷单列 -1。用调整兰德指数（ARI）比较三对划分，ARI 1 表示完全一致，0 对应随机校正基线，某些情况下可能为负。

| 种子对 | ARI |
| --- | --- |
| 413 / 614 | 0.881 |
| 413 / 1024 | 0.557 |
| 614 / 1024 | 0.515 |
| 三对均值 | 0.651 |

不同种子有明显差异；主题结论仍应结合代表题名与人工复核。每次的迭代数、收敛情况、重建误差、主簇规模与前 10 个词在 `stability.json`。

**边界**：三个种子、固定特征和固定 k 只检验初始化敏感性，没有跨 k 稳定性、双人编码、人工主题效度或全文验证。ARI 不等于主题准确率；它不能回溯证明原快照主题可靠。

## 后续可增加的工作

构建独立研究问题查询集，预先定义相关性判据并进行盲评；补齐原 PDF 并做抽样逐页校验；在有独立标注后估计语义检索召回；跨多个主题数、词表与抽样检查主题稳定性。上述工作尚未执行，不作为本次成果宣称。
