GHM 2013

I’m just back home after four weeks in Europe. The stay ended with the 7th GHM (GNU Hackers’ Meeting) at IRILL in Paris, France. As usual, the meeting was cosy and warm, but this time quite a few people (around 40) attended. The topics varied from kernel (Hurd), compiler (GDC), distribution (Guix), network protocol (GNUnet), accessibility, Emacs, statistics (PSPP), and free software activism (April), and all the talks were very interesting. Also, as a newbie GNU maintainer, I got some good discussions out there, including one with Patrice Dumas on translation of texinfo files using the Texinfo XML format.

Luca preparing the opening
Luca preparing the opening

Thanks to the organizers, speakers, and attendees. Thanks again to GNOME Foundation for allowing me to attend another conference with the GUADEC travel sponsorship.

GUADEC 2013

From August 1 to 8, I attended GUADEC for the first time. The conference overall was lively and quite different from whatever I’ve attended in the past. In the first four core days, there were a lot of talks from the core developers and contributors. I specially enjoyed the security talk by Stef Walter, where he is trying to minimize the distractions with security questions.

Brno city tour after day 4
Brno city tour after day 4

Aside from the talks, there were several BOFs (including Wayland, accessibility, input methods, open fonts) where I got plenty of good discussions, which resulted in finally landing the Wayland patch for IBus (though it is still a technology preview and not enabled by default), GSettings schema support for gettext, etc.

After the conference, I have been staying in the city for one more week and working from the Red Hat Brno office, and discussed more about input methods toward Wayland. Thanks Rui and Giovanni for helping my stay.

I’ll take a vacation from this weekend and move back to Prague, Paris, and then Tokyo, but will definitely miss the quiet atmosphere and quality beers in Brno.

Thanks GNOME Foundation for the travel sponsorship.
sponsored-badge-simple

gettext 0.18.3 released

gettext は枯れたソフトウェアではあるのですが、リリースから半年も経つと新しい機能が増えてくるもので、新しいバージョンをリリースすることになりました。図らずも前回はクリスマス、今日は七夕ですね。

今回の目玉はプログラミング言語のサポート強化です。新たに Glade 3, JavaScript, Lua, Vala のソースコードから gettext の呼び出しを(割と)正確に抽出できるようになりました。また、 PO から MO 生成時には、Python 3 でよく使われる進んだフォーマット文字列のチェックも可能になっています。

他に msgfmt と msgattrib の改良、Mac OS X 上での setlocale() のバグ修正、mingw (mingw-w64 ではない) 向けクロスコンパイルの修正、地味なところでは、新しい automake との親和性向上やテストの並列実行対応などが含まれています。詳しくはアナウンスをご覧ください。

shortcut editor for ibus-kkc

少し間があきましたが、libkkc 0.1.10 と ibus-kkc 1.5.10 をそれぞれリリースしました。

今回のリリースには、しばらく一人で悪戦苦闘していた、ショートカットエディタ(キー割り当ての設定画面)が含まれています。このあたりのユーザーインターフェイスは実装が面倒ですね…。

shortcut-editor

コメント欄でありがたいアドバイスをいくつか頂いたのですが、ショートカットエディタの変更が大きすぎるため、次回リリースに持ち越させていただきました。

libkkc update week four

libkkc 0.1.8 と ibus-kkc 1.5.8 をそれぞれリリースしました。

今回の主な変更点は文節変換の改良です。これまでは、たとえば「行って来る」を「言って来る」に修正するためには、最初の2文字(「いっ」)だけを選択してから候補を選ぶ必要がありました。0.1.8 では、3文字以上(「いって」「いってく」など)を選択しても変換が可能です。

これは、これまで単にSKK辞書を「いt」で引いていたのを、文節を文として変換するようにしたためです(つまり一週目の記事 で「使っていない」と書いていた A* 探索を結局使うようにした)。

convert-segment

とはいえ、最初の文節区切りはまだ細かいままなので、活用などの情報を使ってもう少し自然に見せたいところではありますが…。

この他に ibus-kkc のメニュー項目をガイドライン(ドラフト)に沿うようにしたり、ショートカットで入力モードを変更する際にラジオボタンが複数選択されてしまう問題が修正されています。

menu

余談ですが、やはり NLP を勉強しておく必要があるかと思い、今年は Coursera の NLP コースを取ってみました。昨年は機械学習のコースを取ったのですが、本をつまみ読みするのに比べて、体系的に知識が得られるのと、トレンド(?)がなんとなく分かるのが良いですね。

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 では文全体について複数の候補を表示することは稀なので、実装してはみたものの使っていません。かわりに各分節について単漢字変換の候補を提示するようになっています。

libkkc

昨年の夏頃から、ひっそりと日本語入力システムを作っていたのですが、いろいろあって公開しました。SKK とは違い、連文節変換のできる、いわゆる「ふつうの」 IME です。


(ブラウザ上で見れない方はこちらのファイルをどうぞ。この動画の撮影前には何も学習させていません。)

Continue reading “libkkc”