Lingua::LanguageGuesser はいかにして生まれたのか

「言選Web」と言語自動判定

 言選Webは東京大学情報基盤センター中川研究室で公開している 専門用語(キーワード)自動抽出サービスです。  このシステムは内部で、専門用語(キーワード)自動抽出Perlモジュール"TermExtract"を活用しています。 特に西欧言語版では英語だけではなく、フランス語、イタリア語などの用語抽出を行うことができます。 しかし、入力テキストがどの言語で書かれているか判定する仕組みをもたず、ユーザがその都度指定する必要がありました。 そこで、入力テキストがどの言語で書かれているか、自動判定する仕組みを新たに考えることになった次第です。

言語判定器と日本語

 言語判定を行う方式を調べたところ、いくつかの手法があることがわかりました。  

     
  1. N-Gramモデルを用いたテキストの分類器を使う  
  2. 各言語で頻出する単語や特徴的な単語があるかどうかで判定する  
  3. アクセス先サイトのURLから国名を得る  
  4. HTMLのMETAタグの記述を確認する  
  5. 文字コードのエンコード判定プログラムを利用する
 言語判定器の主流は、上記の1、N-Gramモデルを用いた判定のようで、フリーウエアも多く配布されています。 TermExtractは、Perlモジュールですので、同じPerlで作られたものが組み合わせには有利です。  そこで、日本語も扱える Perl スクリプト TextCatに着目しました。

TextCat LanguageGuesser

TextCat はもともとは、N-Gramによるテキスト分類器のようです。その名称も Text Categolization の略からきています。特に言語の判定に使えるということで、 TextCat LanguageGuesser としてGPLにてPerlスクリプトが配布されています。  このText Cat ですが、調べた限りでは、他に比べていくつもの特徴を持ちます。  

   

成果を実証した論文がある  
Cavnar, Trenkle, N-Gram-Based Text Categorization  

 

60以上もの言語を文字エンコード別にデフォルトでサポートしている  
同一エンコード内(UTF8のみなど)で言語を判定するプログラムは多く見つかりますが、ここまでの多言語、多エンコードを最初からサポートしているものは他に見当たりませんでした。  
特に、日本語をあつかえるのは、日本人として助かります。  

 

Out-of-Place 方式の類似度計算方式を持つ  
言語モデルを独自で作成するときに、各言語モデルの教師データのサイズがまちまちでも問題が少ない  

Pure Perl
純粋にPerlで書かれた(C言語のソースを持たない)プログラムのため、改造が容易です

GPLで配布されている
GPLで配布されたプログラムですので、ソースコードを改造し、GPLで配布しなおすことができます。

モジュール化とCPAN

 上記のTextCat については、Perlのモジュールではなく単体スクリプトであることに不満がありました。特に組み込みで使う場合には不便です。 また、言語判定には前述したようないくつかの手法がありますが、これらとの組み合わせにより性能を上げることも単体スクリプトのままでは難しいといえます。 そこで、TextCatのプログラムを、CPANにある既存の言語判定モジュールの仕様を参考にしながら、モジュール化する作業を進めました。 個人的にはすっきりまとめたつもりです。  参考にしたCPANの言語判定モジュールは次のとおりです。  

 こうしてモジュール名称もLingua::LanguageGuesserに決め、 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 はとりあえず、動き出したばかりです。今後も仕様の変更や機能の追加、言語モデルの高精度化などの 手当てが必要かと考えていますが、現状でも十分に実用に耐えると思います。みなさまのプログラムでもご活用いただければ幸い です。


文責: 東京大学理学部生物学図書室 前田 朗 (maeda@lib.u-tokyo.ac.jp) (平成18年9月17日)