新酷音輸入法的羅馬拼音

1,052 views
Skip to first unread message

Wei-Hao Syu

unread,
Jun 27, 2012, 7:16:15 AM6/27/12
to chewin...@googlegroups.com
大家好,因為新酷音今年 SoC 有一個項目是「針對新酷音輸入法客製化鍵盤排列的機制」,剛好跟我們嘗試把台灣華語羅馬拼音(http://thl.tw) 套用在新酷音上面有些相關,然後我們又遇到了些困難,所以想了解一下,以新酷音目前以及將來展望的架構,如果要實作這些功能是否可行。

首先介紹一下台灣華語羅馬拼音(THL) , THL跟通用一樣是從漢語拼音衍生出來,所以拼字結構基本上是相同的,主要是配合台灣人的習慣做調整及延伸,也因為結構相同,原則上我們希望羅馬拼音輸入法不只是吃 THL,也要能夠通吃漢語拼音及通用拼音例如:

(THL/漢語/通用)
ㄑーㄠ 的音可由 chiao/qiao/ciao 任一方式輸入
ㄒㄩㄝ 的音可由 syueh/xue/syue 任一方式輸入

裡面還包括通用簡寫,漢語ㄩ=v 等等……這概念有點像 iOS/OS X 內建的日文羅馬字輸入法,你可以用ISO或是平文羅馬字交叉輸入,不需要特別去選擇用哪個羅馬字方案。不過這邊有一個問題,就是 THL 漢語通用之間有 3 個組合是對應到不同注音的:

(THL/漢語/通用) 
ci (無)/ㄘ/ㄑー
chi ㄑー/ㄔ/(無)
si ㄒー/ㄙ/ㄒー

也就是說輸入 chi 時需要一併列出ㄑー及ㄔ的音,或許可以有個參數讓使用者決定以哪個拼音法為優先順序,更進一步的話亦可能將兩者的常用字(七妻棲吃蚩痴…)放在第一排等。其實這部份有點像 iOS 開啟模糊拼音的情況,主要就是ㄓㄔㄕ/ㄗㄘㄙ捲不捲舌互相對應這類的,像是輸入 shen 跟 sen 都會出現ㄕㄣ跟ㄙㄣ的字,只是優先順序不同而已。

以目前 libchewing 的架構下,就我們的理解是,每一個輸入字串最後都會被轉為單一個注音拼音,然後開始查表,要達到上面這幾點的需求,這部份的架構勢必需要調整,我們在嘗試的時候是用一些繞路抓特例的方式來實作 (目前試到一半,不確定能不能成功),不過這種方式彈性會很低,能有一個完整的架構的話當然會更理想了,當然,如果需要我們的話,我們會非常樂意共同參與開發的,謝謝大家。

jidanni

unread,
Jun 30, 2012, 7:58:13 PM6/30/12
to chewin...@googlegroups.com
請問您是余博士的朋友嗎?
http://jidanni.org/lang/pinyin/older.html

Wei-Hao Syu

unread,
Jul 1, 2012, 2:19:09 AM7/1/12
to chewin...@googlegroups.com
我不認識他,但是有看過您跟他關於通用拼音及漢語拼音的爭論,不過我不希望這邊的討論又變成拼音法論戰,希望您能理解,謝謝。

On Sunday, July 1, 2012 7:58:13 AM UTC+8, jidanni wrote:
請問您是余博士的朋友嗎?
http://jidanni.org/lang/pinyin/older.html

Jim Huang

unread,
Jul 2, 2012, 12:09:48 AM7/2/12
to chewin...@googlegroups.com, Jeff Chen
在 2012年6月27日下午7:16,Wei-Hao Syu <whsy...@gmail.com> 寫道:
[...]

> 也就是說輸入 chi
> 時需要一併列出ㄑー及ㄔ的音,或許可以有個參數讓使用者決定以哪個拼音法為優先順序,更進一步的話亦可能將兩者的常用字(七妻棲吃蚩痴…)放在第一排等。其實這部份有點像
> iOS 開啟模糊拼音的情況,主要就是ㄓㄔㄕ/ㄗㄘㄙ捲不捲舌互相對應這類的,像是輸入 shen 跟 sen 都會出現ㄕㄣ跟ㄙㄣ的字,只是優先順序不同而已。
>

之前 Jeff Chen 做的版本是查表處理,可見 src/hanyupinyin.c

/**
* Map pinyin key-sequence to Zuin key-sequence.
* Caller should allocate char zuin[4].
*
* Non-Zero: Fail to fully convert
*
* @retval 0 Success
*/
int HanyuPinYinToZuin( char *pinyinKeySeq, char *zuinKeySeq )

如果要作到華語羅馬拼音的支援,這部份的邏輯可能得大改,但我相信可行的。

> 以目前 libchewing
> 的架構下,就我們的理解是,每一個輸入字串最後都會被轉為單一個注音拼音,然後開始查表,要達到上面這幾點的需求,這部份的架構勢必需要調整,我們在嘗試的時候是用一些繞路抓特例的方式來實作
> (目前試到一半,不確定能不能成功),不過這種方式彈性會很低,能有一個完整的架構的話當然會更理想了,當然,如果需要我們的話,我們會非常樂意共同參與開發的,謝謝大家。
>

好的,歡迎討論。

Sincerely,
-jserv

Jeff Chen

unread,
Jul 2, 2012, 1:01:28 AM7/2/12
to chewin...@googlegroups.com, Jim Huang
Hello,
這邊主要是指 "無聲調拼音系統"嗎?

若是的話, 很久前我有稍微研究一下, 大致上分為兩個議題.
1.  選字:
      這個部份, 比較簡單一點, 可以把各聲調的字列出後, 在根據 "使用頻率" 去列出.

      註: 以前松下的"漢音輸入法", 在選字列表中, 有支援這樣的特性,
           但若把選詞的部份一起考慮進去, 則"根據使用頻率列出", 其實是可以被忽略的

2.  選詞的部份.
     這個部份, 就和 "音標"系統沒什麼關係, 而是酷音本身的選詞演算法
     選詞的部份, 一開始就是根據"有聲調的注音系統去設計",
    因此, 若要支援"無聲調", 就比較麻煩.

    註: "模糊拼音" 的議題, 最後也是會和選詞相關, 
          目前酷音, 是基於"有聲調的音標系統",  去做選選擇,
  
若只是, 有"聲調的拼音系統", 其實只要更改 "mapping table", 就行了.
我印象中, 當初應該是可以讀入外部檔案..

Wei-Hao Syu

unread,
Jul 2, 2012, 1:40:31 PM7/2/12
to chewin...@googlegroups.com, Jim Huang
其實模糊拼音和有無聲調並沒有絕對關係,含聲調的情況下 sen1ling2 跟 shen1lin2 都能輸出「森林」就可以算是模糊拼音了。不過從這個例子就可以看出含聲調輸入並不是很順手,既然聲韻都可以容錯,當然聲調也要可以才理想。所以說沒錯,模糊拼音能夠搭配無聲調的話是最理想的,不過初期嘗試的話先用含聲調來測試我想是可以接受的。

如果可以用改 mapping table (phone.cin嗎?) 的方式做到含聲調的模糊拼音,那我想我可以先嘗試一下看看效果如何。

更進一步的話,就我目前的理解(有錯請指正,感謝),新酷音的聲調前段處理是切開處理完不同鍵盤排列,接著轉成預設注音輸入碼,然後再合流從有聲調的詞典檔做判斷。一開始 PinYinInput() 會透過 HanyuPinYinToZuin() 一對一把輸入轉成注音輸入碼,然後放進 buffer 裡。這邊要改成直接可以無調或是模糊的話,那輸入就變成一對多,這樣勢必會影響到原本注音輸入的運作模式,會變成大規模變動,似乎不是很理想。

或許在後端動手會比較容易,也就是在輸入碼固定的情況下,轉出來的注音符號會不只一組(cheng2 bao3 → t/6 1l3) → ㄔㄥˊ ㄅㄠˇ + ㄔㄣˊ ㄅㄠˇ),最後再照指定的順序(ex. 常用音優先或正確音優先、漢語優先或THL優先等) 合併後呈現,然後把這整段都鎖在 kbtype == KB_HANYU_PINYIN 也就是只有用羅馬拼音輸入的時候才會生效,這樣影響範圍就不會太大了。

