如何从头开始编一个拼音输入法?

如题所述

需要学习输入法框架的 API;不同系统的输入法框架有较大差异,可能会涉及一些系统底层的细节;调试困难;Windows 的输入法以 DLL 注入方式加载,需要事先注册到系统,且不可运行时替换 (hot-swap);Mac OS 对输入法做超时控制,难以利用断点单步调试我的建议是,在理解输入法工作原理的基础上,先写一个逻辑纯粹的、在命令行上以 REPL (Read-eval-print loop) 方式工作的输入法原型。比方说,首先实现输入一串编码、查词典、输出查询结果。如果是做拼音输入法,可进一步在词典查询基础上完成词组、语句的转换。然後,再增加选字、编辑等功能键的处理逻辑。不可显示为字符的按键,可通过转义序列模拟,例如 `rime_api_console` 采用花括弧+IBus键名表示任意的按键:`shuruufa{Left}{Left}{BackSpace}{End}`https://github.com/lotem/librime/blob/master/tools/rime_api_console.cc#L144这样做的好处是可以将测试用的按键序列保存为文本,通过输入重定向重放测试场景:```$ rime_api_console< test_key_sequence.txt```原型将输入法所需逻辑完全实现後,即可集成到真实的输入法框架,完善用户介面等等。最後,藉机宣传一下 RIME:RIME/中州韵输入法引擎,是一套跨平台的输入法算法框架,即在输入法与操作系统接口之上封装了一套输入法常用的算法和逻辑组件,允许用户以 YAML 文档格式自定义输入方案和码表,快速建立拼音、注音、五笔及类似形态的输入法。对於需要特殊逻辑的输入法,可通过编程扩展该框架,使开发者只须专注於相关逻辑。目前这一框架的不足是接口尚未完全定型、缺少开发文档。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-12-06

我觉得引擎是重中之重的地方。引擎出词分为两个部门:1 unigram 2 bigram 这两个部分。unigram不用解释,直接大量的文本统计,bigram是干什么用的呢?比如说:不用解释 0.89 这个就是一个bigram,在统计bigram的时候需要做平滑,这个地方需要注意,训练这个模型是关键,因为bigram统计完大约有上亿条,你需要筛选出400万的bigram对(这个地方是技术之所在)。模型统计好了,用户输入拼音串是简拼和全拼混合的,这个时候有两种做法,第一是将拼音转换为全拼(搜狗输入法,百度输入法,QQ输入法是这种设计),第二是直接简拼和全拼混合(这个时候词典得采用声母+韵母共同命中的方法查询)(WI输入法,阿里拼音都是这样的设计)然后就是所谓的拼音切分等流程。

第2个回答  2017-12-06

1. 首先是要做拼音切分,切分方案n种(前缀,声母韵母),比如nihao,切分成ni'hao2.根据切分出来的出来的[ni'hao],查出来候选词。这个怎么查,假设你已经有了一个词典,然后用查字典的方法,查到[你好][利好][拟好]等候选词。然后要排序是吧,哪个要放在第一位,哪个要放第二位什么的。3.the end

针对拼音切分,你需要存储所有的拼音吧。怎么存储这个拼音啊,一般习惯上用trie树去存储,顺便可以做拼音切分。当然假设你有一个词典,怎么通过切分出来的拼音去找词,依然可以用trie树的方案,去存储。至于排序,可以给每个词,比如[你好]给个权值10,[利好]给个8什么的。

本回答被网友采纳
相似回答