Jigsaw

Jigsaw

Learn everything, do nothing.

字形入力法の作り方

声明:この記事はソフトウェア開発のチュートリアルではありません。「某狗入力法」や「某度入力法」などの入力ソフトの開発を教えるものではありません。この記事はプログラムコードには触れませんが、アイデアの参考として役立てていただければ幸いです。入力法の先達の方々からのご指導を歓迎します。

もし字形入力法に触れたことがない場合は、北鸮の以下の 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 五筆の例を挙げると、五筆では優先順位に従い、直感的であること筆順に合うこと大きいものを優先すること連続しているものは交差しないこと散らばっているものは連続しないことといういくつかのルールがあります。

まずは大きいものを優先し、筆順に合うことから説明します:

  • 「世」は「一凵𠃊」や「廿𠃊」に分解できますが、後者の最初の字根が前者の最初の字根より大きいため、「廿𠃊」に分解します。
  • 「夷」は「一弓人」や「大弓」に分解できますが、「大弓」の分解方法は筆順に合わず、筆順に合うことが大きいものを優先することよりも重要なので、「一弓人」に分解します。

世夷

「散らばっているものは連続しない」「連続しているものは交差しない」というのは文字通りの意味で、字根が連続していない分解方法が字根が連続している分解方法よりも優先され、字根が連続している分解方法が字根が交差している分解方法よりも優先されます。一部の入力法では、さらに進んで交差しないことを導入し、字根が連続して交差している分解方法が同じ筆画で断たれている分解方法よりも優先されることを指します。これらの 3 つのルールは散連交断と呼ばれます。

直感的であることは理解が難しいですが、五筆ではすでに万能ルールとなっており、著者が何を直感的と認定するかに依存します。例えば、下の図の「或」「戊」の 2 字では、前者は筆順に合わずに「戈口一」に分解でき、後者は筆順に合うように「厂㇂丿丶」に分解しなければなりません。86 五筆の中では、このような問題が頻繁に見られます:なぜ「里」は「日土」に分解されず「甲二」に分解されないのか?なぜ「匹」は「匚儿」に分解されず「兀𠃊」に分解されないのか?

或戊

このような曖昧なルールは決して好ましくありません。現在では、より明確で理にかなったルールを使用することが推奨されています。例えば、「匹」の分解ルールは構造が完全であること(「囗日目勹冂匚コ凵」など、全包囲および半包囲構造の字根は分解しない)を導入することで説明できます。また、原形字根(ある字根の縦筆が偏旁として使われる際に撇に変わる場合や、横筆が偏旁として使われる際に提に変わる場合、それを優先度の低い変形字根と見なす)ルールを導入することで、いくつかの分解の曖昧さを説明することもできます。

ただし、分解ルールは細かくしすぎる必要はありません。例えば、张码は重複を減らすためにルールを非常に複雑にしており、ユーザーにとっては困難です。倉頡の分解方法は、入力法界で独自のものです。入力法の作者は、分解の唯一性を保証しつつ、最も理解しやすいルールを策定して、ユーザーの心的負担を軽減するべきです。

倉頡分解一観倉頡分解一観、ウィキペディアの倉頡教科書からの引用

一般的に使用される 3500 字(一般規範漢字表の第 1 級字)を分解した後、私たちは使用可能な分解表を得ることができます。

字根の増減#

五筆の作者である王永民氏は、「一般的に、26 キーを使用する拼形方案では、150~250 個の字根を選択するのが適切です」と述べています。現在、大多数の新しい入力法の字根は統合され、この範疇に属しています。これは統計学の原理に合致しています。

四码方案では、単字のコード化に参加する字根は通常、最初の 3 つと最後の 1 つだけであり、中間の字根は実際には役に立たないと言えます。もしある字根がこれまでにコード化に参加したことがない場合、その字根を直接削除できます;もし複数の字の最初と最後の字根が同じである場合(例えば「赢嬴贏」)、異なる根を取得するために字根を追加することを検討する必要があります。重複コードを分解の段階で排除するためです。

分解段階で定量分析を行うための理論的根拠についてもっと知りたい場合は、蓝落萧の文章分解表の定量評価を参照してください。


ここで蓝落萧の宣伝もします:形码の制作に興味がある方は、ここまで読んでもまだ理解できない場合、蓝落萧が開発を主導した漢字自動分解システムの使用を検討してください(登録機能は無視してください、サンプルを選択すればメイン画面に入れます)。全て UI 操作で、敷居はありません。

漢字自動分解システム

コード化方式#

字根のコード化#

字根をコード化することは、単字のコード化の前提です。字根のコード化には一定の規則があり、例えば五筆では QWERTY キーボード上で最初の 2 筆を分け、郑码では最初の 2 筆がアルファベットの順序に対応し、倉頡では「日月金木水火土」がアルファベットの順序に対応し、形码では字根の形状がアルファベットに対応します。これらの字形の特徴を用いて字根を規則的にコード化する方法を形托と呼びます。音码と形码があるように、字根のコード化にも音托と形托があり、小鹤音形は音托を採用しています。

