本文来自OpenHarmony成长计划啃论文俱乐部11组PIMF
(Preeminent Input Method Framework)团队,PIMF
即卓越的输入法框架。
大家好!我来自南京,在OpenHarmony成长计划啃论文俱乐部,与华为、软通动力、润和软件、拓维信息、深开鸿
等公司一起,学习和研究操作系统技术
,我是11组PIMF
的成员。
【本期看点】
老子到此一游系列之《老子的白日梦——基于OpenHarmony的中文拼音输入法》
梗概
本文主要内容包括以下两个方面:
(1)OpenHarmony标准系统输入法框架,掌握输入法与用户交互的过程,在此基础上给OpenHarmony中文输入法开发提供一些参考资料。
- 输入法框架主要是连接应用和输入法,保证应用可以通过输入法进行文本输入。
(2)中文输入法的原理和相关学术界研究论文,为OpenHarmony上中文输入法的开发提供一些学术上的思路。
- 输入法将输入数据触摸事件或者按键事件转化为其他更丰富的字符。
题外话:
王小波也做过输入法开发,他也是中国最早的一批程序员之一,他用自己写的输入法写文章,据说体验还不错。在那个时代,开发自己的输入法真是个了不起的想法。
OpenHarmony的输入法框架
输入法框架目前有四大模块
输入法客户端
作用:实现输入法框架服务与输入法交付的中间桥梁,包括监听输入法当前的状态等等。
输入法服务
作用:作为输入法框架的核心,输入法的主要处理逻辑都是在这里完成。
应用客户端
作用:实现应用和输入法框架服务交付,包括应用与输入法服务的绑定、应用对输入法的显示和隐藏请求等等
输入法Js接口
作用:暂时对外暴露的js接口,主要是留给输入法进行调用使用的。
框架主要支持功能
- 在编辑属性的控件中进行点击操作,即可通过输入法框架调起默认输入法应用。
- 通过输入法应用可以进行打字,并上屏输入字符到应用客户端。
相关API接口文档
输入法框架是什么
- 应用调用输入法实现内容输入,一个平台的输入法框架是操作系统的重要组成部分,主要协调操作系统、应用程序和输入法软件之间的事件处理和数据传递,负责输入法之间的切换等工作。
- 输入法框架功能主要是连接应用和输入法,保证应用可以通过输入法进行文本输入,是操作系统必不可少的一部分。
- 现代操作系统应为用户提供一个多语言环境,多语言环境要求之一就是支持用户多语言文本输入。
OpenHarmony预置的轻量级输入法
- kikainput是一个轻量级的输入法应用,支持在运行OpenHarmony OS的智能终端上。
- 支持语言是JavaScript,模型限制为Stage模型。
- 系统中预置的输入法应用为样例输入法,目前仅支持符号输入键盘和英文键盘。中文键盘输入法的样例正在开发中,预估最快本月上架到Smaple仓库。
- 在OpenHarmony智能终端上中文输入法的设计将由三部分组成:虚拟键盘 、当前键入的键和候选列表。
左为OHOS3.1Beta预置输入法软键盘,右为OHOS3.1Release预置输入法软键盘
- 两者在按键页面布局上并无差别,按键大小Release版本更加合理。
- 每种键盘均采用全键盘方式进行输入。
- 整个音调都是是灰色和白色的,白色和灰色作为主色调可以给用户一种安静舒适的视觉体验,减少长时间使用带来的疲劳。
OpenHarmony暂时不支持中文输入
- OpenHarmony内置输入法应用暂时不支持中文输入;只支持英文,数字及字符,及大小写切换,退格, ENTER键等基本功能。(更多消息请关注样例代码仓库)
- OpenHarmony操作系统中支持中文输入需要由输入法应用提供中文输入功能。
中文拼音输入法原理
- 要在安装OpenHarmony标准系统的设备上编辑中文信息,总是需要中文输入法。 拼音输入法是最合理的中文输入方法。
- 拼音输入法属于一种编码输入法。其基本实现原理依赖于拼音与汉字之间的编码与解码。
- 拼音输入法生来就面临着一个严峻的挑战:现代汉语大约有410个拼音音节。,它们不成比例地代表着6000多个常用汉字,这导致拼音到字符映射的严重歧义。
- 学术界为解决当今拼音输入法的关键问题所做的努力都集中在推进拼音到字符的转换上。
音字转换技术pinyin-to-Chinese (PTC)
音字转换技术是中文拼音输入法中最为关键的部分,音字转换就是将一串拼音流转换成为其对应的汉字作为输出。它完全可以看成是从拼音到汉字的翻译过程。
目前进行音字转换的技术大概可以分为以下几类:
1)以语句规则作为约束条件进行转换
2)使用模板匹配技术进行转换
3)以统计知识为基础进行转换
4)上下为语境约束转换以上四类转换方法并不是互相独立的,它们之间或多或少都有一些联系。
- 中国汉字集通常包含约10000-20000个字符,但在日常生活中真正使用的汉字却少得多。通常,2500个最广泛的字符可以覆盖97.97%的文本,而3500个字符可以覆盖99.48%的文本。所有合法字符都存储在字体库中,而中文输入系统只是试图在拉丁字母编码和汉字字体之间建立一个有效的映射。
- 拼音到汉字的转换可分为拼音流切分和音节到汉字转换两个阶段,这两个阶段看似简单,实现起来却比较复杂,有很多需要考虑的因素,包括转换精确度、时间复杂度、空间复杂度等,下面针对这两个阶段的设计来做具体的阐述:
音字转换过程分为 拼音流切分 以及 字的转换 两个阶段
第一阶段:拼音流切分Chinese Word Segmentation
1.一般情况下用户进行输入时输入的都只是一串拼音流,++拼音流切分完成的就是将用户输入的拼音流划分为一个个合理的拼音音节输出++。非中文用户知道在输入法中输入拼音时,++中文输入法用户永远不会输入分隔符(如“空格”键)来分割拼音音节或拼音单词++,而只是输入整个未分割的拼音序列。
- 拼音输入没有分段。例如,如果想要输入“你好开源鸿蒙(Hello OpenHarmony)”,他只需输入“nihaokaiyuanhongmeng”而不是分段拼音序列“ni hao kai yuan hong meng”。
2.进行拼音音节分割非常方便。因为拼音音节的词汇量非常有限,并且严格遵循一组规则。
第二阶段:字的转换(切分好的拼音流到汉语语句的转换)
1.将拼音流切分成为一个一个的音节后,要实现的是将这一个个的音节转换成为对应的汉字并组成合理语句。
2.拼音切分将连续的用户输入分解为单独的拼音音节,并将其传递到此阶段,即提取候选词。这是一项查表任务,查找与拼音音节对应的汉语单词。根据拼音音节建立候选词表。表中的每一列都是与音节对应的单词,并按其存在的概率排序。
- 例如用户输入“ni hao kai yuan hong meng”可以转换成为“你好开源鸿蒙”。
3.一个拼音对应多个汉字。当用户输入一个很长的拼音流时,如果把所有汉字组合结果进行比较。
- 选出一个最好的不现实,其复杂度会成倍增加。整个输入法系统会崩溃,无法满足用户的实时输入要求。
- 这部分要求在保证转换精度的同时,尽量降低时间复杂度,保证输入法的正常运行。
设计合理的音字转换算法是实现拼音输入法的关键
实现拼音流到汉字转换时使用的两个主要算法:
拼音流切分算法
目前比较常用的切分算法有前向最大匹配(FMM)、后向最大匹配(BMM)以及最少分词切分,动态规划算法也曾有人尝试过,但是这些算法都不能够对切分歧义做很好的处理。
- 最大匹配法是所有拼音流切分算法中最简单最容易实现的。所谓最大匹配,就是在拼音流切分时,使切分得到的单个合法拼音长度尽可能大。
1)优缺点:最简单,但缺点也很明显。后面输入的音节很可能就切分不出来,还会导致很多短音节无法输入。
音字转换方法
在将拼音转换为汉字的过程中,对于给定的拼音P序列,目标是找到最可能的汉字序列H,通常用语言模型(通过上下文提供单词的条件概率)来生成。使用贝叶斯定理:
$$ \widehat{H} = \operatorname{arg} \max _H Pr(H|P) =\operatorname{arg} \max _H \frac{Pr(P|H)Pr(H)}{Pr(P)} $$
由陈正和李开复2000年提出的,是一种基于汉语拼音输入的统计方法。
李开复加入微软并在中国创建并领导微软中国研究院(现为微软亚洲研究院)。
- 从理论上讲,所有的H都被列举出来时给出最大值的那个Pr(H,P)被选为最佳汉字序列。在实践中,将使用一些有效的方法,例如维特比波束搜索。
- 问题转化为两部分,打字模型Pr(P|H)和语言模型Pr(H) 。
1)语言模型Pr(H)是汉字序列的先验概率。通常,它由Statistical language modelling统计语言模型(SLM)决定的,比如三联图。
$$Pr(H)= Pr(h_i|h_{i-1})$$
$$ \operatorname{arg} \max _H Pr(H) =\prod_{i=1}^N Pr(h_i|h_{i-1}) $$
$$ 汉字序列H由汉字单词h_1,h_2,...,h_i组成的。$$
最广泛使用的统计语言模型是所谓的n-gram马尔可夫模型。有时二元图或三元图用作SLM。对于英语来说,三元图被广泛使用。由于有大量的训练语料库,三元图也适用于汉语。在实践中,perplexity
用于评估SLM:
$$(perplexity)PP= 2^{-\frac{1}{N} \sum_{i=1}^N \log_{} p(h_i|h_{i-1}) } $$
- 其中N是测试数据的长度。当呈现给语言模型时,
perplexity
可以粗略地解释为文档分支因子的几何平均值。显然,perplexity
越少越好。 - n-gram马尔可夫模型,也叫做N 元文法模型。是一种基于统计知识的模型,该模型使用统计概率来对词语之间的依赖关系进行衡量。所谓 N 元就是指第i个词的出现只取决于该词之前的i-1个词。通过将PTC(音字转换)转换建模为隐马尔可夫模型(HMM),并使用维特比(Viterbi,1967)算法对序列进行解码,提出了“统计输入法”的思想。
- 目前进行音字转换使用的大部分都是基于统计的方法,其中使用最广泛的就是基于N-gram 语言模型的转换算法。
2)Pr(P|H)是汉语单词H被输入为拼音P的概率,该模型被称为打字模型 。
$$\because H是汉语拼音的组合,它可以分解为h_1、h_2、h_3..... 其中h_i是中文单词。 $$
$$ \therefore Pr(P|H) \approx \begin{matrix} \prod_{i=1}^N Pr(P_{f(i)}|h_i) \end{matrix} (P_{f(i)}是 h_i的拼音)$$
3)候选句子的生成可以看作是一个解码问题,目标是找到最可能的中文单词序列:
$$ \therefore \widehat{H} = \operatorname{arg} \max _H Pr(H|P) =\operatorname{arg} _H \max\frac{Pr(P|H)Pr(H)}{Pr(P)} $$
$$ \therefore\widehat{H}=\operatorname{arg}\max _H Pr(P|H)Pr(H) $$
致谢
在此特别感谢祝尚元老师提供资料的参考、蒋卫峰老师以及欧建深教练啃论文思路和方法上的指导和鼓励,并且感谢segmentfault提供的平台和资源。
参考资料
【1】魏雅芳,基于Android平台的智能拼音输入法的设计与实现,2015年6月
【2】Chen Z, Lee K F. A new statistical approach to Chinese Pinyin input[C]//Proceedings of the 38th Annual Meeting of the Association for Computational Linguistics. 2000: 241-247.
【3】Gao J, Wang H F, Li M, et al. A unified approach to statistical language modeling for Chinese[C]//2000 IEEE International Conference on Acoustics, Speech, and Signal Processing. Proceedings (Cat. No. 00CH37100). IEEE, 2000, 3: 1703-1706.
【4】Chen S, Zhao H, Wang R. Neural network language model for Chinese pinyin input method engine[C]//Proceedings of the 29th Pacific Asia conference on language, information and computation. 2015: 455-461.