Jim Huang

unread,
Jul 4, 2012, 5:21:11 PM7/4/12
to chewin...@googlegroups.com, Wei-Hao Syu
在 2012年7月3日上午1:40,Wei-Hao Syu <whsy...@gmail.com> 寫道:
> 其實模糊拼音和有無聲調並沒有絕對關係,含聲調的情況下 sen1ling2 跟 shen1lin2
> 都能輸出「森林」就可以算是模糊拼音了。不過從這個例子就可以看出含聲調輸入並不是很順手,既然聲韻都可以容錯,當然聲調也要可以才理想。所以說沒錯,模糊拼音能夠搭配無聲調的話是最理想的,不過初期嘗試的話先用含聲調來測試我想是可以接受的。
>
> 如果可以用改 mapping table (phone.cin嗎?) 的方式做到含聲調的模糊拼音,那我想我可以先嘗試一下看看效果如何。

可以改 data/pinyin.tab
其內容大概為:

34
b 1
p q
m a
f z
d 2
t w
n s
l x
g e
k d
h c
... (下略) ...

以 "h" 來說,就是對到「ㄏ」(鍵位 = "c")

當然再建立另一個表格與搜尋方法也行。

> 更進一步的話,就我目前的理解(有錯請指正,感謝),新酷音的聲調前段處理是切開處理完不同鍵盤排列,接著轉成預設注音輸入碼,然後再合流從有聲調的詞典檔做判斷。一開始
> PinYinInput() 會透過 HanyuPinYinToZuin() 一對一把輸入轉成注音輸入碼,然後放進 buffer
> 裡。這邊要改成直接可以無調或是模糊的話,那輸入就變成一對多,這樣勢必會影響到原本注音輸入的運作模式,會變成大規模變動,似乎不是很理想。
>
> 或許在後端動手會比較容易,也就是在輸入碼固定的情況下,轉出來的注音符號會不只一組(cheng2 bao3 → t/6 1l3) → ㄔㄥˊ ㄅㄠˇ +
> ㄔㄣˊ ㄅㄠˇ),最後再照指定的順序(ex. 常用音優先或正確音優先、漢語優先或THL優先等) 合併後呈現,然後把這整段都鎖在 kbtype ==
> KB_HANYU_PINYIN 也就是只有用羅馬拼音輸入的時候才會生效,這樣影響範圍就不會太大了。

這部份應該可以參考鍵盤排列的想法來作。程式碼搜尋 "Hsu",可見到 src/chewingio.c 與 src/zuin.c 的實做。

Regards,
-jserv

Wei-Hao Syu

unread,
Aug 16, 2012, 7:55:46 AM8/16/12
to chewin...@googlegroups.com
花了些研究了一下 src/hanyupinyin.c 跟 data/pinyin.tab,主要的心得如下:
1. pinyin.tab 類似注音結構,是由前半部搭配後半部組成,大致上前者是聲母後者是韻母,但是其實不一定,例如 ju (ㄐㄩ) 就完全放在前半部。
2. pinyin.tab 內有輸入順序,例如 sh 要放在 s 前面,不然實際輸入的時候遇到 s 符合就不會往下找 sh 了。
3. 大部份情況下改 pinyin.tab 即可,但是有少數特例(拼音結構始然)是靠 hanyupinyin.c 判斷。
4. 後面多接的字母會被自動忽略,例如輸入 ku4yinabcde1 會得到"酷音", yin 後面那個 abcde 會被自動忽略