また、より良い性能指標を求めるために、完全に無規則(以下、乱序と呼ぶ)な方法で字根をコード化する入力法もあります。例えば、蓝宝石入力法です。

字根のコード化方式は多様で、以下に直接列挙します:

  • 単一コード、五筆を代表とし、各字根は 1 つのアルファベットで表されます。例えば「十二」のコードはすべて F、「五一」のコードはすべて G です。
  • 二重コード、ほとんどの字根は 2 つのアルファベットで表され、大コードと小コードと呼ばれます。
    • 小コード形托、郑码を代表とし、小コードは漢字の字形に関連しています。例えば「耳」の小コードは E で、その構造に「十」が含まれています。
    • 小コード音托、小コードは漢字の読み音に関連しています。例えば徐码では「自」の小コードは Z で、漢語拼音は zi です。音托を採用することで記憶量を軽減し、二重コードの字根の記憶難易度を単一コードに近づけることができます。
  • 三重コード以上…… 実際、字根のコード化はどれだけ長くても構いませんが、ユーザーが字根のコードすら覚えられない場合、その後の単字コード化は言うまでもありません。

単字コード化#

まず、1 つの字にどれだけの字根がコード化に参加するかを決定する必要があります。この記事では、主流の形码の取り方を採用します。すなわち、前述の最初の 3 つと最後の 1 つです。字根が 4 つ未満の場合はどうしますか?漢字の他の字形の特徴を用いて補完する必要があります。五筆では字根の筆画や漢字の構造を用い、郑码では字根の小コードを用います;もちろん、漢字の読み音を用いて補完することもできますが、その場合は形音码になります。

例えば「呗员」「吧邑」のように、2 つの字根が全く同じ字の場合、構造コードを使用して区別する必要があります。上下構造には B を補い、左右構造には N を補います。しかし、構造コードの導入はユーザーに新たな記憶ポイントをもたらします。この時、二重コードの字根が役立ちます —— 使用頻度の低い字のコードの後に最初の字根の小コードを補うことで、両者のコードを分離することができます。

仮にある漢字がいくつかの字根に分解でき、各字根にコードがあるとします。その場合、そのコードは大文字のラテンアルファベット ABCD...WXYZ で番号付けされます。特に、Y と Z は倒数第二、第一根を強調するために使用されます。字根の筆画は小文字のギリシャ文字 αβ...ω を使用します。特に、ω は倒数第一筆画を強調するために使用されます。Ω は字形構造コードを表します。

したがって、五筆のコード表は次のようになります:

  • 単根字
    • 代表字根 AAAA
    • 非代表字根 Aαβω
  • 多根字
    • 二根字 AZΩ
    • 三根字 ABZΩ
    • 四根以上の字 ABCZ

入力法のコード化方式についてもっと知りたい場合は、朱宇浩の文章一般的な形码入力方案のコード化ルールを参照してください。

語句コード化(オプション)#

単字だけを打ちたくない場合、語句コード化は必須です。幸いなことに、現在の入力法界には公認の語句コード化方式があり、新しい方式を考える必要はありません。字根が単字を構成するのと同様に、単字が語句を構成するため、語句のコード化方式は単字に似ています:

各字にはコードがあり、そのコードは大文字のラテンアルファベット ABCD...WXYZ で番号付けされます。特に、Y と Z は倒数第二、第一根を強調するために使用されます。字の第二コードは対応する小文字のラテンアルファベット abcd...wxyz で番号付けされます。

したがって、形码の語句コード化表は次のようになります:

  • 二字 AaBb
  • 三字語 ABCc
  • 四字以上の語 ABCZ

性能調整#

性能指標#

世間では五筆の作者王永民氏の別の言葉が伝わっています:「高水準の “形码” 方案は、以上の相容、規則、調和の 3 つの特性を同時に備えなければなりません。」相容とは、重複コードが少ないことを指します;規則とは、学びやすいことを指します;調和とは、手触りが良いことを指します —— この 3 つは同時に得られません。多くの場合、入力法は一つの利点を放棄して他の利点を得ることになります。例えば、現在流行している乱序入力法(虎码、蓝宝石、逸码)は、他の 2 つを向上させるために規則を放棄したものであり、私が使用している徐码は大字集の相容を求めるために調和を大きく放棄しています。

  • 静的重複コード数:すべてのコードを遍歴し、出力される漢字集合のサイズは 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}).$

これらの性能指標を計算することができない場合は、オンラインの虎码測評網を使用することもできます。

虎码測評網

簡略化と全体化#

五筆の単字コードと語句コードの長さはどちらも 3 を超えています。これは、設計時に簡略化のためのスペースを残しているからです。簡略化とは、より短いコードを指します ——「的」の五筆コードは rqyy ですが、実際には r を打ってスペースを押すだけで「的」を表示できます。このように、前の 1 コードだけを保持する簡略化を一次簡略化(略して一简)と呼び、これを基に二简、三简があります。

