水杉输入法整句输入原理:词语格与kenlm三元语言模型的打分机制

发布时间:2026/10/9 17:43:02
水杉输入法整句输入原理:词语格与kenlm三元语言模型的打分机制
水杉输入法整句输入原理词语格与kenlm三元语言模型的打分机制【免费下载链接】msime-windows水杉输入法 Windows 产品TSF、Server、GUI、设置页与安装器。内测tg: https://t.me/msimegroup QQ Group: 829919142项目地址: https://gitcode.com/gh_mirrors/me/msime-windows水杉输入法Metasequoia IME是一款运行在 Windows 上的开源输入法它的整句输入能力来自两个核心部件词语格Word Lattice负责把一串拼音拆成所有可能的词语组合kenlm 三元语言模型trigram负责从中挑出最像人话的那一句。打个比方你敲下zhongguo时引擎要同时判断它可能是中国也可能是一串单字只有把词库里的所有切分方式摊在一张地图上再用语言模型给每条路线打分输入法才能在候选栏里稳稳地递给你中国而不是中果。上面这张图就是整句输入的现场候选栏第一项是解码器生成的整句后面跟着逐字候选。下面拆开看这张地图是怎么画出来的、分数是怎么算的。词语格把整句拆成一张词语地图整句输入的第一道难题是分词歧义同样的拼音序列切法可能完全不同。水杉输入法的解法是先把所有切法铺满而不是提前猜一种——这就是词语格。建图的过程很直接见 build_graph把已确认的音节序列n个位置编号每个位置是一个节点对每个起点向后取 1~7 个音节的片段max_phrase_syllables默认 7拿片段去词库查词查到的每个词就是一条边从起点指向片段终点。边数上限由span_limit默认 32控制防止一个音节对应几百个字时把图撑爆。这样一张有向图就建好了一条从 0 号节点走到 n 号节点的路径恰好是一句覆盖全部拼音的完整候选句。图的定义写在 word_lattice.h 的开头注释里一句话概括就是phrase-graph Viterbi beam search——短语图加维特比束搜索。kenlm 三元语言模型给每条路径打分光有地图还不够一条路径好不好要看这句话通不通顺。这里登场的是 kenlm——一个经典的 n-gram 语言模型工具包水杉输入法把它的查询子集 vendored 在 engine/ngram/kenlm/引擎只通过 language_model.h 这一个封装访问它。三元模型trigram的打分逻辑是下一个词的概率取决于它前面的两个词即P(中国 | 我, 的)。解码时每走一条边就把log10 P(词 | 前两个词)累加到路径分数上见 decode_word_lattice。模型上下文不存全局状态而是跟着每条假设路径走所以几十条路径可以并行比较互不干扰。几个工程上的细节值得新手了解模型文件叫sc.lm约 34 MB以 mmap 方式只读载入。shared_language_model 按路径在进程内共享同一个实例全拼、双拼多个会话共用一份内存映射分数是 log10 概率词库权重只保留一个极小的平局打破项dictionary_tiebreak 0.01当语言模型分不出高下比如两个词都没见过时才用词频排个先后且绝不可能压过真实 n-gram 的差异未登录词按固定罚分log10(1/6e7) ≈ -7.78处理生僻词不被判死刑只是明显吃亏sc.lm由 language-model/lock.json 钉住的 ARPA 语料按固定参数三元、-a 22 -q 4 trie转换而来构建脚本会校验两头 SHA-256保证每次发布的模型可复现。转换流程见 engine/ngram/README.md 与 language-model/README.md。束搜索在地图上找出最可能的那句话图可能有几千条路径不可能全走一遍。解码器用束搜索beam search控制爆炸每个节点只保留当前分数最高的beam默认 32条假设逐节点向前推进走到终点后取分数最高的nbest默认 5条去重后交给下游——也就是 n-best 整句列表。除了语言模型边上还叠了两类修正项专门对付中文的特殊情况生僻读音先验reading_prior语言模型只认汉字分不清卷读juǎn还是juàn。解码器按该词权重占整段拼音权重的比例判断读音是否生僻占比过低就扣分下限由reading_prior_floor兜底这样gunqi不会打出卷七词库平局项如上所述只在模型分完全相同时起作用。从 n-best 到候选栏只挑最值得看的n-best 是解码的中间产物如果全铺出来候选区会被一堆只差一两个字的整句占满。所以 merge_lattice_candidates 做了克制的合并最多插入三条整句词语格自己的最优解加上神经重排器见下节各自的最优解插入位置有讲究整句候选只会插到键与输入完全相等的词库精确命中之后见 generated_sentence_insert_position——词典里真实存在的短语永远压过整句猜解不会出现整句抢跑的情况。图里第一行水杉输入法就是整句解码的结果它插在词库短语命中之后排序规则一目了然。神经重排给 n-best 的第二意见三元模型只看前两个词上下文窗口太短。水杉输入法在整句解码之上还挂了一层字符级 Transformer 句子模型sentence_model.h对词格给出的 n-best 路径做重排序它把已提交的上文和每条候选句一起送入模型按log P(句子 | 上文)重新排列。重排只改顺序不增删、不改写路径——候选词的字段都从原始路径派生推理跑在 RescoreWorker 的后台工作线程上两个 worker 并行结果就绪前候选栏先显示词格自己的排序用户永远等不到一个空窗口模型文件由 neural-model/NOTICE.md 声明来源与 Apache-2.0 许可。没有语言模型时会怎样这是新手常问的健壮性问题sc.lm缺失或读不出来时shared_language_model 返回一个valid() false的实例解码器整体回退到未校准的单字词频启发式自然对数尺度与模型分数不混加。结果是整句候选质量下降但输入法照常出句子——模型缺失不是错误是这个项目的明确设计原则见 runtime-architecture.md。想深入源码按这条路线读词格定义与解码engine/quanpin/word_lattice.h → word_lattice.cpp语言模型封装engine/ngram/language_model.h模型构建与锁定language-model/lock.json神经重排engine/neural/sentence_model.h、engine/neural/rescore_worker.cpp整体架构背景engine/docs/runtime-architecture.md一句话总结词语格负责穷举所有说得通的话kenlm 三元模型负责选出最说得通的那句神经重排负责结合上文再微调一次——三层各司其职才构成了水杉输入法整句输入的稳定体验。【免费下载链接】msime-windows水杉输入法 Windows 产品TSF、Server、GUI、设置页与安装器。内测tg: https://t.me/msimegroup QQ Group: 829919142项目地址: https://gitcode.com/gh_mirrors/me/msime-windows创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考