diff --git a/.claude/skills/parse-book/scripts/parse_ingest.py b/.claude/skills/parse-book/scripts/parse_ingest.py index ddb2935..0e4c046 100644 --- a/.claude/skills/parse-book/scripts/parse_ingest.py +++ b/.claude/skills/parse-book/scripts/parse_ingest.py @@ -31,6 +31,9 @@ DSN = ("postgresql://root:f6710e2d0294eb1c10e26a805a64bc54@100.64.0.8:5433/muse- TENANT, ACTOR = 1, "1" PATTERN_TYPES = {"craft", "combat", "emotion", "scene_pattern", "trope"} # 拍板①:首轮只拆五型 NGRAM = 15 # 脱敏红线:≥15 连续字与原文重合=违规(parse-book skill) +# 版权 IP 与系统专名词表(复抽实证:机战无限为高达系同人,IP 背景词不在实体名池) +IP_LEAK_WORDS = ("GN粒子", "太阳炉", "扎古", "高达", "夏亚", "阿姆罗", "米诺夫斯基", + "浮游炮", "脑量子波", "GN-Bit", "影印人", "殖装", "战功点", "宇宙世纪") EMBED_MODEL = "Qwen/Qwen3-Embedding-8B" SIM_MERGE = 0.85 # 嵌入判重:≥该值触发 M3 归并判定(阈值未校准,实战收集中) SIM_MARK = 0.75 # [MARK, MERGE) 区间只标记不判定(校准带宽,审核环可见) @@ -173,6 +176,12 @@ def validate_card(c, contracts, entity_names, src_text): hit_names = [n for n in entity_names if any(n in str(x) for x in texts)] if hit_names: reasons.append(f"专名泄漏(本书实体名):{hit_names[:3]}") + # 版权 IP 与系统专名词表(fable5 复抽实证盲区:同人书的 IP 背景词不在 scaffold + # 实体名里,批7 全部 12 张硬泄漏均由此逃逸,其中 4 张专名直入卡名——texts 含 + # 卡名,此处一并覆盖。词表按实证泄漏词维护,勿加过泛词防误伤) + hit_ip = [w for w in IP_LEAK_WORDS if any(w in str(x) for x in texts)] + if hit_ip: + reasons.append(f"专名泄漏(版权IP/系统词):{hit_ip[:3]}") return reasons, retyped