はじめに
以前、UNIXに標準搭載されているライブラリを使って日英の言語判定をしたくなったので、gzipを使った言語判定の実験をしました。
言語判定とは
文が与えられたときにそれがどの言語で書かれているのか判定するタスクです。
他の自然言語処理タスクで使われるコーパスのクリーニングをしたり、言語によって処理を変えたりするのに有用な技術です。
# 言語判定の例
I am Ok. -> 英語と判定
問題ない。 -> 日本語と判定
gzip を使った言語判定の仕組み
gzip はファイル圧縮に使われるライブラリです。そのため、言語判定タスクに使うと聞いてもピンとこないかもしれません。
gzip はファイルの圧縮に LZ法という手法を用いています。
これは辞書を用いた圧縮法で、ある文字列が繰り返し出現したとき、その文字列の代わりに辞書中の番号を出力することで元の文を短い長さで表すという仕組みです。
その仕組み上、今まで入力された文字列にないようなフレーズを多く含む文に対しては圧縮の効率が悪くなる性質があります。
gzip を用いた言語判定では、この性質を活かして、判定したい言語ごとにその言語で書かれた文およびそれを圧縮したものを用意し、そこに追加で判定の対象となる文を入れてさらに圧縮したときのファイルサイズの増え方に基づいて言語を判定します。
実験設定
データ
Parallel Universal Dependencies ツリーバンクの日本語、英語、フランス語を用いました。
これはニュースやWikipediaの記事から作られた形態素や係り受けの情報が付与されているパラレルコーパスです。
各言語1000文のうち初めの100文を予め圧縮する文、残りの900文を言語判定の評価に用いました。
手法
ある入力文があったとき、各言語 $L$ について以下の値を計算し、その値が最も小さな言語をその入力文の言語とします。
[言語 L のテキストファイルに判定対象の文を加えたものの圧縮後サイズ]-[言語 L のテキストファイルの圧縮後サイズ]
上の値を求める具体的なスクリプトは以下の通りです。
#[言語 L のテキストファイルの圧縮後サイズ]
zipped_constant=$(cat textfile.lang.txt | gzip | wc -c)
#[言語 L のテキストファイルに判定対象の文を加えたものの圧縮後サイズ]
zipped_input_text_plus_train_data_size=$(cat textfile.lang.txt <( echo "これは日本語の文です。") | gzip | wc -c)
#[言語判定に用いるスコア]
score=$((${zipped_input_text_plus_train_data_size} - ${zipped_constant}))
実験結果
下に分類結果を示します。
単純な手法でしたが、どの言語でも高い分類性能を示しています。
|混同行列|英語|フランス語|日本語|
|---|---|---|---|---|
|英語(予測)|894|2|0|
|フランス語(予測)|2|876|0|
|日本語(予測)|4|22|900|
言語 | Precision | Recall |
---|---|---|
英語 | 99.78 | 99.33 |
フランス語 | 97.77 | 97.33 |
日本語 | 100 | 100 |
エラー分析
以下に英語の文における分類間違いの例を示します。
結果として、どの文も英語として自然な文であったため、なぜ誤判定したかをはっきり言えるような例ではありませんでした。
今回圧縮ファイルに使った文数は100文ほどと少なかったため、この文数を大きくすれば下のような自然な文に対してもうまく分類ができるようになるかもしれません。
# 英語の文をフランス語と予測
Its importance resides in two facts.
# 英語の文を日本語と予測
Major European rivers flow from Switzerland, such as the Rhine, the Rhône, the Inn,
the Ticino and the Po, all of which have headwaters in the Alps and flow into neighbouring c
ountries, finally emptying into the North Sea, the Mediterranean Sea, the Adriatic Sea and the Black Sea.
さいごに
この記事ではファイル圧縮を用いた言語判定を行い、その性能を評価しました。
UNIXに標準搭載のライブラリしか使えないときの言語判定などにこの記事をご活用いただけると嬉しいです。
参考文献
Language detection in the Bash command line using gzip (aka Comprehension is compression)