乐趣区

关于openharmony:PIMFOpenHarmony-啃论文俱乐部拼音输入法原理-从触摸事件到汉字

本文来自 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.

退出移动版