這邊首先是嘗試把 4 改成較精準的對應,也就是 ku4yinabcde1 不會得到"酷音",要正確輸入 ku4yin1 才行。
然後要讓同時輸入漢語、通用、台灣華語,需要多不少判斷式,然而因為本來就有 3 存在,所以只是擴充而已,不過前述三組重覆對應沒辦法在這邊解決,因為一定要送出一組對應輸入的注音出去,不能一對多,之前提到的模糊拼音情況一樣也是沒辦法在這裡解掉,接下來我要看的應該就會是這塊了。

再來就是把 1 的組成改成完全的 聲母-韻母 組合,不過像是 ㄓ 這種注音不標、拼音會標的空韻 (漢語 -i/ THL -ih),後半部沒有輸入之符號可以對應 (因為注音不需輸入),所以在 pinyin.tab 暫時用 '=' 表示,然後在 hanyupinyin.c 中代換掉,話說既然本來就得靠 3 的方式判斷了,所以用動態載入 pinyin.tab 的方式也不能達到完全置換的效果,我會建議之後可以把 pinyin.tab 改成 pinyin.h 的形式,直接寫進 hanyuInitialsMap hanyuFinalsMap 裡面即可。

一般的拼音輸入就是弄個一大串的拼音對應表,輸入時查表輸出結果,新酷音這種拆成前後半查表的方式在實作時倒是出現意外的方便性,單一字採用不同拼音方案就變得可能,而且對應表會相對很簡單,像是雄(漢語 xiong2, THL syong2) 輸入 xyong2 或是 siong2 都通,甚至要交互支援威妥瑪也是可行的,像是大家比較習慣的 hsiung 我們只要多加一組 hs- (ㄒ) 跟 -iung (ㄩㄥ) 即可,如果是整串式的對應表,那要加的可多了,另一個例子是黃(huang2),因為我們韻母有 uang 也有 wang,所以可以直接無痛順便支援郵政式拼音 hwang2,而這個甚至是完全不需任何修改就已經支援了。

這兩個修改過的檔案放在這裡,也歡迎大家多多測試,謝謝。

jidanni

unread,
Aug 16, 2012, 5:56:12 PM8/16/12
to chewin...@googlegroups.com
只知道我無法打「   唷」with yo1 in Hanyu Pinyin.

Kuang-che Wu

unread,
Aug 16, 2012, 11:50:17 AM8/16/12
to chewin...@googlegroups.com
On Thu, Aug 16, 2012 at 04:55:46AM -0700, Wei-Hao Syu wrote:
> 一般的拼音輸入就是弄個一大串的拼音對應表,輸入時查表輸出結果,新酷音這種拆成前後半查表的方式在實作時倒是出現意外的方便性,單一字採用不同拼音方案就變得可能,而且對應表會相對很簡單,像是雄(漢語
> xiong2, THL syong2) 輸入 xyong2 或是 siong2 都通,甚至要交互支援威妥瑪也是可行的,像是大家比較習慣的 hsiung
> 我們只要多加一組 hs- (ㄒ) 跟 -iung (ㄩㄥ) 即可,如果是整串式的對應表,那要加的可多了,另一個例子是黃(huang2),因為我們韻母有
> uang 也有 wang,所以可以直接無痛順便支援郵政式拼音 hwang2,而這個甚至是完全不需任何修改就已經支援了。
>
> 這兩個修改過的檔案放在這裡,也歡迎大家多多測試,謝謝。
建議如果找得到 "一大串的拼音對應表" 的話, 弄一份放到 source tree 裡, 當作拼音的 unit test.

Wei-Hao Syu

unread,
Aug 17, 2012, 7:49:20 AM8/17/12
to chewin...@googlegroups.com
之前有針對漢語拼音 ㄩ 對應到 u, v 的部份做補齊,結果沒檢查到這個,不好意思 ^^"

這個問題倒是很好解決,因為 phone.cin 裡面有唷(ーㄛ),但是 yo 並沒有對應到所以打不出來,只要動一下 pinyin.tab 即可

jid...@jidanni.org

unread,
Aug 17, 2012, 8:12:03 AM8/17/12
to chewin...@googlegroups.com
Thanks for fixing it.

>>>>> "WS" == Wei-Hao Syu <whsy...@gmail.com> writes:
WS> 之前有針對漢語拼音 ㄩ 對應到 u, v 的部份做補齊,結果沒檢查到這個,不好意思 ^^"

WS> 這個問題倒是很好解決,因為 phone.cin 裡面有唷(ーㄛ),但是 yo 並沒有對應到所以打不出來,只要動
WS> 一下 pinyin.tab 即可
WS> http://admin.thl.tw/_media/programming/2012-08-17/pinyin.tab (修正版)

WS> On Friday, August 17, 2012 5:56:12 AM UTC+8, jidanni wrote:

WS> 只知道我無法打「 唷」with yo1 in Hanyu Pinyin.

WS> --
WS> 您已訂閱「Google 網上論壇」的「Chewing IM Development」群組,因此我們特別傳送這封郵件通知您。
WS> 如要在網路上查看這項討論,請造訪 https://groups.google.com/d/msg/chewing-devel/-/-1249ksMecoJ
WS> 。
WS> 如要在此群組張貼留言,請傳送電子郵件至 chewin...@googlegroups.com
WS> 如要取消訂閱此群組,請傳送電子郵件至 chewing-deve...@googlegroups.com
WS> 如需更多選項,請造訪此群組:http://groups.google.com/group/chewing-devel?hl=zh-TW

Jim Huang

unread,
Aug 17, 2012, 8:34:10 AM8/17/12
to chewin...@googlegroups.com
hi Wei-Hao,

感謝分享與提交實做。附件是針對 libchewing GIT 的 patch (作了些微的縮排語行末空白調整,可 git apply 來測試。

「單一字採用不同拼音方案就變得可能,而且對應表會相對很簡單,像是雄(漢語 xiong2, THL syong2) 輸入 xyong2 或是
siong2 都通,甚至要交互支援威妥瑪也是可行的」聽起來很有趣 :)

Regards,
-jserv

libchewing-THE-pinyin-support.patch

Wei-Hao Syu

