文笔层:AI 味机检、标点规范化、分块大量扩写(第 1 集成稿 10805 字)
- 修复上次提交把 dfannals/cli.py 写成 0 字节的问题(它是唯一入口,导致管道不可运行) - 性别:解析 <caste>,人物表与写作素材带性别(Ral Fastenhatchets 实为女性) - 新增 dfannals/deslop.py:AI 味机械诊断(硬伤词/句式/标点,按千字密度报告) - 新增 dfannals/normalize.py:标点与结构清理(引号配对、重复段落与句子、模型自加的小节标记) - 新增 dfannals/expand.py 与 prompts/literary-expander.md:按年份场景分块大量扩写 - 专名防幻觉:每块附史料专名白名单,事后按段自动修复可疑专名 - episode 命令并进文笔层(骨架稿另存 .skeleton.md),新增 expand 命令做 A/B 对照 - 新增 notes/switched-threads.md 与 test_deslop / test_normalize 回归测试 - 提交前拦截「已跟踪文件为空」,防止上述事故复发
This commit is contained in:
@@ -97,14 +97,19 @@ def _is_candidate(name: str, known: set[str]) -> bool:
|
||||
def check(text: str, world: World) -> list[Suspicion]:
|
||||
"""返回可疑专名列表(按出现次数降序)。"""
|
||||
known = known_names(world)
|
||||
# 大小写不该决定是不是幻觉:史料里是 YETI/EAGLE_MAN,正文写成 Yeti/Eagle_man
|
||||
# 是同一件事(模型从种族字段学来的),不能报成凭空编造。
|
||||
folded = {k.casefold() for k in known}
|
||||
found: dict[str, list[str]] = {}
|
||||
|
||||
for match in NAME_RE.finditer(text):
|
||||
raw = match.group(0)
|
||||
if raw.casefold() in folded:
|
||||
continue
|
||||
# 逐级回退:整串不认,就试着拆成更短的已知名字,减少误报
|
||||
if not _is_candidate(raw, known):
|
||||
continue
|
||||
if any(part in known for part in raw.split()):
|
||||
if any(part.casefold() in folded for part in raw.split()):
|
||||
# 名字里有一部分是史料已知的(例如 "Urist the Bold"),不当作凭空编造
|
||||
continue
|
||||
start = max(0, match.start() - 20)
|
||||
|
||||
Reference in New Issue
Block a user