短串和长串,难在哪不一样
输入 nihao 五个字母,候选栏第一给出「你好」。输入 nihaoshijie 十一个字母,候选栏第一给出「你好世界」。这两个输入看起来只是长度不同,处理难度差了不止一倍。
短串的切分空间是有限的。nihao 可以切成 ni hao,也可以切成 nin hao,还可能切成 ni ha o 之类。合法切分方式只有几种,输入法可以把每一种都算一遍,挑得分最高的。
长串不一样。nihaoshijie 的切分方式数量比 nihao 多得多,因为每多一个字母,都可能产生新的音节边界。输入法无法枚举所有可能,只能剪枝。剪枝意味着有些路径不会被评估,如果正确答案恰好在被剪掉的路径里,候选栏就不会给出它。
这就是短词切分很准、长句偶尔出错的根本原因。不是长句的处理做差了,是长句的搜索空间大到只能近似处理。
切分路径的数量增长有多快
把切分方式的数量跟串长放在一起看,增长趋势很直观。这个数量不是线性的,是接近指数级增长的。
假设每个位置都可能是音节边界,n 个字母的串理论上有 2 的 n-1 次方种切法。实际合法切分要少得多,因为很多切法拼不出合法音节。即使扣掉不合法的那部分,剩下的数量仍然随长度快速增长。
举例说明。nihao 五个字母,合法切分大约三到五种。nihaoshijie 十一个字母,合法切分可能到几十种。woshiyigexuesheng 十七个字母,合法切分可能上百种。输入法的搜索预算有限,上百种路径不可能全部展开评估。
复杂度还跟输入类型有关。全拼的合法切分相对少,简拼的合法切分多得多。混拼介于两者之间,但结构最不规整,搜索最困难。
| 输入 | 长度 | 合法切分数量级 | 是否需剪枝 | 典型表现 |
|---|---|---|---|---|
| nihao | 5 | 个位数 | 不需要 | 命中率高 |
| nihaoshijie | 11 | 几十 | 轻度 | 常见词仍准 |
| woshiyigexuesheng | 17 | 上百 | 需要 | 偶有判错 |
| nhsj(简拼) | 4 | 十几 | 轻度 | 候选不稳定 |
| nhsjwmz(简拼) | 7 | 上百 | 需要 | 候选明显减少 |
输入法用什么策略剪枝
剪枝的核心思路是:不评估所有路径,只评估看起来有希望的那些。判断「有希望」的依据来自词库和语言模型。
第一步是基于词库的预剪枝。输入法把拼音串分成若干段,看每一段能不能在词库里找到对应的词。找不到对应词的分段直接丢弃。这一步成本低,过滤掉大部分无效路径。
第二步是基于语言模型的后剪枝。对保留下来的路径,输入法用语言模型评估每条路径的整体得分。得分低的路径不再展开。这一步成本高,但只对少数路径执行。
第三步是动态规划合并。不是每条路径都独立评估,同一前缀的路径可以合并。用动态规划从左到右逐位置处理,每个位置只保留若干个最优状态。搜狗输入法在这三步里做的具体剪枝阈值,官方没有公开,不同版本也可能不同。
剪枝带来的直接收益是速度。没有剪枝,十几字母的长串处理时间可能到几百毫秒甚至更长;剪枝之后,处理时间稳定在几十毫秒内。代价是部分路径不会被评估,长串偶发判错是这个代价的一部分。
候选词从哪来:从路径到词
剪枝之后,剩下若干条候选路径。每条路径对应一种音节切分,每种切分再对应若干候选词。候选词生成是把这三层展开成一栏列表。
一层是音节切分。比如 nihaoshijie 切成了 ni hao shi jie,也可能切成 ni hao shi jie 的其他等价形式。不同切分可能对应同一个词,也可能对应不同的词。
二层是每个音节对应的汉字候选。ni 可以是「你」「泥」「尼」,hao 可以是「好」「号」「耗」。一层的切分加上二层的单字,组合出大量的候选短语。
三层是整句候选。输入法会把层二里的候选短语按语言模型打分,最高的几条放进候选栏。用户看到的候选栏内容,是这一层的输出。
长串的候选栏通常不会太长,因为层三里能排到前排的路径数量有限。输入法会把明显不合理的组合过滤掉,剩下的就是用户能看到的候选。
woshiyigexuesheng
zhegeshiqinghenduofuza
jintiantianqihenbucuo
实测:不同长度的首位命中率
下面的数据为人工构造,测试环境为 Windows 11 24H2、16.8 正式版、默认词库、关闭云输入。测试方式是构造四组不同长度的全拼样本,各 50 条,记录候选栏第一位是否为测试者预期的词。样本量小,数据仅供量级参考。
| 串长区间 | 首位命中率 | 命中率示意 | 典型错误 |
|---|---|---|---|
| 4-6 个字母 | 95% | 同音词歧义 | |
| 7-10 个字母 | 88% | 切分边界偏移 | |
| 11-15 个字母 | 79% | 低概率路径被剪 | |
| 16 个字母以上 | 71% | 整句候选质量下降 |
长串输入的三种典型做法
了解长串分词的处理逻辑后,长串输入就有了策略选择。三种做法各有适用场景。
一次打完。把整句拼音一次性输入,让输入法做整句处理。优势是效率最高,输入法可以用语言模型给整句打分。适合常见表达,比如日常聊天、写普通文档。整句的切分和选字一次完成,候选栏直接给完整句子。代价是长串一旦判错,需要翻页或者退格修改。
分段输入。把句子拆成两到三段分别输入,每段单独上屏。优势是每段落在更短的切分空间里,候选质量更稳定。适合专业内容、人名密集、同音词多的场景。代价是效率比一次打完低,多次上屏会打断输入节奏。
混拼结合。用全拼输入关键词,用简拼输入常见虚词和连接词。优势是效率跟一次打完接近,同时把复杂部分落在全拼上。适合有一定输入经验的用户,需要熟悉常用简拼。
三种做法没有绝对更好的。选择依据是自己的输入内容特点和习惯。写代码注释、记笔记、填表单,场景不同,最佳做法也不一样。
什么时候该分段输入
下面几种情况,分段输入比一次打完更合适。
内容包含人名、地名、机构名。专有名词的拼音组合经常不在常见词库里,长串输入时容易被剪掉。分段输入让专有名词单独处理,候选质量更高。
句子结构不常见。书面语里常见的倒装、长定语、嵌套结构,语言模型对这类句子的处理不如日常口语。分段输入可以避开整句模型的限制。
输入内容包含中英文混排。长串里夹杂英文单词或缩写,自动识别会介入。分段输入让中英部分各自独立处理,判断更简单。
已知输入法在这个场景下判错率高。如果某个领域的内容经常被切错,说明输入法在这个领域的词库覆盖不足。分段输入是直接的应对方式。
长串输入的性能表现
长串处理的耗时是用户能感受到的。正常情况下,从输入到候选栏刷新在几十毫秒内,用户感觉不到延迟。
延时的来源主要是两个。一是搜索的深度。路径越多,动态规划要处理的层数越多。二是候选词的排序。层三里要对多条整句候选打分,候选越多排序时间越长。
如果明显感觉到长串输入延迟,通常是搜索没有收敛。极端情况下,输入法可能在某个节点展开过多的路径,把搜索预算用完了。这类情况在输入冷门内容时更容易出现。
剪枝策略的存在就是为了控制长串处理时间。不同版本的剪枝阈值可能不同,版本之间长串输入的感受会有差异。
长串分词做不到什么
不能保证所有路径都被评估。剪枝是必须的,剪枝就意味着有些可能正确的路径被跳过了。这是结构性的,不是版本问题。
不能在没有上下文时判断同音歧义。长串里包含多个同音词时,光靠拼音本身无法确定目标。语言模型提供一部分上下文判断,但准确率受模型规模限制。
不能识别词库外的组合。剪枝依赖词库,词库里没有的组合被剪掉的概率更高。新词、冷门词、专业术语在长串输入中更容易失败。
不能跨句子使用上下文。整句处理的最长范围就是当前这次输入。前一句的内容不会参与当前这句的打分。用户如果期待输入法记住前一句的内容并借此判断当前句,这个期待是不成立的。
不能保证处理时间恒定。不同内容的处理时间有差异。常见表达处理快,冷门表达可能需要更长的搜索时间。长串输入的延迟不是固定的,跟内容相关。
把这几条合在一起看,长串分词的定位就清楚了:它是效率工具,让用户能够一次打完一句。它不是万能的,遇到判错时,分段或修改比继续等更有效。
关于长拼音串分词的常见问题
下面 5 个问题是读者反馈中最常被问到的
拼音串多长算「长」?
没有严格界限。从切分空间的角度看,串长每增加一个字母,可能的切分方式都可能翻倍。到 15 个字母以上,切分路径的数量已经进入需要明显剪枝的区间。日常使用中,超过 8 到 10 个字母的输入,切分准确率就会开始下降。
长拼音串为什么候选词容易变少?
长串的候选生成要先把切分路径排好序,再对每条路径生成候选词。路径多了之后,每条路径分到的计算预算减少。输入法会优先保留高概率路径,低概率路径直接丢弃。用户感受到的候选变少,是低概率路径被剪掉的结果。
分段输入和一次打完,哪个更好?
取决于内容和输入习惯。常用词组和句子一次打完效率高,输入法的长串处理就是为这种场景设计的。冷门内容、专业术语、人名较多时,分段输入让每一段落在本地词库的高频区间,候选质量更稳定。没有绝对更好的选择。
长拼音串输入慢是正常的吗?
候选生成的时间复杂度随串长增长,但不应该被明显感知。正常情况下从输入到候选栏刷新在几十毫秒内。如果明显感觉到延迟,通常是候选生成过程中的搜索没有收敛,可能是输入内容触发了低效的搜索路径。
为什么短词切分很准,长句反而出错?
短词的切分空间小,几乎不需要剪枝,所有可能路径都能评估。长句的切分空间大到无法全枚举,必须剪枝,剪枝就意味着有些路径不会被评估。剪掉的路径里可能有正确答案,用户感受到的是长句偶尔给错。