unread,
Aug 17, 2012, 8:40:41 AM8/17/12
to chewin...@googlegroups.com
確實找得到,不過或許重新整理一份會比較明確,情況大致是這樣子的:

台灣發展的自動選字的輸入法,通常拼音是被視為一種注音的鍵盤排列,所以會是拼音->注音->選字的形式,新酷音的處理方式是拆開,就像前面的例子黃是 h + uang 得到 ㄏ + ㄨㄤ,gcin 的話,則是 huang = ㄏㄨㄤ,得到注音後就丟去查表。但 gcin 的對應表其實是漢語拼音夾雜通用及注音二式的集合 (這個方向是對的,輸入法讓大家爽爽輸入比綁定某個方案更重要),所以當作測試樣本可能就不太適合,直接找個拼音對照表丟下去給他跑看是不是每個音都跑得出來即可,對照表類似這樣: http://thl.tw/comparison

不過因為牽扯到漢語ㄩ的 u, v 對應 (學: xue/xve),通用的簡寫 (球 ciou/ciu),THL的補充字(柏 bo/buo),所以實際上網路上找得到的對照表雖然大多正確,但是對輸入法的需求來說是不足的,這邊我可以擴充整理一下 (應該會拿 testchewing 小修改之後試跑看效果如何 :p)

jidanni

unread,
Aug 18, 2012, 3:33:21 AM8/18/12
to chewin...@googlegroups.com
若讓學生亂拼,
會害他們一輩子,
故應有嚴拼設定,
不接受所選目前方案非完整之輸入。

Wei-Hao Syu

unread,
Aug 18, 2012, 10:25:16 AM8/18/12
to chewin...@googlegroups.com
就目前的輸入法的情況來看,我會比較傾向廣泛的支援,畢竟輸入法主要的功能是打字而非教學。除了華語外,日語的羅馬字輸入法也有類似的情況,例如"三菱"一般的羅馬字是 mitsubishi (也就是平常看到品牌的寫法),不過 ISO 的標準寫法是 mitubisi 差異在 tsu/tu 跟 shi/si,然而你可以交互輸入無礙。另外像是 ri 跟 li,日語羅馬字只有 ri (念"李"的音),不過在某些輸入法也有支援 li 的輸入,例如"綠"的羅馬字 midori,輸入 midoli 也通。

但我也認同從教學的角度來講,某種程度上的規範學習者依照方案是需要的,所以或許可以用這兩種方法來滿足這個需求:

1. 輸入的部份通通都是綜合,但是組字時會自動顯示出選擇的方案
假設我們在拼音上提供漢語拼音、通用拼音、台灣華語羅馬拼音三種選擇,使用者輸入 chyang2 時,除了主動跳出"強"字外,選漢語的會提示qiang2,選通用的會提示ciang2,選THL的會提示chiang2,亦可同時搭配注音提示。不同選項除了提示不同外,某些字還會有順序差異,例如 si1 在選漢語時思優先順序在西之前,而選 THL 時則變為西在思之前,這邊目前還沒實作不過我會繼續看,因為除了這個需求外,無聲調及模糊拼音也會用到類似的部份,所以值得看下去。

2. 除了綜合的輸入法,亦提供各別方案之子集合
這實作上不困難,只需要分別針對不同拼音方案增加判斷式就可嚴格限定成該拼音方案。不過以漢語、通用、THL這三者來講,通用情況我不清楚在此不論定,THL 在設計時就不考慮教學用 (我們請大家直接學注音),所以會有實際上教學需求、需要另外做子集合的可能只有漢語。因此分成"羅馬拼音"跟"漢語拼音"兩個鍵盤排列就可以了,前者顧名思義是各羅馬拼音之集合(目前的架構甚至連某些耶魯拼音都拼得出來) ,後者則為純漢語拼音,當然一般使用上前者就涵蓋全部了,有嚴格漢語拼音需求的漢語拼音初學者再選後者即可。

On Saturday, August 18, 2012 3:33:21 PM UTC+8, jidanni wrote:
若讓學生亂拼,
會害他們一輩子,
故應有嚴拼設定,
不接受所選目前方案非完整之輸入。

Buganini

unread,
Aug 18, 2012, 11:52:02 AM8/18/12
to chewin...@googlegroups.com
+1

現在打「ㄎㄠˋㄧㄠ」有「哭夭」可以選,感覺好像不太對

2012/8/18 jidanni <jid...@jidanni.org>:
> 若讓學生亂拼,
> 會害他們一輩子,
> 故應有嚴拼設定,
> 不接受所選目前方案非完整之輸入。
>
> --


> 您已訂閱「Google 網上論壇」的「Chewing IM Development」群組,因此我們特別傳送這封郵件通知您。

> 如要在網路上查看這項討論,請造訪
> https://groups.google.com/d/msg/chewing-devel/-/m5VOKRLhKS4J
>
> 如要在此群組張貼留言,請傳送電子郵件至 chewin...@googlegroups.com
> 如要取消訂閱此群組,請傳送電子郵件至 chewing-deve...@googlegroups.com
> 如需更多選項,請造訪此群組:http://groups.google.com/group/chewing-devel?hl=zh-TW

Wei-Hao Syu

unread,
Aug 21, 2012, 1:40:59 PM8/21/12
to chewin...@googlegroups.com
其實這個算是不同階段的議題,不過也是相當值得討論的。基本上在能夠正確的輸入注音後,才會遇到這種選字上的問題,就技術層面來說其實很簡單,甚至可以說幾乎沒有,要關注的點只在如何取捨這部份。

我們都知道語言是會進化的,外來的詞該如何處理,這會是一個問題。例如說"運營"這個日本語跟中式華語詞,而台式華語只有"營運"這種用法,另外就是像"莫札特"這種音譯,該不該放進去呢?這些其實都是可以討論的。(目前新酷音都有這些詞,我認為都該放) 很多字詞可能直覺上會想說,啊非正規用法就不要放,避免誤導,但是再仔細想想,如果是這樣的話那"莫札特"跟"巴哈"都該消滅了,只能存在"莫差爾特"跟"巴赫"。顯然不應該是這樣子,但該怎麼拿捏取捨顯然也是需要花時間去整理的。

