尝试寻找大字集、无需选字的输入方案

多谢大家的启发,也许问题可以这样调整,分成几种情况:

  • 不依靠候选项顺序,仅通过一个字本身的特征(例如上下左右包围结构、声母韵母声调等)来筛选重码字的话,有哪些输入方案的重码尽可能少。
  • 依靠候选项顺序来筛选重码字,并且设计最初就确定了每组重码字的先后顺序的话,有哪些输入方案的重码尽可能少。
    • 这种情况如果想要不必选字,那么可能有时需要一些死记硬背。不过,它所需要的死记硬背可能通常比没有预定重码字顺序的情况(例如全拼)要少一些。此外,它筛选一个字所需的额外步骤理论上是由设计者统一固定好的。
      • 例如,仓颉添加的字母「X」的数量是设计最初就决定的。而全拼的候选项顺序则没有一个固定的标准。
    • 但是,相对来说,在这种情况下,任何人想要为字集添加新的字时,如果这个新字与其它已有的字重码,那么可能就无法很快决定这个新字应该在这一组重码字当中排在第几位。
  • 也许还有更多可能的情况。

後來我去溫習了一下鄭碼規則,發現還是你說的對,鄭碼的鍵名可能不會有四碼全碼(這跟五筆不一樣),第二主根和副根可以是二碼全碼。它的三碼全碼也不少。

那麼我們如果拿到一個鄭碼官方碼表,就可以對其作不定長的統計。我個人估計它的不定長分布:

一:26
二:200
三:540
四:20200

當然這只是估計,我的預判是,即便鄭碼是一至四碼不定長,那也不會像倉頡那樣匀衡分布,而是97%以上都是四碼。

我們假定鄭碼在一至四碼不定長都匀均分布(當然這不可能),那它也無法做到在26字母內實現有規律的絕對無重。原因是,限長四碼要做到20902字中的每一個字都編唯一的碼,是有點太勉強了。

倉頡不僅是不定長,而且它可以最多五碼,就有了充足的編碼空間。就是這樣,我也是很費勁才完成了它的去重方案。

實際上,嚴格來講,我的js去重小工具,當我把20902字扔進去,出來的還是産生了八個二次重碼。那麼,重碼數量本來就比倉頡要高的鄭碼,編碼空間又這麼小,如何能用一個去重規則,做到在unicode cjk 20902字內絕對無重呢?

我所說的「在unicode cjk 20902字範圍內絕對無重」,後面還加了幾個限制,一是26字母內編碼,二是不能超過原版的編碼長度。

你這樣說的話,那倉頡豈不是可以六碼,七碼?倉頡原本就有很多字是五碼,因此如果這種選重方案到達五碼,是倉頡用戶可以接受的。比如「yrbu亮毫」這組重碼,叫倉頡用戶以「yrbuz」打出「毫」,不會新增甚麼問題。

如果你為了選重,而把鄭碼改成了五碼,五碼仍然做不到,還要加到六碼、七碼。我估計沒有鄭碼用戶願意用這種方式選重。

所以我定的遊戲規則就是在原版的最大碼長範圍之內。若不限碼長的話,連拼音都能做到。

也就是說,如果你認為鄭碼在四碼之內做不到在unicode cjk 20902範圍內絕對無重,在你承認這一點之後,我們再去討論鄭碼的五碼方案。

至於「五碼鄭碼」如何更進一步的消減重碼:比起添加無理的abc後綴,改動編碼規則豈不更有效?

你又擅自更改遊戲規則,你可以先承認鄭碼做不到在26字母內絕對無重,然後我們再討論增加「:;,./」等作編碼的話題。

那為甚麼要定26字母內實現編碼無重呢?這是因為原先的編碼規則正是如此。誰會去用一個編碼中含有「:;.,/」的鄭碼?

如果你一定要用「:;,./」來實現絕對無重,那人們不禁會問:我把:;直接在輸入法的設置裏設成選二三四五六重的功能鍵豈不更好?

我建議你還是再多深入思考一下,鄭碼的絕對無重方案如何實現。

我是沒拿到鄭碼官方碼表,如果你有的話可以上傳一份。

當拿到碼表,在製作去重方案之前,我們需要對此碼表作以下分析:

1.不定長分布
2.重碼情況
3.一字多碼
4.單鍵負載

由於鄭碼在編碼時把26鍵都平等對待,所以鄭碼沒有一個鍵能劃分「去重編碼」跟一般編碼。這跟倉頡不同,倉頡能用一個正則表達式,把所有「去重編碼」挑出來。

