声明:この記事はソフトウェア開発のチュートリアルではありません。「某狗入力法」や「某度入力法」などの入力ソフトの開発を教えるものではありません。この記事はプログラムコードには触れません。あくまで思考のきっかけとしての役割を果たしますので、入力法の先達の皆様からの指導を歓迎します。
もし字形入力法に触れたことがない場合は、北鸮の以下の 2 つの記事を先に読むことをお勧めします:七種類の形码入力法を試した後、2022 年に五筆を使うことについて話したい、タイピングをより快適にするために、極限の性能を追求したマイナーな入力法を学びました。この記事の前書きでも簡単に紹介していますので、分からないことがあればコメントしてください。追加情報を提供します。
私について:チャットやタイピングには星空鍵道を使用し、書面でのタイピングには三徐(自用徐码の改版)を使用しています。タイピング速度は 1 分間に 60 字です。以前は小鹤音形、倉頡五代、虎码を少し学びましたが、ニーズの違いから放棄しました。
前書き#
漢字入力法の定義#
実はとても簡単です:入力コードを与え、漢字の集合を出力する関数が漢字入力法です。
仮に $Z$ を $n$ 個の漢字の集合、$C$ を $l$ 個の $Z$ の部分集合の集合、$c_i$ を $C$ の第 $i$ 個の要素、$M$ を $l$ 個のコードの集合、$f: M \rightarrow C$ が入力法です。
現在、簡体字を使用する地域のほとんどの人々は、漢語拼音入力法を使用しています —— 漢語拼音を入力し、漢字を出力します。一部の人々は五筆字型入力法を使用しています ——A から Y までの構成で、長さが 4 未満のコードを入力し、漢字を出力します。
伝統的な漢字使用地域には、倉頡入力法もあります —— アルファベットで構成され、長さが 5 未満のコードを入力し、漢字を出力します;注音入力法 —— キーボード上のほとんどの記号で構成されたコードを入力し、漢字を出力します。
実際、Unicode コードを使用してタイピングすることも一種の入力法と見なすことができます。
字形入力法と字音入力法#
上記で言及した漢語拼音や注音は、漢字の読みを使用してコード化する字音入力法(以下、音码と呼ぶ)に属します;五筆や倉頡は、漢字の字形を使用してコード化する字形入力法(以下、形码と呼ぶ)に属します;小鹤音形のコード方式は、まず字音を使用し、その後字形を使用するため、音形码に分類されます。
現在、大規模な語彙を搭載した音码は日常的なタイピングのニーズを満たすことができるようになりましたが、形码は重複コードが少なく、読み音に依存しない特性から、依然として使用価値があります。そのため、愛好者たちは新しい形码の開発を続けています。
字根と分解#
字根#
字根は形码の字を分解する基本的な形状単位です。これは私たちが小学校で学んだ偏旁や部首などの概念に似ていますが、字根の範囲は偏旁や部首よりも広いことが多いです。
例えば、86 版五筆入力法には 234 個の字根があり、「王」「土」「日」は私たちがよく知っている偏旁ですが、「炙」の上半分や「互」の中間部分は少し馴染みがありません。
いくつかの形码では、構造が複雑な漢字も字根として設定され、ユーザーの字分解の負担を軽減することがあります。例えば、徐码では「爾」「鹵」「黽」が字根です。
字の分解#
字の分解とは、設定された字根を使用して漢字を分解することです。これは実際に私たちが小学校で経験した内容でもあります —— 新しい漢字を学ぶ際、国語の先生はそれが以前学んだ字から構成されていることを教えてくれました。
構造が単純な字の分解方法については、皆さん特に異論はないでしょう:「叶」は自然に「口」と「十」に分解され、「音」は自然に「立」と「日」に分解されます。しかし、字の構造が少し複雑になると難しくなります:「戊」は「戈丿」に分解するのか、それとも「厂㇂丿丶」に分解するのか?この時、複数の分解方法が存在しないように分解方法を制限するルールを導入する必要があります。
再び 86 五筆を例に挙げます:五筆では優先順位に従って直感的な配慮、筆順に合致、大きいものを優先、連続可能で交差しない、散らばっているものは連続しないといういくつかのルールがあります。
まず、大きいものを優先し、筆順に合致することから説明します:
- 「世」は「一凵𠃊」や「廿𠃊」に分解できます。後者の最初の字根は前者の最初の字根より大きいため、「廿𠃊」に分解します。
- 「夷」は「一弓人」と「大弓」に分解できますが、「大弓」の分解方法は筆順に合致せず、筆順に合致することが大きいものを優先することよりも重要なので、「一弓人」に分解します。
「散らばっているものは連続しない」「連続するものは交差しない」というのは文字通りの意味で、字根が連続しない分解方法が字根が連続する分解方法よりも優先され、字根が連続する分解方法が字根が交差する分解方法よりも優先されます。一部の入力法では、さらに進んで交差しないというルールを導入し、字根が連続して交差する分解方法が同じ筆画で断ち切る分解方法よりも優先されます。これらの三つのルールは散連交断と呼ばれます。
直感的な配慮は理解が難しいですが、五筆では万能ルールとなっており、作者が何を直感的と認定するかに依存します。例えば、下の図の「或」「戊」の二字では、前者は筆順に合致しない「戈口一」に分解できるのに対し、後者は筆順に合致して「厂㇂丿丶」に分解しなければなりません。86 五筆の中では、このような問題が頻繁に発生します:なぜ「里」は「日土」に分解されず「甲二」に分解されるのか?なぜ「匹」は「匚儿」に分解されず「兀𠃊」に分解されるのか?
このような曖昧なルールは決して許されるものではありません。現在では、より明確で理にかなったルールを使用することが推奨されています。例えば、「匹」の分解ルールは構造が完全である(「囗日目勹冂匚コ凵」など、全包囲や半包囲構造の字根は分解しない)を導入することで説明できます。また、原形字根(もし字根の縦筆が偏旁として使用される際に撇に変わったり、横筆が偏旁として使用される際に提に変わった場合、優先度が低い変形字根と見なす)ルールを導入することで、いくつかの分解の曖昧さを説明することもできます。
ただし、分解ルールは細かすぎる必要はありません。例えば、张码は重複を減らすためにルールを非常に複雑にしており、ユーザーにとっては困難です;倉頡の分解方法は、コード界で独自の地位を築いています。入力法の作者は、分解の唯一性を保証する前提で、最も理解しやすいルールを制定し、ユーザーの心的負担を軽減するべきです。
倉頡分解一観、ウィキペディアの倉頡教科書からの抜粋
一般的に使用される 3500 字(一般規範漢字表の第 1 級字)を分解した後、私たちは使用可能な分解表を得ることができます。
字根の増減#
五筆の作者である王永民氏は、「一般的に、26 キーを使用する拼形方案では、150~250 個の字根を選択するのが適切です」と述べています。現在、多くの新しい入力法の字根は統合され、この範疇に属しています。これは統計学の原理に合致しています。
四码方案では、単字のコード化に参加する字根の数は通常、最初の三根と最後の根だけです。つまり、中間の字根は実際には無用です。もしある字根が一度もコード化に参加していない場合、その根を直接削除することができます;もし複数の字の最初の三根と最後の一字根が同じである場合(例えば「赢嬴贏」)、異なる根を取得するために字根を増やすことを考慮する必要があります。重複を分解の段階で抑えるためです。
分解段階で定量分析を行うための理論的根拠についてもっと知りたい場合は、蓝落萧の記事分解表の定量評価を参考にしてください。
ここで蓝落萧の宣伝もします:形码の制作に興味がある方は、ここまで読んでもまだ理解できない場合、蓝落萧が開発を主導した漢字自動分解システムを使用することを検討してください(登録機能は無視し、サンプルを選択すればメイン画面に入れます)。全て UI 操作でハードルはありません。
コード化方式#
字根コード化#
字根をコード化することは、単字コード化の前提です。字根コード化には一般的に一定の規則があります。例えば、五筆は QWERTY キーボード上で最初の二筆を分区し、郑码は最初の二筆に対応するアルファベットの順序を使用し、倉頡は「日月金木水火土」に対応するアルファベットの順序を使用し、表形码は字根の形状に対応するアルファベットを使用します。これらは字形の特徴を用いて字根を規則的にコード化する方法を形托と呼びます。音码と形码があるように、字根コード化にも音托と形托があり、小鹤音形は音托を採用しています。
また、より良い性能指標を求めるために、完全に無規則(以下、乱序と呼ぶ)な方法で字根をコード化する入力法もあります。例えば、蓝宝石入力法です。
字根のコード化方式は多様で、以下に直接列挙します:
- 単一コード、五筆を代表とし、各字根は一つのアルファベットで表されます。例えば「十二」のコードはすべて F、「五一」のコードはすべて G です。
- 二重コード、ほとんどの字根は二つのアルファベットで表され、大コードと小コードと呼ばれます。
-
- 小コード形托、郑码を代表とし、小コードは漢字の字形に関連しています。例えば「耳」の小コードは E で、その構造に「十」が含まれています。
-
- 小コード音托、小コードは漢字の読み音に関連しています。例えば、徐码では「自」の小コードは Z で、その漢語拼音は zi です。音托を採用することで記憶量を軽減し、二重コード字根の記憶難易度を単一コードに近づけることができます。
- 三重コード以上…… 実際、字根コード化はどれだけ長くても可能ですが、ユーザーが字根のコードすら覚えられない場合、その後の単字コード化は言うまでもありません。
単字コード化#
まず、どの字がいくつの字根でコード化されるかを決定する必要があります。この記事では、主流の形码の取り方を採用し、前述の最初の三根と最後の一根を使用します。字根が四つ未満の場合はどうしますか?漢字の他の字形特徴を用いて補足コードを使用する必要があります。五筆では字根の筆画や漢字の構造を使用し、郑码では字根の小コードを使用します;もちろん、漢字の読み音を用いて補足コードを使用することもできますが、その場合は形音码になります。
例えば「呗员」「吧邑」のように、二つの字根が全く同じ字の場合、構造コードを使用して区別する必要があります。上下構造の場合は B を補い、左右構造の場合は N を補います。しかし、構造コードの導入はユーザーに新たな記憶点をもたらします。この時、二重コード字根が役立ちます —— 使用頻度の低い字のコードの後に最初の字根の小コードを補うことで、二者のコードを分離することができます。
仮に漢字がいくつかの字根に分解でき、各字根にコードがあるとします。その場合、そのコードは大文字のラテンアルファベット ABCD...WXYZ で番号付けされます。特に、Y と Z は倒数第二、第一根を強調するために使用されます。字根の筆画は小文字のギリシャ文字 αβ...ω を使用します。特に、ω は倒数第一筆画を強調するために使用されます。Ω は字形構造コードを示します。
したがって、五筆のコード表は次のようになります:
- 単根字
- 代表字根 AAAA
- 非代表字根 Aαβω
- 多根字
- 二根字 AZΩ
- 三根字 ABZΩ
- 四根以上の字 ABCZ
入力法のコード化方式についてもっと知りたい場合は、朱宇浩の記事一般的な形码入力方案のコード化ルールを参考にしてください。
語句コード化(オプション)#
単字だけを打ちたくない場合、語句コード化は不可欠です。幸いなことに、現在の入力法界には公認の語句コード化方式があり、新しい方式を考える必要はありません。字根が単字を構成するのと同様に、単字が語句を構成するため、語句のコード化方式は単字に似ています:
各字にはコードがあり、そのコードは大文字のラテンアルファベット ABCD...WXYZ で番号付けされます。特に、Y と Z は倒数第二、第一根を強調するために使用されます。字の第二コードは対応する小文字のラテンアルファベット abcd...wxyz で番号付けされます。
したがって、形码の語句コード化表は次のようになります:
- 二字 AaBb
- 三字語 ABCc
- 四字以上の語 ABCZ
性能調整#
性能指標#
世間には五筆の作者王永民氏の別の言葉が伝わっています:「高水準の「形码」方案は、相容、規則、調和の三つの特性を同時に備えている必要があります。」相容とは、重複コードが少ないことを意味します;規則とは、学びやすいことを意味します;調和とは、手触りが良いことを意味します —— この三者は同時に得ることはできません。多くの場合、入力法は一つの利点を放棄して他の利点を得ることになります。例えば、現在流行している乱序入力法(虎码、蓝宝石、逸码)は、規則を放棄して他の二つを向上させていますが、私が使用している徐码は大字集の相容性を求めるために調和を大きく放棄しています。
- 静的重複数:すべてのコードを遍歴し、出力される漢字集合のサイズは 2 の部分集合の総和であり、相容性を反映します。
- 動的重複率:出力される漢字集合を字頻でソートし、最初の要素を削除し、残りの要素の字頻の総和を求め、相容性を反映します。
- 平均コード長:コードの長さに漢字の字頻の総和を掛け算します。特に、非選択字のコード長は 1 加算され、動的重複率と正の相関があります。1 分間の入力字数 = 1 分間のキー数 / 平均コード長。
- 速度当量:200 万以上の実験データから統計分析された連続キー位置の快適度についての詳細は、論文キー位置関連速度当量の研究を参照してください。調和性を反映します。
- 両手交互打鍵率:すべての左右手交互打鍵のコードを入力し、出力字集内の字頻の総和を求め、調和性を反映します。
前書きでの入力法の数学的定義を覚えていますか?これを基に、上記の指標の数学的定義を導き出すことができます。
仮定 $p: Z \rightarrow [0.1]$ は、あるテキスト状態における単字の頻度のマッピングであり、字頻に基づいて $C$ の各字集をソートします。$c_{ij}$ は、コードが $m_i$ である第 $j$ の漢字であり、$i \in I$, $j \in J_i$ で、$a\geq b$ の場合、$p (c_{ia})\geq p (c_{ib})$ となります。
- 静的重複数:$N_{s} = \mid {c_{ia}, c_{ib} \text { for all } a,b \in J_i \text { and } i \in I }.$
- 動的重複率:$N_{d} = \sum\limits_{i \in I, j \in J_i/{1}} p (c_{ij}).$
これらの性能指標の計算が分からない場合は、オンラインの虎码評価サイトを利用できます。
簡略化と全体化#
五筆の単字コードと語句コードの長さはどちらも三以上です。これは、設計時に簡略化のためのスペースが残されているからです。簡略化とは、より短いコードを指します ——「的」の五筆コードは rqyy ですが、実際には r を打ってスペースを押すだけで「的」を表示できます。このように、前のコードの一部を保持する簡略化を第一簡略化(略して一简)と呼び、これに続くものは二简、三简と呼ばれます。
簡略化は入力効率を向上させる最も簡単な方法です。最も一般的な 26 字の頻度の合計は 0.26 であり、すべての単字のコードが四码であれば、ちょうど一简を出すことで平均コード長を 0.5 短縮できます;最も一般的な 27-702 字の頻度の合計は 0.57 であり、つまり一二简を出すことで平均コード長を 1.09 短縮できるということです。私たちは、タイピング速度 = キー数 / コード長であることを知っていますので、理想的な状態で一二简を出すと、タイピング速度が三分の一向上します。
簡略化の利点はこれだけではありません。簡略化に対して、単字の元のコードは全コードと呼ばれます。既に簡略化された字の全コード位置で最も頻度の高い字が簡略化されているので、字頻が第二位の字が自然にその位置を占めることになります。このような方法を全体化と呼び、既に簡略化された字の全コード位置を空けることを意味します。こうすることで、元の重複を排除でき、たとえ三简でコード長の利益がなくても、重複を減らすために使用できます。
これほどの利点がある一方で、代償は何でしょうか?簡略化は実際には無理なコードであり、出すほどにユーザーの記憶負担が重くなります。一度記憶できなくなると、候補ボックスを見て時間を無駄にすることになり、逆にキー数が減少し、得られるものが少なくなります。推奨されるのは一简だけで、二简はユーザー自身に設定させるか、簡略化のみを出して全体化を許可しないことです。三简は設定しない方が良いでしょう。
全体最適化#
全体最適化は一般的にシミュレーテッドアニーリングアルゴリズムを使用します。プログラムについてはシミュレーテッドアニーリングアルゴリズムの原理と応用、入力法の最適化、字頻、語頻統計アルゴリズムのソースコード共有、宇浩入力法開発技術文書を参照してください。この記事では多くを語りません。
シミュレーテッドアニーリングアルゴリズムの原理は確率を衝突させることなので、いくつかの制約条件(同じキー位置の字根と必ず同じキー位置の字根が存在しないなど)を設定することで、無用な字根の配置を効果的に減少させ、アルゴリズムの効率を向上させることができます。制約条件を設定する際には、先人の知恵を多く取り入れることができます。例えば、三徐を設計する前、なぜ規則的な二重コード形码は必ず一つの大コードの下に二つの小コードの固定不規則な主根を設定する必要があるのか不思議に思っていました。しかし、自分で最適化を始めてみると、二つの主根を出さなければ重複が必然的に増加することが分かりました。
結び#
あなたの入力法が完成した際には、愛好者たちが使用できるようにコード表をエクスポートすることを忘れないでください:ほとんどの入力プラットフォームがサポートするコード表形式は、各行が 字\tab编码
となっており、一部の入力プラットフォームは逆になっています。自分の入力法に自信がある場合は、五筆バでスレッドを立てて宣伝してください。入力法はコミュニティの支援なしには成り立ちません。ユーザーがいれば、フィードバックに基づいて調整し、入力法をより完璧にすることができます。
もちろん、暗号学には「自分で暗号アルゴリズムを設計しないこと」という古い言葉がありますが、私は入力法も同様だと思います。本当に設計したい場合は、市場に自分のニーズに合った入力法がないかを探してみると良いでしょう。既存のものを使う方が常に簡単です。
雑談:入力法選択の哲学#
現在、Unicode 漢字は約 10 万字収録されており、電子デバイスにフォントをインストールすれば 10 万字の漢字を表示できるようになります。今後も増え続けると予想されています(CJK-J 区では新たに 4000 字以上が収録されました)。これらの漢字の中には、現在まで伝わっている読み音がない漢字もあります;また、読み音があっても辞書を調べないと基本的にどう読むか分からない漢字もあります —— これらの字を打つためには形码を使用する必要があります。以上のことから、大字集は重要でしょうか?それとも重要ではないでしょうか。たとえあなたの名前に珍しい字が含まれていても、その字をコード表に追加すれば良いだけで、全字集を打てる入力法を探す必要はありません。私個人としては、大字集を分解することは漢字愛好者としての楽しみであり、必需品ではありません。
タイピング速度は重要ですか?もちろん重要ですが、自分に練習する意志があるか考えてみてください。タイピング速度の木桶効果は非常に明確であり、入力法の性能はその中で最も長い板です。タイピング速度を向上させたいのであれば、どの入力法を使用しても、長時間の練習が必要です。性能の良い入力法を選んだからといってすべてがうまくいくわけではありません。速度の達人は、より良い入力法を選んだから達人になったのではなく、速度の達人がさらなる向上のためにより良い入力法を発明したのです。もしあなたが水文生稿の単字百速に達していないのであれば、入力法の性能について語ることはできません。
簡繁通打は重要ですか?もちろん重要ではありません。少数のニーズの中の少数のニーズです。主に OpenCC の変換に不足があり、一部の異体字は変換する必要がありません:例えば「羣」、私は左右構造の「群」が電子デバイス上での表示効果がより良いと考えています。
結局、形码は重要ですか?実際にはそれほど重要ではありません。双拼の学習コストは低く、全拼のコード長を減少させる効果は即座に現れます。入力法は文字を入力するために存在し、文字が担う知識こそが人類の天への階段です。