回到「哭夭」,問題顯然又更複雜些,這是從台灣福佬語轉到台式華語的外來語,直接拉漢字的話應該會是"ㄎㄨ ㄧㄠ / 哭夭" (不過聽說台灣福佬語正確漢字寫法是哭枵…),如果用同音字音譯的話那會是"ㄎㄠˋㄧㄠ/ 靠腰",這兩者都算廣泛使用,但是該不該、怎麼放進詞庫,都很有討論的空間。

Jim Huang

unread,
Aug 25, 2012, 1:19:58 PM8/25/12
to chewin...@googlegroups.com
hi Wei-Hao, Buganini, jidanni,

感謝三位指出目前新酷音在詞語支援的疑慮,個人想法是我們讓詞庫本身保持一個平衡,也就是說,開發階段尊重語文演化的事實,並採納相關的詞彙,而經由網路統計與人工檢閱的方式,將原本單一詞庫切離成兩個以上的詞庫。這樣我們可透過
subset 的控制,克服詞彙的相容議題。

目前台科大 Rifur 等同學正在進行動態詞庫加載的機制,並預期導入由社群成員分享交流的詞庫匯出、匯入機制。
而成大 Sponge 等同學在進行允許模糊音 / 無調詞彙的輸入機制。
在暑假結束後,我們預期這些開發成果能導入到 libchewing,並且輔助詞彙處理。

回到羅馬拼音,我個人傾向採納 Wei-Hao 的貢獻,但應該提供必要的「容錯」選項 (抱歉,我意思是相容多個拼音系統)。各位覺得如何?

Regards,
-jserv

Kuang-che Wu

unread,
Aug 25, 2012, 3:51:54 PM8/25/12
to chewin...@googlegroups.com
我不是羅馬拼音的使用者,
我認為關於"同時"支援數個羅馬拼音系統, 應該要是可開關的選項(而且可能預設要是關閉)
單一拼音系統的使用者, 並不見得會喜歡容錯.

譬如 chang 在威妥瑪是ㄓㄤ, 在漢語拼音是ㄔㄤ, (在法國遠東學院拼音是ㄕㄤ)
ref. http://zh.wikipedia.org/wiki/%E4%B8%AD%E6%96%87%E6%8B%BC%E9%9F%B3%E5%B0%8D%E7%85%A7%E8%A1%A8
拼音輸入法因為同音字要翻好幾頁來選字已經很惱人了,
若再加上(對特定拼音使用者而言)其他錯誤的字到候選字中, 恐怕更擾人.
> --
> 您已訂閱「Google 網上論壇」的「Chewing IM Development」群組,因此我們特別傳送這封郵件通知您。

Buganini

unread,
Aug 26, 2012, 12:54:58 AM8/26/12
to chewin...@googlegroups.com
+1
只要有選擇的自由,要怎樣弄都可以

2012/8/26 Kuang-che Wu <kc...@csie.org>:

Wei-Hao Syu

unread,
Aug 26, 2012, 2:40:07 AM8/26/12
to chewin...@googlegroups.com
大家放心,最後一定是會讓使用者能夠選擇的(而且不能選我還不知道該怎麼處理…),比較簡單的作法就是使用者選擇不同拼音方案會被當作不同的鍵盤排列,其他細部調整選項另外處理。

之前提到的實作方法的遇到同輸入不同注音時的處理方式可能會像是這樣:
以輸入 chi1 來講,組字時會優先使用選擇的方案 (由於通用和THL不衝突,我就不另外列出)
選漢語: 吃蚩癡痴嗤…七妻欺戚漆…(ㄔ優先於ㄑㄧ) 
選THL: 七妻欺戚漆… 吃蚩癡痴嗤… (ㄑㄧ優先於ㄔ)

以漢語/通用/THL 這三個結構接近的羅馬拼音方案來講只有三個組合有這種情況,之後如果加上注音二式的話也只會再多一組(shi: ㄒㄧ/ㄕ),所以會遇到選字滿出來的機會不太大,就算有遇到也只需要依照使用者選擇的拼音方案來調整優先順序即可。基本上到這裡就涵蓋所有微軟新注音的羅馬拼音類鍵盤排列了。

這樣的模式對原本就熟悉該拼音方案之使用者幾乎是沒影響,也可顧及對該拼音方案不熟之使用者(例如以注音拼音學華語的人因故需要用到羅馬拼音) 輸入上之需求,搭配提示還可以達到教學的效果,例如輸入 hsuan1,選漢語會顯示 xuan1,選 THL 會顯示 syuan1,看久了自然就會背起來了,嘸蝦米就有類似的設定(讓人背二碼簡碼用),其實微軟新注音跟 Mac OS X 上的注音也都有類似的東西,只是他們是放在選字欄裡面…

我正在嘗試實作之前提到處理這塊的兩個方式,弄好之後可能要再麻煩大家看看效果如何、有沒有需要調整的了。

至於威妥瑪的部份倒是比較複雜,例如 chang 張 ch'ang 長,要求輸入 ch'ang 才能得到長似乎有點強人所難,但是 chang 同時對應張長的話優先順序怎麼排,要交錯還是先張後長?這就沒辦法像前述各羅馬拼音方案一樣讓使用者自行選擇優先權了。目前暫時只能把威妥瑪的某些音(例hs- ㄒ-) 當作輔助,如果有明確的好方法可以處理這塊的話,威妥瑪也可以拉出來變成一個選項的。

jidanni

unread,
Aug 26, 2012, 6:13:23 AM8/26/12
to chewin...@googlegroups.com
至於革命性的功能,只要預設關閉。
至於余氏兼信徒,通通抓起來。

WM

unread,
Aug 26, 2012, 1:30:45 PM8/26/12
to chewin...@googlegroups.com
我是許氏鍵盤的信徒,不要影響原本的使用體驗就好。

