日本語入力を支える技術 ~変わり続けるコンピュータと言葉の世界 (WEB+DB PRESS plus) | |
徳永 拓之 | |
技術評論社 |
今回紹介するのは博物的な内容でもなく、技術者たちの人間ドラマでもなく純粋に技術的な視点で書かれた一冊です。
日本語入力、自然言語処理のトピックをネットで調べているときにしばしば目にする機会も多く、中にはかなりの熱量で激賞されておられる方もみられる本書は現時点で間違いなく定番となる一冊だと思いますので紹介したいと思います。
タイトルは「日本語入力を支える技術 変わり続けるコンピュータと言葉の世界」(徳永拓之 著)です。
自然言語処理について書かれた書籍は多いものの、かな漢字変換の仕組みの解説をメインに据えてここまで詳述してあるのは意外と見つけるのが難しく、2012年2月8日発売でありますが現時点においても紛う事なきエポックであるとおすすめできる内容になっています。
第1章(日本語と日本語入力システムの歩み)の大まかな流れとしてはでは日本語入力を語る上での素朴な基礎事項の導入からMicrosoft IMEとATOKという2強時代の到来・そして近年のWeb検索各社のかな漢字検索エンジンへの参入などの時系列の流れが説明してあります。
この流れの中でかつての1980年代でのかな漢字変換エンジンの主流の変換手法であるn文節最小一致法(少ない文節数でいかに長い文字列を変換できるかを試みる)の原理がまず示されますが、ここを入り口に2つの改善案が展開されていきます。それが「単語間のつながりやすさを考慮したかな漢字変換」と「最適解を求めるかな漢字変換」です。
前者は分節数以外に接続のしやすさを定義した品詞間の接続テーブルとか連接表と呼ばれる表を参照しつつそれを反映したスコアで評価するというものです。
後者は、前者の方法では必ずしも求まった結果が最適解であるという保証がない中で、隣接する単語の間のつながりやすさをスコアとするようなシンプルなモデル化を行っている場合には最適解を高速に求める手法が存在し、探索の最適性が保証されているというものです。ここでビタビアルゴリズムという言葉が出てきます。
これは読み進めていくうちに頻出のキーワードですから時系列の理解とともに、とっかかり事項として変換手法の改善背景を心に留めておくと良いでしょう。
2章はかな漢字変換を実際にアプリケーションとして開発してみるということになったときに懸案となる技術知識について、システム側から見た日本語入力の状態、文字入力フレームワークという枠組みの中でのやりとり・役割をOSやAPIとのカラミの中で概観的に書かれています。
本書に占める位置づけとしては開発者向けの手続き上の技術課題が多くやや専門的なため独立性の高いパートですがこの章の最後の方に出てくる[かな漢字変換器を構成する3つの大事な要素]…が変換にかかわるビッグイシューとして案内指標となると思ったので留意しておきます。
☆かな漢字変換器を構成する3つの大事な要素=データ構造、デコーダ、学習アルゴリズム
仔細は本記事では省略しますがこの書籍で述べたいところのもととなる視点がまさに集約されたくだりだと思います。ここから各章にわたるある意味力点のメリハリの効いている緻密な掘り下げ記事が続いていきます。
3章は肝心のかな漢字変換に用いるデータ構造についての詳しい説明です。変換のプロセスでは入力文字列からまず辞書引きを行う必要があります。しかし愚直に部分文字列のスコープをずらしつつ総当たり的にマッチングしていたのでは入力文字数の増加に計算量がついていけずものすごく時間がかかってしまいます。
そこで効率的な辞書引きの方法について「共通接頭辞検索」というものが提示されます。共通接頭辞検索では枝に文字がついたツリー構造でたどれるのでその都度参照問い合わせをするのではなく辞書引きの構造それ自体を以て対応させているのでなるほどと思うほどうまくできています。
この便利な木構造は抽象的には「枝に文字のついたツリー」=トライと呼ばれておりこの章ではトライを実現するデータ構造としてダブル配列とLOUDSがかなり詳しく解説されていました。
ブログ主ぴとてつが関連事項を調べたところ、有名な形態素解析エンジンMeCabやChaSenの辞書として利用されているのがダブル配列であり、本書でも触れられているGoogle日本語入力との関係ではデータ圧縮率の高さからLOUDSが採用されていることがわかりました。まさに今現在の先進的な分野で重用されているものが確認でき非常に貴重な記述だと思います。
4章ではかな漢字変換器を実現するための手法について具体的にアプローチしていきます。大まかにいうと、全ての部分文字列に対して辞書引きにより変換候補を求め、グラフ(変換可能性のあるワード要素同士がエッジ(辺)で結ばれているもの)を作り、ビタビアルゴリズムを用いてグラフの最短経路を求める…というモデルとして定式化していきます。
ここでは再帰というテクニックを用いて、最短経路問題を解く解法のパフォーマンスを向上させるために途中の計算結果をキャッシュする、メモ化再帰とよばれる手法について掘り下げられています。
以降ではグラフのノードやエッジにどのようなコストをつければいいのかを自動的にプログラムに推定させる(=機械学習)の手法として構造化パーセプトロンというものが導入されます。
スコアの計算にどのような情報を使うか、スコア調整の手順、コードとしての実装、学習用データの入手方法とアノテーションと呼ばれるデータの前処理について一通り解説し、これで簡単なかな漢字変換器の概念がひとまず完成したところで次章以降の種々の機械学習の実例に関して論ずる準備が整います。
5章は機械学習の話により深く入っていき、まずは二値分類という基本的な機械学習タスクの説明から始まっていき段階を深めていったうえで入力も出力もより複雑な構造学習の問題へと移っていきます。
正直理解の及ばない専門的な内容ですが、この著書の紙面をかなり割いて解説しており著者の力の入れようがうかがえるとんでもない充実ぶりです。ただここらあたりを読んでいる頃には、あえて本書を先読みして最終章の<付録>を読んでおくことをおすすめします。
<付録>では本書を読み進めるにあたっての予備知識・背景知識が数学的・技術的観点から事細かに解説されており進度に応じて適宜参照すると役に立つでしょう。
6章は5章を読みこなした方ならすんなり入れる箸休め的内容です。
目についたのは5章の中盤で若干触れてあった事の考え方で、ビタビアルゴリズムを拡張させた隣の隣のノードくらいまでの情報を計算に使うトライグラムについての記述と予測入力についての概観や考察が興味深かったです。
以上を通して、途中でわからなくなってしまうこともありましたが、初学者向けに間口の広い話題から入ってきてもおり決して専門家だけに特化された書籍ではないので日本語入力に興味のある方ならチェックしてみるのも良いかと思います。