「言選Web」と言語自動判定 |
言選Webは東京大学情報基盤センター中川研究室で公開している 専門用語(キーワード)自動抽出サービスです。 このシステムは内部で、専門用語(キーワード)自動抽出Perlモジュール"TermExtract"を活用しています。 特に西欧言語版では英語だけではなく、フランス語、イタリア語などの用語抽出を行うことができます。 しかし、入力テキストがどの言語で書かれているか判定する仕組みをもたず、ユーザがその都度指定する必要がありました。 そこで、入力テキストがどの言語で書かれているか、自動判定する仕組みを新たに考えることになった次第です。
言語判定器と日本語 |
言語判定を行う方式を調べたところ、いくつかの手法があることがわかりました。
TextCat LanguageGuesser |
TextCat はもともとは、N-Gramによるテキスト分類器のようです。その名称も Text Categolization の略からきています。特に言語の判定に使えるということで、 TextCat LanguageGuesser としてGPLにてPerlスクリプトが配布されています。 このText Cat ですが、調べた限りでは、他に比べていくつもの特徴を持ちます。
モジュール化とCPAN |
上記のTextCat については、Perlのモジュールではなく単体スクリプトであることに不満がありました。特に組み込みで使う場合には不便です。 また、言語判定には前述したようないくつかの手法がありますが、これらとの組み合わせにより性能を上げることも単体スクリプトのままでは難しいといえます。 そこで、TextCatのプログラムを、CPANにある既存の言語判定モジュールの仕様を参考にしながら、モジュール化する作業を進めました。 個人的にはすっきりまとめたつもりです。 参考にしたCPANの言語判定モジュールは次のとおりです。
utf8への対応 |
TextCatのモジュール化を済ませたものの、実際にテストする段になり、UTF8の言語モデル(プロファイル)をほとんど持たないことがわかりました。 西欧言語はLatin1を、日本語についてはShift-JISとEUCをサポートしているものの、いずれもUTF8の言語モデルを持ちません。 そこで独自にインターネット上のテキストから、教師データを作成し、UTF8の言語モデルを追加しました。 しかし、ここでもうひとつ困った問題に遭遇します。それは、Latin1 と UTF8 がいずれも ASCII の上位互換のため、ASCIIの文字 セットが文中に多く出る言語では、Lati1 と UTF8の判別が難しいということです。たとえば、UTF8で書かれたイタリア語の文章が、「Latin1で書かれた」イタリア語と判断されてしまいがちです。 そこで、Perlの5.6から標準で持つようになった、エンコード判定モジュール"Encode::Guess"と組み合わせて、テキストのエンコード に応じ、内部でUTF8と、それ以外とに処理を分けることにしました。
リンク |
おわりに |
Linua::LanguageGuesser はとりあえず、動き出したばかりです。今後も仕様の変更や機能の追加、言語モデルの高精度化などの 手当てが必要かと考えていますが、現状でも十分に実用に耐えると思います。みなさまのプログラムでもご活用いただければ幸い です。