jidanni於 2012年8月26日星期日UTC-7上午3時13分23秒寫道:
至於革命性的功能,只要預設關閉。
至於余氏兼信徒,通通抓起來。

definite

unread,
Aug 26, 2012, 9:40:12 PM8/26/12
to chewin...@googlegroups.com
Jidanni 說的應該是通用拼音的教主余先生吧

WM於 2012年8月27日星期一UTC+10上午3時30分45秒寫道:

jidanni

unread,
Aug 26, 2012, 9:47:48 PM8/26/12
to chewin...@googlegroups.com

Wei-Hao Syu

unread,
Aug 27, 2012, 12:52:05 AM8/27/12
to chewin...@googlegroups.com
基本上羅馬拼音這塊應該完全不會碰到原有注音拼音各鍵盤排列的部份,除非說像是之後無聲調輸入、模糊拼音 (我後來發現新注音有這功能,讓你可以ㄅㄆ互通之類的…) 這類潛在的功能將來也要適用於注音。不過當然,這些細部微調功能就算加上去也只會是選項,預設應該都是關的。

對了,我補充說一下為什麼我會嘗試「同時支援,但組字時會優先使用選擇的方案」這方法。

直覺來會覺得不同的拼音方案直接用不同的對照表就好,事實上我一開始也是這樣覺得,所以一開始我是想試看看新酷音能不能 "另外加上台灣華語羅馬拼音的對照表"。不過實際看下去發現這並不是一個對照表就能解決的,新酷音的羅馬拼音組字方式是類似注音拼法的聲母加韻母(h + uang = ㄏ + ㄨㄤ) 而非單一對照表(huang = ㄏㄨㄤ),所以原本新酷音的漢語拼音鍵盤排列早就是容許類似 hwang = ㄏ + ㄨㄤ (wang, uang 都能得到王) 這樣的情況發生的。

如果要完全雙向對應,那要嘛就是改成可以吃多個單一對照表,要嘛就是在組字時加上一堆限制性判斷讓他符合規則,兩個都是大工程。因此實作時就乾脆直接依照現狀塞字進去 、順便增補一些在其他漢語拼音輸入法也常見的用法(主要是u, v對應)。後來發現這樣其實也不錯,混搭類似注音組字之模式可以保留不少彈性,反正本來架構就已經是這樣,延用下去可以用最小的改變達到成效,之後只要再依照不同方案 (初期我可能只會實作漢語跟THL) 調整重疊字之優先順序即可。

Jim Huang

unread,
Dec 20, 2012, 3:55:07 PM12/20/12
to chewin...@googlegroups.com
hi,

請問這部份有計劃更新嗎?或許我們來得及在年底前整合進去。

Thanks,
-jserv

Wei-Hao Syu

unread,
Dec 21, 2012, 9:32:01 AM12/21/12
to chewin...@googlegroups.com
持續在看,不過在多對一的時候遇到些問題,主要是組詞的部份。像是 si1gua1 理論上在漢語拼音模式要出現 絲瓜/西瓜,在THL拼音模式下要出現西瓜/絲瓜,所以找詞的地方就變成要多找幾次,而且考慮到預留模糊、無聲調這些的需求,這邊似乎需要不小的工程,還在嘗試中。

至於基本情況不判斷詞只單純加字 (類似目前許氏鍵盤的一些音) 的情況就單純許多,像是 si1 漢語 司私斯..西希溪... THL 西希溪...司私斯.. 但是 si1gua1 在漢語中只會出現絲瓜,THL中只會出現西瓜而已,我應該可以在這幾天整理出來,如果可能的話注音二式拼音也會列入。

Wei-Hao Syu

unread,
Dec 26, 2012, 9:36:00 PM12/26/12
to chewin...@googlegroups.com

patch 大致上完成,主要是 kbtype 新增了 KB_THL_PINYIN (台灣華語羅馬拼音) 跟 KB_MPS2_PINYIN (注音二式),同時修正了 KB_HANYU_PINYIN (漢語拼音) 的一些問題,原來的特性大致上都還是保留了下來。

然後因為有些音有重疊的定義,所以我另外拉了一個 Alt 的系列出來,ZuinData 裡面多了 pho_inx_alt 跟 phoneAlt,ChewingData 多了一個 phoneSeqAlt,原則上就是拼音遇到同輸入不同音時, Alt 就能派上用場了,以 si 來講:

KB_THL_PINYIN:
phone: 0x1c80  (ㄒㄧ)
phoneAlt: 0x2a00 (ㄙ)

KB_HANYU_PINYIN:
phone: 0x2a00 (ㄙ)
phoneAlt: 0x1c80  (ㄒㄧ)

會依照所選的 kbtype 決定順序,當然也有些是共用的,像 lu 不管選哪個 kbtype ㄌㄨ 後面都會加上 ㄌㄩ。至於一般情況,包括所有其他注音排列,phoneAlt 就只是 phone 的複製,例如 ji:

phone:  0x1880 (ㄐㄧ)
phoneAlt: 0x1880

然後在 choice.c  的 SetChoiceInfo() 會看兩個值有沒有相同再決定要不要附加,這個附加跟許氏注音附加音 (例:ㄘ/ㄟ) 的方式類似,只是單純處理單字的情況,並不會影響到組詞的部份。話說回來,其實許氏注音附加音的那塊也可以整合進來… 

附檔一個是 libchewing 的 patch,另外我通常用 ibus 在測試,所以也弄了一個給 ibus-chewing 用的 patch,還請大家多多測試,謝謝。

ibus-chewing-pinyin-update-2012-12-27.patch
libchewing-pinyin-update-2012-12-27.patch

ChangZhuo Chen

unread,
Dec 27, 2012, 9:56:22 AM12/27/12
to chewin...@googlegroups.com

On Thursday, December 27, 2012 10:36:00 AM UTC+8, Wei-Hao Syu wrote:

