Posts List

Kanzenという日本語入力の方式を再実装してみた Part.2

盆の前後が台風という、なかなかな感じですが、元気にやっていきたいところですね。 前回に引き続き、chokanについて書いていきます。今回は辞書で利用しているアルゴリズムと、実装方針について書いていきます。 html: <!–more–> 辞書引きのデータ構造 - Trie 日本語入力に限らず、なんらかの辞書から対象のエントリーを探すとき、Trieというデータ構造がよく使われます。 Trieは一般に以下の特徴を持ちます。 文字列を表現することに非常に適している 同じprefixは共有されるため、メモリ効率がよい 2分探索木と比較して、高速である場合がおおい 最長一致マッチが自然に表現できる これらの特徴から、よく辞書の内部表現として利用されています。chokanでも特に理由はないので、これを採用しています。 Trieの実装 - ダブル配列 Trieは単なる構造の定義なので、実際の実装としては様々なものが考えられます。文字列に対する構造としては、2重連鎖木(以前migemoを実装したときに触れました)での実装などがあります。 その中でも特筆すべき構造として ダブル配列 があります。これは base / check / next というものを2本の配列で表現することで、 O(1) でのNode間遷移を可能としています。 より詳しい説明はWikipediaやSlideshareなどにありますので、興味があれば探してみてください。 なぜ遷移の時間が少ないものがよいのか?という点については、 日本語入力では都度入力に対応するnodeを探す必要がある 2重連鎖木などでは、実装においてはポインターを辿る必要がある prefixを辿る度にポインターを辿るのは、どうしても時間がかかる という、実機における制約があるためです。特に大量(10万単位でのエントリー)のprefixを都度探索することを考えると、高速であるというのは非常に重要な要素となります。 ダプル配列の難しさ さて、使うだけならいいことづくめに見えるダブル配列ですが、実装してみると 追加・削除がとてもややこしい というものがあります。そのため、普通はライブラリーを利用するのが普通なのですが、chokanでは アルゴリズムに関するものは自分で作る という方針でやっているため、Trieについても自前で実装しています。 https://github.com/derui/chokan/blob/315c2542db0a117fccd3e0fe111c8e6a73f5070a/libs/trie/src/lib.rs 上で一通り実装しています。動的な追加はサポートしないとユーザー辞書との結合ができないかな、と思ったので実装しています。が、動的な削除は、その難易度に比べて利用シーンが思いうかばなかったので、実装を見送っています。 ちなみに、ライブラリによっては 静的な構築のみ サポートしている、というものもあります。これは、初期構築のみであれば、データを辞書順にならべておくことで、動的な追加における決定的な非効率性を避けることができるためです。実際、ベースとなる辞書は10万というオーダーでエントリーが存在していたとして、ユーザー辞書がその規模になることはほとんどありません。また、ベース辞書は配布するのが基本なので、一回生成するだけでよいです。 が、chokanは辞書の構築方法が特殊なので、配布という方法がとれなかったのと、内部的にベースとユーザー辞書を(今は)マージして扱っている都合で、動的な追加が必要となっています。 実際、こんな感じになっています。一部をコメントアウトしているのは、難易度がかなり高かったので、簡単な方に日和った結果です。xcheckというのは、ダブル配列をTrieに適用した元論文から取られています。 fn move_conflicted(&mut self, node: &NodeIdx, label: &Label) { // 移動する対象を確定する let detect_to_move_base: (NodeIdx, Vec<Label>); // できるだけ遷移先が少ない方を移動する { let check_idx = self.

Kanzenという日本語入力の方式を再実装してみた Part.1

夏まっ盛りというところですが、いかがお過しでしょうか。暑いのは中々避けようがないですね。 何回かに分けて、現在自分で利様している日本語入力方式について書いていこうと思います。今回はその1ということで、概要からとなります。

Emacsの起動を高速化してみた

前回の記事で梅雨入りした、と書いたんですが、次の記事で梅雨が明けているとは思いませんでした。 Emacsの管理を色々変えたところ、起動をかなり高速化することにも成功しましたので、その内容を記しておこうかと思います。

Meowからryo-modalに切り替えてみた

ようやく梅雨に入りましたが、あんまり好きな季節というわけでもないですね。必要な季節ではあるんですけども。 最近またEmacs熱が上がってまして、meowからryo-modalに切り替えてみたので、その顛末を記録に残しておきます。

QMKでかな配列を使いつつ英字も入れられるようにする

そろそろ梅雨が近くなってきました。毎年あるものではありますが、ジメジメするのは嫌ですね。 今回も小ネタですが、個人的に結構困っていたので、いい加減に対処してみました。

自分でかな配列を計算してみた

気づくとGWがおわっていました。何を言っているか(ry さて、今回は題名にもあるとおり、ようやく使えそうになったかな配列について書こうかなと思います。

Alacritty + Nushell + Zellijにしてみた

新入社員の群れを見るたび、春を感じますね?(ほんとか? 最近色々あって、がらっと環境を変えてお試ししているところなので、それらについて書こうかと思います。

propertizeした文字列をバッファに入れたい

あれ、もう桜が咲きそうなんですけど??? 今回は超小ネタです。ちょっと今Emacsをいじっているなかでなかなか出来なかったので。

7sproを組み立てた

気がつけばあっというまに年が明けまして、そろそろ正月休み気分も投げすてるべきタイミングに来ているような感じです。 ということなので(?)、約2年ちょっと振りにキーボードを組み立てたので、その話を書こうかなと思います。

PlaywrightでのAPIモッキングをどうやっていくか

気付けば後一週間くらいで年が明けます。今年も大掃除を忘れてしまったので、毎度ですが最後の日曜くらいに台所だけちょっと気合を入れる所存です。 前回の話を下敷にして、PlaywrightでAPIを上手いことモックするやつを(仕事で)作ったので、どういう感じなのかをつらつらと書いていきます。