簡略化は入力効率を向上させる最も簡単な方法です。最も一般的な前 26 字の頻度の合計は 0.26 であり、すべての単字のコードが 4 コードであれば、ちょうど一次簡略化を出すことで平均コード長を 0.5 短縮できます;最も一般的な前 27-702 字の頻度の合計は 0.57 であり、つまり一次および二次簡略化を出すことで平均コード長を 1.09 短縮できることを意味します。タイピング速度は = キー数 / コード長ですので、理想的な状態で一次および二次簡略化を出すと、タイピング速度が三分の一向上します。

簡略化の利点はこれだけではありません。簡略化に対して、単字の元のコードは全コードと呼ばれます。すでに簡略化されたコード位置に最も頻度の高い字が出ているので、字頻が 2 番目の字が自然にその位置を占めることができます。このような方法を全体化と呼び、すでに簡略化された字の全コード位置を譲ることを意味します。こうすることで、元の重複を排除でき、たとえ三简でコード長の利益がなくても、重複を減らすために使用できます。

これほど多くの利点がある一方で、代償は何でしょうか?簡略化は実際には無理なコードであり、出すほどユーザーの記憶負担が重くなります。一度覚えられなくなると、候補ボックスを見て時間を無駄にすることになり、逆にキー数が減り、得られない結果となります。推奨は一次簡略化だけを出し、二次簡略化はユーザーに設定させるか、簡略化だけを出して全体化を許可しないことです。三次簡略化は設けないことをお勧めします。

全体最適化#

全体最適化は一般的にシミュレーテッドアニーリングアルゴリズムを使用します。プログラムについてはシミュレーテッドアニーリングアルゴリズムの原理と応用入力法の最適化、字頻、語頻統計アルゴリズムのソースコード共有宇浩入力法開発技術文書を参照してください。この記事ではこれ以上は述べません。

アニーリングアルゴリズムの原理は確率に衝突することなので、いくつかの制約条件(同じキー位置の字根と必ず同じキー位置の字根が存在しないなど)を設定することで、無駄な字根の配置を効果的に減らし、アルゴリズムの効率を向上させることができます。制約条件を設定する際には、先人の知恵を多く取り入れることができます。例えば、三徐を設計する前、なぜ規則的な二重コード形码は常に大コードの下に 2 つの小コードの固定不規則な主根を設定する必要があるのか不思議でした。しかし、自分で最適化に取り組んでみて、2 つの主根を出さなければ重複が必然的に増加することに気づきました。

結び#

あなたの入力法が完成した際には、愛好者たちが使用できるようにコード表をエクスポートすることを忘れないでください:ほとんどの入力プラットフォームがサポートするコード表形式は、各行が 字\tab编码 です。少数の入力プラットフォームでは逆になります。自分の入力法に自信がある場合は、五筆の掲示板に投稿して宣伝してください。入力法はコミュニティのサポートなしには成り立ちません。ユーザーがいれば、フィードバックに基づいて調整し、入力法をより完璧にすることができます。

もちろん、暗号学には「自分で暗号アルゴリズムを設計しないこと」という古い言葉がありますが、私は入力法も同様だと思います。本当に設計したい場合は、市場に自分のニーズに合った入力法がないか探してみるのも良いでしょう。既存のものを使う方が常に簡単です。

雑談:入力法を選ぶ哲学#

現在、Unicode 漢字は約 10 万字収録されており、電子デバイスにフォントをインストールすれば 10 万字の漢字を表示できるようになります。今後も増え続けることが予想されます(CJK-J 区には新たに 4000 字以上が収録されました)。これらの漢字の中には、すべての漢字の読み音が現在まで伝わっているわけではありません;また、読み音があっても辞書を調べなければ基本的にどう読むかわからない字もあります —— これらの字を打つためには形码を使用する必要があります。以上のことから、大字集は重要でしょうか?それとも重要ではないでしょうか。たとえあなたの名前に珍しい字が含まれていても、その字をコード表に追加すればよく、全字集を打てる入力法を探す必要はありません。私個人としては、大字集を分解することが漢字愛好者としての楽しみであり、必須ではありません。

タイピング速度は重要ですか?もちろん重要ですが、自分に練習する意志があるか考えてみてください。タイピング速度の木桶効果は非常に明確であり、入力法の性能はその中で最も長い板です。タイピング速度を向上させるためには、どの入力法を使用しても、長時間の練習が必要です。性能の良い入力法を選んだからといってすべてがうまくいくわけではありません。速度の達人は、より良い入力法を選んだから達人になったのではなく、速度の達人がさらなる向上のためにより良い入力法を発明したのです。もしあなたが水文生稿の単字百速にも達していないなら、入力法の性能について語ることはできません。

簡繁通打は重要ですか?もちろん重要ではありません。少数のニーズの中の少数のニーズです。主に OpenCC の変換に不足があり、一部の異体字は変換する必要がありません:例えば「羣」、私は左右構造の「群」が電子デバイス上での表示効果が良いと考えています。

結局、形码は重要ですか?実際にはそれほど重要ではありません。双拼の学習コストは低く、全拼のコード長を短縮するのは即効性があります。入力法は文字を入力するために存在し、文字が担う知識こそが人類の天への階段です

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。