patch 大致上完成,主要是 kbtype 新增了 KB_THL_PINYIN (台灣華語羅馬拼音) 跟 KB_MPS2_PINYIN (注音二式),同時修正了 KB_HANYU_PINYIN (漢語拼音) 的一些問題,原來的特性大致上都還是保留了下來。


註解的部份看到都是 ?,可以幫忙檢查一下嗎? 

Wei-Hao Syu

unread,
Dec 27, 2012, 10:52:05 AM12/27/12
to chewin...@googlegroups.com
不好意思… 不知道為什麼上傳之後就變成 ??? 了 ^^"
麻煩改成從這個連結下載,謝謝

http://thl.tw/_media/programming/2012-12-27/libchewing-pinyin-update-2012-12-27.patch

Jim Huang

unread,
Dec 28, 2012, 5:22:46 AM12/28/12
to chewin...@googlegroups.com
hi Wei-Hao,

感謝 patch! 我有以下的問題:

在 2012年12月27日上午10:36,Wei-Hao Syu <whsy...@gmail.com> 寫道:
> patch 大致上完成,主要是 kbtype 新增了 KB_THL_PINYIN (台灣華語羅馬拼音) 跟 KB_MPS2_PINYIN
> (注音二式),同時修正了 KB_HANYU_PINYIN (漢語拼音) 的一些問題,原來的特性大致上都還是保留了下來。

既然拼音系統已經大幅擴充,要不我們趁這個機會將 src/hanyupinyin.c 重新命名?
若稱為 src/pinyin.c 適當嗎?

> 然後因為有些音有重疊的定義,所以我另外拉了一個 Alt 的系列出來,ZuinData 裡面多了 pho_inx_alt 跟
> phoneAlt,ChewingData 多了一個 phoneSeqAlt,原則上就是拼音遇到同輸入不同音時, Alt 就能派上用場了,以 si 來講:

[...]


> 然後在 choice.c 的 SetChoiceInfo() 會看兩個值有沒有相同再決定要不要附加,這個附加跟許氏注音附加音 (例:ㄘ/ㄟ)
> 的方式類似,只是單純處理單字的情況,並不會影響到組詞的部份。話說回來,其實許氏注音附加音的那塊也可以整合進來…

src/zuin.c (EndKeyProcess)

u16Pho = UintFromPhoneInx( pZuin->pho_inx );
+ u16PhoAlt = UintFromPhoneInx( pZuin->pho_inx_alt );
+
+ /* no alternative phone, copy from origial as alt*/
+ if ( (u16PhoAlt & 0xFFF8) == 0 ) {
+ u16PhoAlt = u16Pho;
+ }
+
if ( GetCharFirst( pgdata, &tempword, u16Pho ) == 0 ) {
ZuinRemoveAll( pZuin );
return ZUIN_NO_WORD;
}

這裡就是改回同輸入不同音的預設值,是嗎? 0xFFF8 是 magic number 嗎?

另外,能否將程式碼的註解改以英文為主?

Thanks,
-jserv

jid...@jidanni.org

unread,
Dec 28, 2012, 5:32:04 AM12/28/12
to jser...@gmail.com, chewin...@googlegroups.com
>>>>> "JH" == Jim Huang <jser...@gmail.com> writes:

JH> 要不我們趁這個機會將 src/hanyupinyin.c 重新命名?

該重新命名莫非到處 "ZUIN"... ZHUYIN 拜託。
還有不少。

Jim Huang

unread,
Dec 28, 2012, 5:38:52 AM12/28/12
to jid...@jidanni.org, chewin...@googlegroups.com
hi jidanni,

在年底的 release,應該來不及更名 "zuin" 這項「美麗的錯誤」。但可以列入 2013 年的計畫,連同 API 改版一起處理。

jid...@jidanni.org

unread,
Dec 28, 2012, 6:17:24 AM12/28/12
to jser...@gmail.com, chewin...@googlegroups.com
>>>>> "JH" == Jim Huang <jser...@gmail.com> writes:
JH> 在年底的 release,應該來不及更名 "zuin" 這項「美麗的錯誤」。但可以列入 2013 年的計畫,連同 API 改版一起處理。

對呀,有好多同類,小學不如,我不敢看!

Wei-Hao Syu

unread,
Dec 28, 2012, 7:01:53 AM12/28/12
to chewin...@googlegroups.com


On Friday, December 28, 2012 6:22:46 PM UTC+8, jserv wrote:
hi Wei-Hao,

感謝 patch!  我有以下的問題:

在 2012年12月27日上午10:36,Wei-Hao Syu <whsy...@gmail.com> 寫道:
> patch 大致上完成,主要是 kbtype 新增了 KB_THL_PINYIN (台灣華語羅馬拼音) 跟 KB_MPS2_PINYIN
> (注音二式),同時修正了 KB_HANYU_PINYIN (漢語拼音) 的一些問題,原來的特性大致上都還是保留了下來。

既然拼音系統已經大幅擴充,要不我們趁這個機會將 src/hanyupinyin.c 重新命名?
若稱為 src/pinyin.c 適當嗎?

可以的,而且其實對應的表格本來就叫 data/pinyin.tab 了, include/internal/hanyupinyin-private.h 也可以配合改成 pinyin-private.h,然後 function name 看要不要一起動,像是 InitHanyuPinYin() -> InitPinyin(),struct 裡面倒是本來就叫 pinyin 了。
 

> 然後因為有些音有重疊的定義,所以我另外拉了一個 Alt 的系列出來,ZuinData 裡面多了 pho_inx_alt 跟
> phoneAlt,ChewingData 多了一個 phoneSeqAlt,原則上就是拼音遇到同輸入不同音時, Alt 就能派上用場了,以 si 來講:
[...]
> 然後在 choice.c  的 SetChoiceInfo() 會看兩個值有沒有相同再決定要不要附加,這個附加跟許氏注音附加音 (例:ㄘ/ㄟ)
> 的方式類似,只是單純處理單字的情況,並不會影響到組詞的部份。話說回來,其實許氏注音附加音的那塊也可以整合進來…

