短串和长串,难在哪不一样

输入 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 条,记录候选栏第一位是否为测试者预期的词。样本量小,数据仅供量级参考。

不同长度的首位命中率对比
人工构造测试 · 每组 50 条
拼音串长度与首位命中率的关系
串长区间 首位命中率 命中率示意 典型错误
4-6 个字母 95% 同音词歧义
7-10 个字母 88% 切分边界偏移
11-15 个字母 79% 低概率路径被剪
16 个字母以上 71% 整句候选质量下降
首位命中率指候选栏第一位为测试者预期。测试样本为常见表达,不含专业术语或人名。每组 50 条,统计显著性不足,数据仅用于展示趋势:命中率随长度上升而下降,但下降幅度不大。长串的候选质量在多数场景下仍然够用,需要翻页的比例随长度增加。如需复现,可到 搜狗输入法下载页获取同一版本自行测试。
数据来源:本页数据为人工构造测试,不是官方数据。测试环境、样本量、判定标准已在上文说明。样本量小,统计显著性不足。这组数据的意义在于展示长度和命中率的关系趋势,不作为精确的准确率参考。不同用户的输入习惯、词库状态、应用环境都会影响结果,复现数据可能有差异。

长串输入的三种典型做法

了解长串分词的处理逻辑后,长串输入就有了策略选择。三种做法各有适用场景。

一次打完。把整句拼音一次性输入,让输入法做整句处理。优势是效率最高,输入法可以用语言模型给整句打分。适合常见表达,比如日常聊天、写普通文档。整句的切分和选字一次完成,候选栏直接给完整句子。代价是长串一旦判错,需要翻页或者退格修改。

分段输入。把句子拆成两到三段分别输入,每段单独上屏。优势是每段落在更短的切分空间里,候选质量更稳定。适合专业内容、人名密集、同音词多的场景。代价是效率比一次打完低,多次上屏会打断输入节奏。

混拼结合。用全拼输入关键词,用简拼输入常见虚词和连接词。优势是效率跟一次打完接近,同时把复杂部分落在全拼上。适合有一定输入经验的用户,需要熟悉常用简拼。

三种做法没有绝对更好的。选择依据是自己的输入内容特点和习惯。写代码注释、记笔记、填表单,场景不同,最佳做法也不一样。

什么时候该分段输入

下面几种情况,分段输入比一次打完更合适。

内容包含人名、地名、机构名。专有名词的拼音组合经常不在常见词库里,长串输入时容易被剪掉。分段输入让专有名词单独处理,候选质量更高。

句子结构不常见。书面语里常见的倒装、长定语、嵌套结构,语言模型对这类句子的处理不如日常口语。分段输入可以避开整句模型的限制。

输入内容包含中英文混排。长串里夹杂英文单词或缩写,自动识别会介入。分段输入让中英部分各自独立处理,判断更简单。

已知输入法在这个场景下判错率高。如果某个领域的内容经常被切错,说明输入法在这个领域的词库覆盖不足。分段输入是直接的应对方式。

长串输入的性能表现

长串处理的耗时是用户能感受到的。正常情况下,从输入到候选栏刷新在几十毫秒内,用户感觉不到延迟。

延时的来源主要是两个。一是搜索的深度。路径越多,动态规划要处理的层数越多。二是候选词的排序。层三里要对多条整句候选打分,候选越多排序时间越长。

如果明显感觉到长串输入延迟,通常是搜索没有收敛。极端情况下,输入法可能在某个节点展开过多的路径,把搜索预算用完了。这类情况在输入冷门内容时更容易出现。

剪枝策略的存在就是为了控制长串处理时间。不同版本的剪枝阈值可能不同,版本之间长串输入的感受会有差异。

长串分词做不到什么

不能保证所有路径都被评估。剪枝是必须的,剪枝就意味着有些可能正确的路径被跳过了。这是结构性的,不是版本问题。

不能在没有上下文时判断同音歧义。长串里包含多个同音词时,光靠拼音本身无法确定目标。语言模型提供一部分上下文判断,但准确率受模型规模限制。

不能识别词库外的组合。剪枝依赖词库,词库里没有的组合被剪掉的概率更高。新词、冷门词、专业术语在长串输入中更容易失败。

不能跨句子使用上下文。整句处理的最长范围就是当前这次输入。前一句的内容不会参与当前这句的打分。用户如果期待输入法记住前一句的内容并借此判断当前句,这个期待是不成立的。

不能保证处理时间恒定。不同内容的处理时间有差异。常见表达处理快,冷门表达可能需要更长的搜索时间。长串输入的延迟不是固定的,跟内容相关。

把这几条合在一起看,长串分词的定位就清楚了:它是效率工具,让用户能够一次打完一句。它不是万能的,遇到判错时,分段或修改比继续等更有效。

关于长拼音串分词的常见问题

下面 5 个问题是读者反馈中最常被问到的

拼音串多长算「长」?

没有严格界限。从切分空间的角度看,串长每增加一个字母,可能的切分方式都可能翻倍。到 15 个字母以上,切分路径的数量已经进入需要明显剪枝的区间。日常使用中,超过 8 到 10 个字母的输入,切分准确率就会开始下降。

长拼音串为什么候选词容易变少?

长串的候选生成要先把切分路径排好序,再对每条路径生成候选词。路径多了之后,每条路径分到的计算预算减少。输入法会优先保留高概率路径,低概率路径直接丢弃。用户感受到的候选变少,是低概率路径被剪掉的结果。

分段输入和一次打完,哪个更好?

取决于内容和输入习惯。常用词组和句子一次打完效率高,输入法的长串处理就是为这种场景设计的。冷门内容、专业术语、人名较多时,分段输入让每一段落在本地词库的高频区间,候选质量更稳定。没有绝对更好的选择。

长拼音串输入慢是正常的吗?

候选生成的时间复杂度随串长增长,但不应该被明显感知。正常情况下从输入到候选栏刷新在几十毫秒内。如果明显感觉到延迟,通常是候选生成过程中的搜索没有收敛,可能是输入内容触发了低效的搜索路径。

为什么短词切分很准,长句反而出错?

短词的切分空间小,几乎不需要剪枝,所有可能路径都能评估。长句的切分空间大到无法全枚举,必须剪枝,剪枝就意味着有些路径不会被评估。剪掉的路径里可能有正确答案,用户感受到的是长句偶尔给错。