在承認鄭碼不能在26字母內實現無重之後,你可以繼續研究27鍵方案。在承認鄭碼不能在四碼內實現無重之後,你可以繼續研究五碼方案。

以我最終製作出「倉頡的unicode cjk 20902絕對無重碼表」的經歷來看,你要實現鄭碼的cjk無重,基本沒有可能。以後如果你有興趣,我可以分享一下我製作「倉頡cjk無重」披荆斬棘的過程。

不認同這種把選重加到編碼方案叫「無重」的,而且也沒必要追求這個,純形碼「日曰」肯定重碼,低重碼就好。

據我所知,你也是鄭碼用戶。

那麼你是否知道「第一主根+第一主根+v+v」這條鄭碼取碼規則呢?比如「拓」,這裏加的vv跟「拓」的字形有何關係呢?

如果「兩個第一主根」不會跟另外的二碼全碼字形成重碼,那可能下一秒所有鄭碼用戶都會打開他的碼表用正則表達式把所有的vv去掉。

也就是說,加vv、加a,就是單純用來避重的。它本身是沒有字形意義的。

五筆的識別碼,也是字根之外另設的一條避重策略。為何有些字需要加識別碼?還不是因為它跟其它字重碼了嗎?

因此,包括鄭碼、五筆在內的很多形碼,都是直接把無意義的避重策略寫進了取碼規則中。

現在說回我做的倉頡無重策略,那「达」為甚麼要加zz?不就是因為它跟「文头」重碼了嗎?跟鄭碼加的「vv」其本質上是一樣的。

當倉頡字元及其取碼規則制定完成的那一刻起,「文头达」就是重碼了,它們就是倉頡規則確立的一組重碼。

倉頡的這個去重策略是可選的,你可以用也可不用。但是鄭碼把加vv寫進取碼規則,你就必須加vv,否則「拓」這樣的字打不出來。

你之所以不同意我的方案叫「無重」,是因為你覺的只有天然無重才是真正的無重。

我已經承認了倉頡做不到天然無重,它為cjk20902字編碼,産生了1524個重碼字。

因此我們現在談的不是「天然無重」的話題,談的是「能否用一套規則,在限定的編碼長度,限定在26字母內,使1524個重碼字也能首碼上屏」的問題。

據我所知,有不少人在追求這個。比如倉頡官方朱邦復。他們為何要設立「前置X」這種去重規則呢?不就是為了在已有的取碼規則之上,再添加一套去重規則以實現絕對無重嗎?那我為甚麼不直接套用朱邦復的「前置X」?不就是因為他其實沒有做到嗎?

任何形碼輸入法,都在想辦法盡可能的減少重碼。為此不惜加入很多無理的規則。如果真要較真的話,那加vv、加a,這些都不能算作是取碼規則。

「日曰」這組還很難說,因為「曰」可以分解為囗一。真正一定重碼的,是這些無法分解的單筆畫字,如「中丨」、「弓乛亅」、「山乚」等。

我只是為倉頡用戶的選重增加了另一種方式,如果有人就是不願意用數字鍵選重呢?

在某些設備上,是沒有數字鍵的,甚至沒有,.;:/鍵。我的手機就是如此。

所以,一套在26字母編碼範圍內,實現絕對無重,是有實際意義的。

你說是選重就是選重,我並不糾結它的名稱。

1 个赞

這就是五筆的避重思路,當一個三碼字跟另一個三碼字重碼時,就要根據它的末筆和結構,在十五個鍵中找到一個鍵來避重,這個就是五筆的識別碼。

可惜五筆還是存在不少重碼。

排序是根據該字的使用頻率,這並不是問題的關鍵。

問題的關鍵在於,是否能把選重規則明確下來,寫成一個js小工具。往後碼表有改動,都可以用此工具快速生成選重的部份。

比如朱邦復的「前置X」就是一種不明確的規則,因為我們不知道它如何解決四重五重。

前面有人以為這很好做,但是當你去做就知道了,規則不夠明確且簡單的話,很難寫成處理文本的js小工具,還會産生大量的二次重碼,然後這些都只能徒手改動。

符合你要求的只有输入 Unicode 码。

如果你原本的需求是快速、准确地输入,那寻找「大字集、无需选字的输入方案」这个方向就搞错了。

世界是个草台搭子,各种输入编码都是包含着不同程度的妥协,不存在完美的输入法。

你要通用性,就用拼音、五笔、手写,要速度,就语音。现在不用在完美的输入方案上面纠结。