src/zuin.c (EndKeyProcess)

        u16Pho = UintFromPhoneInx( pZuin->pho_inx );
+       u16PhoAlt = UintFromPhoneInx( pZuin->pho_inx_alt );
+
+       /* no alternative phone, copy from origial as alt*/
+       if ( (u16PhoAlt & 0xFFF8) == 0 ) {
+               u16PhoAlt = u16Pho;
+       }
+
        if ( GetCharFirst( pgdata, &tempword, u16Pho ) == 0 ) {
                ZuinRemoveAll( pZuin );
                return ZUIN_NO_WORD;
        }

這裡就是改回同輸入不同音的預設值,是嗎? 0xFFF8 是 magic number 嗎?

另外,能否將程式碼的註解改以英文為主?

Thanks,
-jserv

這邊是說如果前面 Alt 都沒被設過的話 (也就是一般情況),就直接把預設值複製一份給他,這是方便後續 choice.c 判斷用。
0xFFF8 是去掉聲調部份做比較,uint16_t 的 phone 最後 3bits 是聲調,這段其實也可以直接抓更前面的 pho_inx[ 0..2 ] 來判斷就是…
 
註解的地方我想是 OK 的,不過注音符號的部份可能還是要保留,所以會類似這樣的修改:
/* 威妥瑪拼音特別規則 */    ->   /* special cases for WG */
/* ㄐ/ㄑ/ㄒ 後接 -uan 時,非 ㄨㄢ 而為 ㄩㄢ*/   ->   /* ㄐ/ㄑ/ㄒ + -uan, -uan is ㄩㄢ, not ㄨㄢ  */

Wei-Hao Syu

unread,
Dec 28, 2012, 7:05:14 AM12/28/12
to chewin...@googlegroups.com, jser...@gmail.com
除了 zuin 還有 zhuin,而且有時候還會同時出現 :p

Jim Huang

unread,
Dec 28, 2012, 7:14:51 AM12/28/12
to chewin...@googlegroups.com
在 2012年12月28日下午8:01,Wei-Hao Syu <whsy...@gmail.com> 寫道:
> On Friday, December 28, 2012 6:22:46 PM UTC+8, jserv wrote:
>> 既然拼音系統已經大幅擴充,要不我們趁這個機會將 src/hanyupinyin.c 重新命名?
>> 若稱為 src/pinyin.c 適當嗎?
>
> 可以的,而且其實對應的表格本來就叫 data/pinyin.tab 了, include/internal/hanyupinyin-private.h
> 也可以配合改成 pinyin-private.h,然後 function name 看要不要一起動,像是 InitHanyuPinYin() ->
> InitPinyin(),struct 裡面倒是本來就叫 pinyin 了。

Great!

已更名:

commit ec247444905a00cff0101919f4ed5a7f37d6e26f
Author: Jim Huang <js...@0xlab.org>
Date: Fri Dec 28 20:09:02 2012 +0800

Rename all occurrence of 'hanyupinyin' with 'pinyin' to be more generic

We are going to merge THL-Pinyin (台灣華語羅馬拼音) and MPS2-Pinyin
(注音二式). It should be better to make naming more consistent.

請在這基礎上提交 patch。

Thanks,
-jserv

jid...@jidanni.org

unread,
Dec 28, 2012, 3:06:27 PM12/28/12
to whsy...@gmail.com, chewin...@googlegroups.com, jser...@gmail.com
>>>>> "WS" == Wei-Hao Syu <whsy...@gmail.com> writes:
WS> 除了 zuin 還有 zhuin,而且有時候還會同時出現 :p
祝祝祝
蠻牛跳電篇
http://www.youtube.com/watch?v=bmpTkYS0mkM&list=PL6E40919035151385

Wei-Hao Syu

unread,
Dec 29, 2012, 11:48:27 AM12/29/12
to chewin...@googlegroups.com
patch based on czchen's latest commit:
commit 536c9ab82ce680b1446d4cc612c3e41152c0df69 (Fix memory leak when malloc() fails)

http://admin.thl.tw/_media/programming/2012-12-30/libchewing-pinyin-update-2012-12-30.patch

update:
  write comments in English
  InitHanyuPinYin() ->InitPinyin(), TerminateHanyuPinyin -> TerminatePinyin(),... in pinyin-private.h and pinyin.c
  minor updates of pinyin.c and zuin.c
  

ChangZhuo Chen

unread,
Dec 29, 2012, 1:07:00 PM12/29/12
to chewin...@googlegroups.com
On Sunday, December 30, 2012 12:48:27 AM UTC+8, Wei-Hao Syu wrote:
patch based on czchen's latest commit:
commit 536c9ab82ce680b1446d4cc612c3e41152c0df69 (Fix memory leak when malloc() fails)

http://admin.thl.tw/_media/programming/2012-12-30/libchewing-pinyin-update-2012-12-30.patch


I cannot download the patch, it shows "Unauthorized". Please help to check it, thanks.

Wei-Hao Syu

unread,
Dec 29, 2012, 1:31:33 PM12/29/12
to chewin...@googlegroups.com

Jim Huang

unread,
Dec 30, 2012, 9:06:47 AM12/30/12
to chewin...@googlegroups.com
2012/12/30 Wei-Hao Syu <whsy...@gmail.com>:
Thanks. Your patch have been merged with trivial syntax tweaks.


commit ad9691c2a98d418f51228aeda0a3d9d349ae5bf7
Author: Wei-Hao Syu <whsy...@gmail.com>
Date: Sun Dec 30 18:45:08 2012 +0800

Support THL (Taiwan Huayu Luomapinyin) and MPS2 Pinyin keyboard

THL (Taiwan Huayu Luomapinyin)[*] is derived from Hanyu Pinyin system and
adapted according to the conventions in Taiwan. This patch introduces
two key layouts: THL and MPS2 Pinyin (注音二式). Also, the case when
one key sequence is mapped to several Pinyin representations is
considered. The new-added phoneAlt in struct ZuinData is used for such
purpose.
Reply all
Reply to author
Forward
0 new messages