libkkc update week three

別件の締切に伴う作業があったため、今週の変更は少なめです。最新版はそれぞれ libkkc 0.1.7, libkkc-data 0.1.6 (変更なし), ibus-kkc 1.5.7 です。主な変更点は以下の通り。

  • かな配列で長音記号に対応
  • かな配列で送り仮名の切り出しに失敗するバグの修正
  • 行頭に現れる単語列に学習結果がきちんと反映されないバグの修正

ダウンロードはこちらから。次の締切は 3/12 なので、それまでにはショートカットの設定画面を仕上げたいところです。

libkkc update week two

libkkc 0.1.6, libkkc-data 0.1.6, ibus-kkc 1.5.6 をそれぞれリリースしました。
変更点は以下の通りです。

最近のパソコンは高速なので、通常の日本語入力では問題ありませんが、ibus-kkc で長い文章を入力すると、たまにもたつくことがありました。試しに3000文を変換するベンチマークをとってみると、

real user system
libkkc 0.1.5 282.17 279.95 0.07
Anthy 133.92 132.19 0.58

Anthy に2倍以上の差をつけられています。

gprof でプロファイルをとってみると、言語モデルから 2-gram を引く処理が全体の 67% を占めています。libkkc は この論文 の SORTED と呼ばれるタイプの索引を使っており、検索は二分探索なので、要素が多いとそれなりに時間がかかります。

高速化の手始めに、検索に使われるキーの傾向を調べてみると、3-gram のコストを求めるのに直近の検索キーを何度も検索していることがわかりました。そこで、直前に使われたキーと値のペアを一組だけ記憶しておくようにすると、これだけで 30% ほど速くなりました。

また、検索の成功・失敗の回数を数えてみると 95% 失敗しています。これは ブルームフィルタであらかじめ失敗判定をしてやれば大幅に高速化できそうに思えたのですが、そこまで思惑通りには行かず、20% ほどの速度向上にとどまりました。ハッシュの計算 (murmur hash 3 を利用) が悪いのかな?

というわけで、もう一度ベンチマークをとってみると、

real user system
libkkc 0.1.6 130.11 129.15 0.05
libkkc 0.1.5 282.17 279.95 0.07
Anthy 133.92 132.19 0.58

Anthy と同じくらいにはなりました。

libkkc update week one

前回の続きです。一週間ほど毎日、新聞の社説を打ち込むなどして、使いにくいと感じたところを直してきました。最新版はそれぞれ、libkkc 0.1.2, libkkc-data 0.1.1, ibus-kkc 1.5.5 です。ダウンロードはこちらから。

主な変更点は以下の通りです。キーバインディングは wiki に少し書いてあります。

  • 直接入力モードの追加 (Alt-grave または Alt-@)
  • 単語登録機能 (選択 + Alt-r + 見出し語入力&変換確定)
  • 言語モデルの精度向上
  • 連分節辞書のバグ修正

参考程度ですが、libkkc 0.1.2, libkkc-data 0.1.1 を使って、こちらと同様の評価を行なったところ、結果は以下のような感じでした。

precision recall
libkkc 91.7% 91.4%
Anthy 82.8% 83.2%

アルゴリズムは比較的単純な単語 3-gram で、単語の表記だけを素性として用いています。

文の学習についても、再現性を重視して特に目新しいことはしていません。文節の区切り位置と、それぞれの文節に割り当てられた単語を 2-5 gram 覚えておき、次の変換時に1単語ずつずらしながらマッチングしていくだけ。また、文字数があまりに短い N-gram は学習しません。たとえば、未学習の Anthy では、「ほんをかう」→「本を買う」、「いぬをかう」→「犬を飼う」、と正しく変換されますが、いちど間違って「本を交う」のように変換してしまった場合、以降「いぬをかう」も「犬を交う」のように変換されてしまう問題があります。libkkc では「を」「か」「う」のような、3文節ではあるが全体の文字数が3文字と少ない N-gram は学習の対象としないので、このようなことは起こりません。

因みに私は 15 年来の SKK ユーザーなので、使える場面では積極的に単漢字変換を使う設計になっています。たとえば、「しぶや」を Anthy で変換すると「支部や」になりますが、libkkc は最初に文全体を単語とみなして辞書を引くので、こういうことは起こりません。また、徳永さんの本では第一候補以外の文を得るために後ろ向き A* 探索を使うアイデアが示されていますが、実際の IME では文全体について複数の候補を表示することは稀なので、実装してはみたものの使っていません。かわりに各分節について単漢字変換の候補を提示するようになっています。