diff --git a/engine/quanpin/quanpin_dictionary.cpp b/engine/quanpin/quanpin_dictionary.cpp index ff2bfe77..23fc234b 100644 --- a/engine/quanpin/quanpin_dictionary.cpp +++ b/engine/quanpin/quanpin_dictionary.cpp @@ -518,6 +518,12 @@ std::vector QuanpinDictionary::query_exact(const std::string &raw_inpu // segmentation 填 canonical_pinyin,词格 select_distinct 用 path->key——所以 // 按 canonical_pinyin == winner_key 能干净地把前缀行摘出去。 // + // 这个判据依赖一个前置事实:整键档的 canonical 必然就是 winner_key 本身。 + // 胜出切分只能出自 decode_pool,那里用 query_exact_segmentations_keyed_flat + // 只收精确键,词库里没有整词的切分压根进不了池;于是整键档走的是 + // query_single_cut_keyed 的精确键分支,不会退到前缀区间扫描那层降级 + // (那种行的 key 是别的读音,会被这个判据误当成前缀行沉到末尾)。 + // // 不切开会破坏 merge_alternative_segmentations 的既有分层(merged_full 在前、 // 前缀作为 remaining 追加):query_series(ban'zheng) 先出 办证/辩证/整句,再出 // 班/办/半/般…,而班长、搬账这些同键位整词在 rest 里、排在单字之后,整组被挤 diff --git a/engine/tests/src/test_input_session.cpp b/engine/tests/src/test_input_session.cpp index ddb4366b..4641c885 100644 --- a/engine/tests/src/test_input_session.cpp +++ b/engine/tests/src/test_input_session.cpp @@ -416,6 +416,8 @@ void run_autocorrect_context_ranking_tests(const std::filesystem::path &data_dir // 办证/辩证/整句还带着首音节的单字;这些单字排在 rest(班长、搬账)之前,把同键位的 // 其他整词整组挤出首页。原 fixture 没有 tbl_1_b,前缀这条路根本没被走到。 // 这里补单字表,并直接断言「整键在前、前缀在后」这条分层不变量。 +// 同上一组 fixture:词库目录里没有 sc.lm,词格退回启发式打分,权重完全决定路径分, +// 因此 zheng 侧稳定胜出、重排稳定接管,用例不依赖任何模型文件。 void run_autocorrect_context_layering_tests(const std::filesystem::path &data_directory) { const std::filesystem::path directory = data_directory / "autocorrect-context-layering";