OpenHarmony啃論文俱樂部:拼音輸入法_從觸摸事件到漢字
??想了解更多關(guān)于開源的內(nèi)容,請訪問:??
【本期看點】
老子到此一游系列之《老子的白日夢——基于OpenHarmony的中文拼音輸入法》。
梗概
本文主要內(nèi)容包括以下兩個方面:
(1)中文輸入法的原理和相關(guān)學(xué)術(shù)界綜述研究論文。
輸入法將輸入數(shù)據(jù)觸摸事件或者按鍵事件轉(zhuǎn)化為其他更豐富的字符。
(2)OpenHarmony標(biāo)準(zhǔn)系統(tǒng)輸入法框架,研究OpenHarmony平臺輸入法的基本框架,掌握輸入法與用戶交互的過程,在此基礎(chǔ)上才有可能實現(xiàn)一款最基本的可以與用戶交互的中文輸入法。
輸入法框架主要是連接應(yīng)用和輸入法,保證應(yīng)用可以通過輸入法進行文本輸入。
題外話:
王小波也做過輸入法開發(fā),他也是中國最早的一批程序員之一,他用自己寫的輸入法寫文章,據(jù)說體驗還不錯。在那個時代,開發(fā)自己的輸入法真是個了不起的想法。
中文拼音輸入法原理
要在安裝OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的設(shè)備上編輯中文信息,總是需要中文輸入法。 拼音輸入法是最合理的中文輸入方法。
拼音輸入法屬于一種編碼輸入法。其基本實現(xiàn)原理依賴于拼音與漢字之間的編碼與解碼。
拼音輸入法生來就面臨著一個嚴(yán)峻的挑戰(zhàn):現(xiàn)代漢語大約有410個拼音音節(jié)。,它們不成比例地代表著6000多個常用漢字,這導(dǎo)致拼音到字符映射的嚴(yán)重歧義。
學(xué)術(shù)界為解決當(dāng)今拼音輸入法的關(guān)鍵問題所做的努力都集中在推進拼音到字符的轉(zhuǎn)換上。
音字轉(zhuǎn)換技術(shù)pinyin-to-Chinese (PTC)
音字轉(zhuǎn)換技術(shù)是中文拼音輸入法中最為關(guān)鍵的部分,音字轉(zhuǎn)換就是將一串拼音流轉(zhuǎn)換成為其對應(yīng)的漢字作為輸出。它完全可以看成是從拼音到漢字的翻譯過程。
目前進行音字轉(zhuǎn)換的技術(shù)大概可以分為以下幾類:
- 以語句規(guī)則作為約束條件進行轉(zhuǎn)換。
- 使用模板匹配技術(shù)進行轉(zhuǎn)換。
- 以統(tǒng)計知識為基礎(chǔ)進行轉(zhuǎn)換。
- 上下為語境約束轉(zhuǎn)換。
以上四類轉(zhuǎn)換方法并不是互相獨立的,它們之間或多或少都有一些聯(lián)系。
中國漢字集通常包含約10000-20000個字符,但在日常生活中真正使用的漢字卻少得多。通常,2500個最廣泛的字符可以覆蓋97.97%的文本,而3500個字符可以覆蓋99.48%的文本。所有合法字符都存儲在字體庫中,而中文輸入系統(tǒng)只是試圖在拉丁字母編碼和漢字字體之間建立一個有效的映射。
拼音到漢字的轉(zhuǎn)換可分為拼音流切分和音節(jié)到漢字轉(zhuǎn)換兩個階段,這兩個階段看似簡單,實現(xiàn)起來卻比較復(fù)雜,有很多需要考慮的因素,包括轉(zhuǎn)換精確度、時間復(fù)雜度、空間復(fù)雜度等,下面針對這兩個階段的設(shè)計來做具體的闡述:
音字轉(zhuǎn)換過程分為 拼音流切分 以及 字的轉(zhuǎn)換 兩個階段
第一階段:拼音流切分Chinese Word Segmentation
1.一般情況下用戶進行輸入時輸入的都只是一串拼音流,拼音流切分完成的就是將用戶輸入的拼音流劃分為一個個合理的拼音音節(jié)輸出。非中文用戶知道在輸入法中輸入拼音時,中文輸入法用戶永遠不會輸入分隔符(如“空格”鍵)來分割拼音音節(jié)或拼音單詞,而只是輸入整個未分割的拼音序列。
拼音輸入沒有分段。例如,如果想要輸入“你好開源鴻蒙(Hello OpenHarmony)”,他只需輸入“nihaokaiyuanhongmeng”而不是分段拼音序列“ni hao kai yuan hong meng”。
2.進行拼音音節(jié)分割非常方便。因為拼音音節(jié)的詞匯量非常有限,并且嚴(yán)格遵循一組規(guī)則。
第二階段:字的轉(zhuǎn)換(切分好的拼音流到漢語語句的轉(zhuǎn)換)
1.將拼音流切分成為一個一個的音節(jié)后,要實現(xiàn)的是將這一個個的音節(jié)轉(zhuǎn)換成為對應(yīng)的漢字并組成合理語句。
2.拼音切分將連續(xù)的用戶輸入分解為單獨的拼音音節(jié),并將其傳遞到此階段,即提取候選詞。這是一項查表任務(wù),查找與拼音音節(jié)對應(yīng)的漢語單詞。根據(jù)拼音音節(jié)建立候選詞表。表中的每一列都是與音節(jié)對應(yīng)的單詞,并按其存在的概率排序。
- 例如用戶輸入“ni hao kai yuan hong meng”可以轉(zhuǎn)換成為“你好開源鴻蒙”。
3.一個拼音對應(yīng)多個漢字。當(dāng)用戶輸入一個很長的拼音流時,如果把所有漢字組合結(jié)果進行比較。
選出一個最好的不現(xiàn)實,其復(fù)雜度會成倍增加。整個輸入法系統(tǒng)會崩潰,無法滿足用戶的實時輸入要求。
這部分要求在保證轉(zhuǎn)換精度的同時,盡量降低時間復(fù)雜度,保證輸入法的正常運行。
設(shè)計合理的音字轉(zhuǎn)換算法是實現(xiàn)拼音輸入法的關(guān)鍵
實現(xiàn)拼音流到漢字轉(zhuǎn)換時使用的兩個主要算法:
拼音流切分算法
目前比較常用的切分算法有前向最大匹配(FMM)、后向最大匹配(BMM)以及最少分詞切分,動態(tài)規(guī)劃算法也曾有人嘗試過,但是這些算法都不能夠?qū)η蟹制缌x做很好的處理。
最大匹配法是所有拼音流切分算法中最簡單最容易實現(xiàn)的。所謂最大匹配,就是在拼音流切分時,使切分得到的單個合法拼音長度盡可能大。
優(yōu)缺點:最簡單,但缺點也很明顯。后面輸入的音節(jié)很可能就切分不出來,還會導(dǎo)致很多短音節(jié)無法輸入。
音字轉(zhuǎn)換方法
在將拼音轉(zhuǎn)換為漢字的過程中,對于給定的拼音P序列,目標(biāo)是找到最可能的漢字序列H,通常用語言模型(通過上下文提供單詞的條件概率)來生成。使用貝葉斯定理:
由陳正和李開復(fù)2000年提出的,是一種基于漢語拼音輸入的統(tǒng)計方法。
李開復(fù)加入微軟并在中國創(chuàng)建并領(lǐng)導(dǎo)微軟中國研究院(現(xiàn)為微軟亞洲研究院)。
從理論上講,所有的H都被列舉出來時給出最大值的那個Pr(H,P)被選為最佳漢字序列。在實踐中,將使用一些有效的方法,例如維特比波束搜索。
問題轉(zhuǎn)化為兩部分,打字模型Pr(P|H)和語言模型Pr(H) 。
1)語言模型Pr(H)是漢字序列的先驗概率。通常,它由Statistical language modelling統(tǒng)計語言模型(SLM)決定的,比如三聯(lián)圖。
最廣泛使用的統(tǒng)計語言模型是所謂的n-gram馬爾可夫模型。有時二元圖或三元圖用作SLM。對于英語來說,三元圖被廣泛使用。由于有大量的訓(xùn)練語料庫,三元圖也適用于漢語。在實踐中,perplexity 用于評估SLM:
其中N是測試數(shù)據(jù)的長度。當(dāng)呈現(xiàn)給語言模型時,perplexity 可以粗略地解釋為文檔分支因子的幾何平均值。顯然,perplexity 越少越好。
n-gram馬爾可夫模型,也叫做N 元文法模型。是一種基于統(tǒng)計知識的模型,該模型使用統(tǒng)計概率來對詞語之間的依賴關(guān)系進行衡量。所謂 N 元就是指第i個詞的出現(xiàn)只取決于該詞之前的i-1個詞。通過將PTC(音字轉(zhuǎn)換)轉(zhuǎn)換建模為隱馬爾可夫模型(HMM),并使用維特比(Viterbi,1967)算法對序列進行解碼,提出了“統(tǒng)計輸入法”的思想。
目前進行音字轉(zhuǎn)換使用的大部分都是基于統(tǒng)計的方法,其中使用最廣泛的就是基于N-gram 語言模型的轉(zhuǎn)換算法。
2)Pr(P|H)是漢語單詞H被輸入為拼音P的概率,該模型被稱為打字模型 。
候選句子的生成可以看作是一個解碼問題,目標(biāo)是找到最可能的中文單詞序列:
OpenHarmony的輸入法框架
輸入法框架目前有四大模塊:
輸入法客戶端:
作用:實現(xiàn)輸入法框架服務(wù)與輸入法交付的中間橋梁,包括監(jiān)聽輸入法當(dāng)前的狀態(tài)等等。
輸入法服務(wù):
作用:作為輸入法框架的核心,輸入法的主要處理邏輯都是在這里完成。
應(yīng)用客戶端:
作用:實現(xiàn)應(yīng)用和輸入法框架服務(wù)交付,包括應(yīng)用與輸入法服務(wù)的綁定、應(yīng)用對輸入法的顯示和隱藏請求等等
輸入法Js接口:
作用:暫時對外暴露的js接口,主要是留給輸入法進行調(diào)用使用的。
框架主要支持功能:
在編輯屬性的控件中進行點擊操作,即可通過輸入法框架調(diào)起默認輸入法應(yīng)用。
通過輸入法應(yīng)用可以進行打字,并上屏輸入字符到應(yīng)用客戶端。
相關(guān)API接口文檔:
輸入法框架是什么:
應(yīng)用調(diào)用輸入法實現(xiàn)內(nèi)容輸入,一個平臺的輸入法框架是操作系統(tǒng)的重要組成部分,主要協(xié)調(diào)操作系統(tǒng)、應(yīng)用程序和輸入法軟件之間的事件處理和數(shù)據(jù)傳遞,負責(zé)輸入法之間的切換等工作。
輸入法框架功能主要是連接應(yīng)用和輸入法,保證應(yīng)用可以通過輸入法進行文本輸入,是操作系統(tǒng)必不可少的一部分。
現(xiàn)代操作系統(tǒng)應(yīng)為用戶提供一個多語言環(huán)境,多語言環(huán)境要求之一就是支持用戶多語言文本輸入。
OpenHarmony預(yù)置的輕量級輸入法
- kikainput是一個輕量級的輸入法應(yīng)用,支持在運行OpenHarmony OS的智能終端上。
- 支持語言是JavaScript,模型限制為Stage模型。
- 系統(tǒng)中預(yù)置的輸入法應(yīng)用為??樣例輸入法???,目前僅支持符號輸入鍵盤和英文鍵盤。中文鍵盤輸入法的樣例正在開發(fā)中,預(yù)估最快本月上架到??Smaple倉庫??。
- 在OpenHarmony智能終端上中文輸入法的設(shè)計將由三部分組成:虛擬鍵盤 、當(dāng)前鍵入的鍵和候選列表。
左為OHOS3.1Beta預(yù)置輸入法軟鍵盤,右為OHOS3.1Release預(yù)置輸入法軟鍵盤。
- 兩者在按鍵頁面布局上并無差別,按鍵大小Release版本更加合理。
- 每種鍵盤均采用全鍵盤方式進行輸入。
- 整個音調(diào)都是是灰色和白色的,白色和灰色作為主色調(diào)可以給用戶一種安靜舒適的視覺體驗,減少長時間使用帶來的疲勞。
OpenHarmony暫時不支持中文輸入
- OpenHarmony內(nèi)置輸入法應(yīng)用暫時不支持中文輸入;只支持英文,數(shù)字及字符,及大小寫切換,退格, ENTER鍵等基本功能。(更多消息請關(guān)注??樣例代碼倉庫??)。
- OpenHarmony操作系統(tǒng)中支持中文輸入需要由輸入法應(yīng)用提供中文輸入功能。