#!/usr/bin/env python3
"""敌意复核：这些"变化"里有多少是 MeSH 词表版本与索引完整度造成的假象？"""
import json, collections
import numpy as np

d = json.load(open("corpus.json")); recs = d["records"]
print("== 质疑 1：每篇的 MeSH 标注数逐年变了吗（索引完整度）==")
by = collections.defaultdict(list)
for r in recs:
    by[r["year"]].append(len(r["mesh"]))
for y in sorted(by):
    print(f"  {y}  文献 {len(by[y]):>4} 篇  平均 MeSH 词数 {np.mean(by[y]):5.1f}")
early = [n for y, v in by.items() if y < 2020 for n in v]
late = [n for y, v in by.items() if y >= 2020 for n in v]
print(f"  → 前期平均 {np.mean(early):.1f} 词/篇，后期 {np.mean(late):.1f} 词/篇"
      f"（{'⚠️ 后期标注更少，会系统性压低所有词的占比' if np.mean(late) < np.mean(early) else '差异不大'}）")

print("\n== 质疑 2：HIPEC 从 0.0% 跳到 29.1%，是新概念还是新词条 ==")
first = {}
for r in sorted(recs, key=lambda x: x["year"]):
    for m in r["mesh"]:
        first.setdefault(m, r["year"])
res = json.load(open("results.json"))
for row in res["rising"][:8]:
    t = row["term"]
    print(f"  {t[:46]:<48} 语料里首次出现于 {first.get(t)} 年")
print("  → 首次出现年份 >=2020 的词，极可能是 MeSH 当年新增词条，而不是研究方向新出现。")

print("\n== 质疑 3：把人口学检索标签剔掉，还剩多少真变化 ==")
CHECK_TAGS = {"Male", "Female", "Humans", "Adult", "Aged", "Middle Aged", "Young Adult",
              "Adolescent", "Aged, 80 and over", "Child", "Animals", "Mice",
              "Retrospective Studies", "Prospective Studies", "Treatment Outcome",
              "Survival Rate", "Follow-Up Studies"}
sig_terms = [r["term"] for r in res["rising"]] + [r["term"] for r in res["falling"]]
real = [t for t in sig_terms if t not in CHECK_TAGS]
print(f"  显著词（示例集 {len(sig_terms)} 个）里，剔掉检索标签后剩 {len(real)} 个内容词")
print(f"  被剔掉的: {sorted(set(sig_terms) & CHECK_TAGS)}")

print("\n== 质疑 4：只看 2020 年后就存在的词，变化还在吗 ==")
stable = [t for t in real if first.get(t, 9999) < 2018]
print(f"  语料里 2018 年前就出现过的内容词: {len(stable)} 个 → {stable[:8]}")

print("\n== 质疑 5：零模型均值 0.04 是不是太干净了 ==")
null = np.array(res["null_distribution"])
print(f"  1000 次打乱：{int((null==0).sum())} 次给 0，最大 {null.max()}")
print("  → 零模型这么干净，说明 Fisher+BH 在这个规模下不会随便造出显著词；")
print("     所以 55 个显著词是真的统计信号 —— 但信号来源可能是索引而非研究内容，见质疑 1–3。")
json.dump({"early_mesh_per_doc": float(np.mean(early)), "late_mesh_per_doc": float(np.mean(late)),
           "first_year": {t: first.get(t) for t in [r["term"] for r in res["rising"][:8]]},
           "content_terms_after_filter": len(real), "stable_content_terms": len(stable)},
          open("adversarial.json", "w"), ensure_ascii=False, indent=1)