我预计,未来的主流输入方式是带大模型的语音输入,或者拼音输入,因为大模型能见你所见,推测你所想,再根据发音纠正,基本上能输你所想。

只要你说的话能让人理解,那大模型就能理解,就一定能快速地转化成正确的文字输出。打败传统输入方式的,真不一定是纯粹的输入编码方案。

声笔现已推出「声笔模组」,和其他方案一样可以在原生 Rime 上使用。

不再需要特定的声笔输入法程序。

现在加入声笔社区或官方下载页获取

因此「声笔需要特定输入法程序才能用」已经成为历史

2 个赞

按規則加後綴和對個別字加後綴還是不一樣的。

不是我個人覺得的問題,而是輸入法領域就是這樣定義的,當年有個「張碼」,GB六千字內七組重,這個可比1524/20902低多了,但人家也沒說無重。

「裏」(U+88CF)和「裏」(U+F9E7)這種呢?「中丨」、「弓乛亅」、「山乚」這些還可以用有意義的雙編碼解決。

「張碼」當年設計也是這個目標,但是人家沒用「無重」這種誤導用語。

非常抱歉,是我用語有誤。經你的提醒,我知道「無重」這個詞是不能隨便用的。我也正在考慮使用更準確的詞語去描述它。

前面有人建議我將其稱作「選重」。我後來想了之後,認為它不是「選重」,因為選重是輸入法軟體的功能。

我說unicode cjk 20902字內編碼無重,是對碼表的描述,每個字都有一個能首字上屏的編碼,並且是套用一套規則自動生成的。沒有超出原版輸入法的編碼規則(26鍵,最長五碼)。

在此我建議我們暫時稱之為「去重」。

能在原來規則限長範圍內去重的,應該只有倉頡能做到,因為倉頡是一至五碼不定長。

鄭碼無法做到在四碼內、26字母內去除所有重碼。五筆也一樣,因為這兩個形碼都是90%以上的字是四碼,如果你們也想做一個「鄭碼去重方案」,那就要在這些四碼重碼中,吃掉它最後一碼,但是不管換上哪些字母,最後都一定會撞車的,因為道路實在是太擁擠了。

你們如果認為鄭碼能做,那就做做看吧。

我是已經做出來了,目前在用,每個字都是首碼上屏,非常舒適方便,再也不用選重了。

4E00-9FA5:這個範圍是unicode cjk 20902字。F9E7在兼容漢字區,也不知道Unicode到底啥意思,同樣的字形,它想兼容甚麼。

中丨、弓乛亅、山乚,等等,這些單筆畫字,倉頡是沒辦法用取碼規則避重的。

能分出以下這幾組的才是真的厲害:

bcsh 朌肦
bice 朘脧
blmo朓脁
bpr 朐胊
buu 朏胐
bytg 朣膧

楼主这是在几个地方同时发了这个提问贴? :rofl:
在 emacs-china 也看到了这个提问贴

按部首分,朌 在月 部,而肦 在肉 部,所以要分编码还是很容易的。

可以,我也是這樣分的。

不同的輸入法有它擅長的領域,比如「德徳」倉頡就沒法避重,但是鄭碼因為有次末碼,所以正好能區分。

為甚麼是當年呢?現在沒有了嗎?他從cjk20902裏面挑了六千字,産生了七組重碼。我可以從cjk20902裏面挑一萬九千字,絕對無重。

倉頡在去重之後,是能做到編碼唯一且快速準確的。

語音永遠做不到輕量,簡單,準確。它雖然快速,但是不準又有何用?並且,語音/拼音的用字範圍非常有限,不符合樓主說的「大字集」。

如果你過份依賴語音,當你在一個公共場所,需要保持安靜的地方,或者你不希望別人知道你的輸入內容,就沒法用語音了。

不是每個人都能出口成章,大部份人在講話前都是先寫稿。

不必神化語音。

還有,碼表都是開放的,衹是作者不太活躍了。

你又來「絕對無重」了,他是基於GB字集內的低重碼,你這一萬九千字估計少了非常多常用字。

沒有可比性,他也少了很多生僻字。我們一般只在相同的編碼範圍去比較。並且,我沒有深入了解它的去重策略,好像說是把二十六鍵都定義為識別碼。雖然重碼少,但是不一定好用。

並且我也沒有說錯,我可以挑出一萬九千字,絕對無重。但是如果是為 unicode cjk 20902字編碼,就會産生1515個重碼,需要用去重策略才能實現「每個字都有唯一編碼」(這其實也是無重,只不過不是用取碼規則實現的無重,而是取碼規則+去重策略才實現的無重)