Top Banner
ナイーブベイズによる 言語判定 2010/9/25 中谷 秀洋@サイボウズ・ラボ id:n_shuyo / @shuyo
54

ナイーブベイズによる言語判定

Nov 01, 2014

Download

Technology

Shuyo Nakatani

 
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: ナイーブベイズによる言語判定

ナイーブベイズによる 言語判定

2010/9/25

中谷 秀洋@サイボウズ・ラボ

id:n_shuyo / @shuyo

Page 2: ナイーブベイズによる言語判定

Introduction

Page 3: ナイーブベイズによる言語判定

言語判定

• 不えられた文書が何語で書かれたものか判定

– 英語/スペイン語/日本語/中国語(繁体・簡体)/アラビア語/……

– 文字コードの判定を同時に行うこともあり(今回は対象外)

• 利用シーン

– 言語の絞り込み付で検索したい

– 言語別のフィルタを適用したい(SPAMフィルタとか)

• Web本文抽出でも言語固有の特徴量を使った

• 利用対象

– Web検索エンジン

• Apache Nutch ではクローラに言語判定モジュールが付属

– 掲示板

• 例:日英中越入り交じりの書き込み

グローバル化!

Page 4: ナイーブベイズによる言語判定

自分で作らなくちゃダメ?

• 言語判定ライブラリは数少ない

– ニーズが限られている?

• Web検索だけ? でもこれからはグローバル化の時代!

– コーパス/モデルの構築が高コスト

• 対象言語の知識がどうしてもある程度かなり必要

• 対応言語数が少ない。精度が低い

– おおむね10言語程度。アジア系サポートなし

– “Thank you. ありがとうございます”

• → 「タガログ語かチェコ語かスロバキア語です」

Page 5: ナイーブベイズによる言語判定

Related Works

Page 6: ナイーブベイズによる言語判定

既存の言語判定サービス

• Google AJAX Language API

– 短いテキストでも比較的的確に判定&対応言語も多い

– 最も可能性の高い言語を1つだけ返す

– Web API でいい&非商用利用なら鉄板か

• http://code.google.com/intl/lt/apis/ajaxlanguage/documentation/

• http://www.google.com/uds/samples/language/detect.html

• G2LI (Global Information Infrastructure Laboratory's

Language Identifier)

– オンラインデモのみ

• http://gii.nagaokaut.ac.jp:8080/g2liWebHome/index.jsp

• PetaMem Language Identification

– オンラインデモのみ

• http://nlp.petamem.com/eng/nlp/langident.mpl

Page 7: ナイーブベイズによる言語判定

既存の言語判定ライブラリ

• Lingua::LanguageGuesser

– Perl 実装。60カ国語対応。文字コードもあわせて判定

– 類似度ベースゆえ、評価結果は相対値で得られる

– テキスト分類器の実装 TextCat をベース

• http://gensen.dl.itc.u-tokyo.ac.jp/LanguageGuesser/

• NGramJ

– Java の言語判定ライブラリ。LGPL

– Executable Jar で配布されているので、ダウンロードして即、コマンドラ

インから実行してみることが可能。

– Lingua::LanguageGuesser と同じく TextCat がベース。

– 用意されているプロファイルが少なく、標準で対応している言語や文字

コードが少ない(UTF-8 は対応無し)

• http://ngramj.sourceforge.net/

Page 8: ナイーブベイズによる言語判定

言語判定の論文 (1)

• [Dunning 1994] Statistical Identification of Language

– 英西の2言語、5万件の学習データで 正解率は 92%(20bytes)、99%(500bytes)

– Markov モデルによる識別。おそらく学習コストがめちゃめちゃ高い。

– 確率的言語識別では多分一番引用数が多い論文。

• [Grefenstette 1995] Comparing two language identification schemes

– 欧文9言語、10~20語の入力で 99%

– 手法は「 Trigram ごとの確率を求め、シーケンスの確率を求めて、一番大きいヤツ」と文章で書

かかれているだけ。

• [Sibun & Reynar 1996] Language identification: Examining the issues

– 欧文18言語で、90%(テストデータ1行)、99%(テストデータ5行) ((注:単位は「行」))

– 各言語の n-gram の確率分布をあらかじめ求めておき、対象とのKLダイバージェンスが一番小

さいものをとる。

• [Cavnar & Trenkle 1994] N-gram-based text categorization

– 欧文8言語、正解率 98~99%(テストデータ 300bytes 前後)。

– N-gram のランキングの類似度による判別。

Page 9: ナイーブベイズによる言語判定

言語判定の論文 (2)

• [Giguet 1995] Multilingual sentence categorization according to language

– 欧文4言語で error rate は 0.01%

– 方式は「機能語(of とか)が出てきたら、その言語の尤度を増加させる」と書かれているだけ

– テストセットは「集めてきた」と書かれているだけ

• [Poutsma 2001] Applying Monte Carlo Techniques to Language

Identification

– trigramの確率を「加算」して比較。モンテカルロと言いつつ先頭から順に「サンプリング」

• [Martins+ 2005] Language Identification in Web Pages

– 1~5-gram+similarity。欧文12言語で 91%。イタリア語が 80%(スペイン語と間違う)

• [AMINE+ 2010] Automatic Language Identification: An Alternative

Unsupervised Approach Using a New Hybrid Algorithm

– 不えられた「ドキュメントのセット」をクラスタ分類するものであり、未知のドキュメントの言語判別を

するものではない

– 基本 K-means だが、K を不えるのではなく人工蟻コロニーで推定する

Page 10: ナイーブベイズによる言語判定

やっぱり自分で作らなきゃダメみたい

• 使いやすいライブラリがない

• 速度が遅い

• 対応言語が少ない(特にアジア系)

• 類似度ベースのものが多い

–値を絶対評価できない

• (個人的に)確率的手法の方が好き♪

–ナイーブベイズで十分じゃあないかなあ

Page 11: ナイーブベイズによる言語判定

Our Approach

Page 12: ナイーブベイズによる言語判定

ナイーブベイズによる文書分類

• 文書 𝑋 = (𝑋𝑖) をカテゴリ 𝐶𝑘 に分類する問題

– 文書は単語 𝑋𝑖 の集合と見なす(bag-of-words)

• ナイーブベイズ : カテゴリ毎の単語の出現確率を独立とする仮定

– 𝑝 𝑋 𝐶𝑘 = 𝑝 𝑋𝑖 𝐶k𝑖 (独立の仮定から)

– where 𝑝(𝑋𝑖|𝐶) : カテゴリごとの単語の出現率

• 事後確率が最大となる 𝐶k を文書 𝑋 のカテゴリと推定する

– 𝑝 𝐶k 𝑋 =𝑝 𝑋 𝐶k 𝑝 𝐶k

𝑝 𝑋∝ 𝑝(𝐶k) 𝑝(𝑋𝑖|𝐶k)𝑖

– where 𝑝(𝐶k) : カテゴリごとの事前情報

• [宣伝] 詳細は gihyo.jp 「機械学習 はじめよう」第2回をご覧ください

– http://gihyo.jp/dev/serial/01/machine-learning/0002

本当は独立なわけないんだけどね!

Page 13: ナイーブベイズによる言語判定

ナイーブベイズによる「言語判定」

• 「言語」をカテゴリとした文書分類を行う

– 文書が「英語」に分類されるか、「日本語」に分類されるか判定

• 特徴量に単語ではなく「文字 n-gram」を使う

– 正確には「Unicodeのコードポイント n-gram」 (≠単語/バイト)

– 文字コードが判明していることを前提(特に Unicode とする)

• アプリはテキストの文字コードは把握している

• 文字コード判別が必要なら別途( ICU-4C など)

□ T h i s □T h i s ←1-gram

□T Th hi is s□ ←2-gram

□Th Thi his is□ ←3-gram

単語の区切りを 表す記号

Page 14: ナイーブベイズによる言語判定

文字n-gramで言語判定ができる理由

• 各言語には固有の文字や綴り字の規則がある

– アクセント付きの “é” はスペイン語、イタリア語などではよく使われ

るが、英語では原則として用いない

– “Z” で始まる単語はドイツ語には多いが、英語にはほとんど無い

– “C”で始まる単語や “Th” という綴りは英語には多いがドイツ語に

は少ない

• これら特徴に「確率」を設定し、文書全体について累積

□C □L □Z Th

英語 0.75 0.47 0.02 0.74

ドイツ語 0.10 0.37 0.53 0.03

フランス語 0.38 0.69 0.01 0.01

Page 15: ナイーブベイズによる言語判定

言語判別の流れ

• 学習: 学習コーパスから 𝑝(𝑋𝑖|𝐶k) を求める

– 最尤推定(MLE)なら

𝑝 𝑋𝑖 𝐶𝑘 =𝐶𝑘の文書内のXiの頻度言語𝐶𝑘の特徴量数

• 判定: 対象テキストから 𝑝 𝐶k 𝑋 を求める

– テキストから特徴量 𝑋𝑖 を抽出、 𝑝 𝐶k 𝑋(m)を更新

– 𝑝 𝐶k 𝑋(m+1) ∝ 𝑝 𝐶k 𝑋

m ⋅ 𝑝 𝑋𝑖 𝐶𝑘

– 正規化し、最大確率が閾値(0.99999)を超えたら終了

Page 16: ナイーブベイズによる言語判定

Preparation

Page 17: ナイーブベイズによる言語判定

「文字」について予習

• 世界で使われる文字は大きく4つに分類される

–アルファベット(ギリシャ文字系)

–アラム文字系

–ブラーフミー文字系

–漢字系

Page 18: ナイーブベイズによる言語判定

言語系統と「文字」

• 文字は必ずしも言語の系統と関係しない

–宗教上の理由

• カソリック→ラテン文字、ギリシャ正教→キリル文字

• イスラム→アラビア文字、ヒンズー→デーヴァナーガリー

– 「近代化」

• 旧体制との結びつきを連想させる文字を捨てる

• 普及した文字の方が、学習やコミュニケーションのコスト

が低い

Page 19: ナイーブベイズによる言語判定

言語-文字対応表(1)

• 同じ枠内の言語間は判別しにくい傾向がある

Page 20: ナイーブベイズによる言語判定

言語-文字対応表(2)

• 文字と語派がほぼ単独対応する言語

–文字=言語なので、比較的容易に判別可能

Page 21: ナイーブベイズによる言語判定

アルファベット(ギリシャ文字系)

• ギリシャ文字から派生(alpha-beta)

• 主な特徴(文字ごとに例外有り)

– 子音文字と母音文字を個別に持つ

• 表音文字として非常に優秀。多くの言語が「アルファベット表記」を持つ

– 大文字と小文字の区別がある

• ギリシャ文字とラテン文字に分岐したあと、両方に大文字小文字の区別が出来た

– 文字種は 30 前後

– UTF-8でも2バイト以下で表現可能

• コードブロックの「いい場所」を取っているw

Page 22: ナイーブベイズによる言語判定

Αλφάβητο

• 代表的な文字

– ラテン文字:ローマ・カソリックとともに普及

• アメリカ、ヨーロッパなど、最も多くの国・言語で使われる

• 意外なところではアフリカ諸国、東南アジアにも多い

– 植民地の文字をラテン文字表記に変えさせたり

• アルファベットに存在しない音があれば、付加記号を付

けて文字を増やす(拡張ラテン文字)

–キリル文字: ギリシャ正教とともに普及

• ロシア、東欧を中心に

• 旧・現 社会主義国にも多い(旧ソ連の仕業)

Page 23: ナイーブベイズによる言語判定

アラム文字系

• 中東で普及したアラム文字から派生

• 主な特徴

– 右から左に続き字で書く

• 続き字の頭・真ん中・お尻で字形が変わる

• 活字より手書きをよしとする(新聞も手書き)

• 慣れないとどこからどこまでが1文字かわからない

– 基本的に子音のみで表記される(「アブジャド」)

• 単語の意味によって母音がわかるので、知らない単語は読めない

• 文字がないせいか、母音が少ない(アラビア語は a/i/u のみ)

• クルアーンや子供向け文章は母音記号付き(「ふりがな」みたい)

– 文字種は 30 前後

• Unicodeでは派生文字(後述)も Arabic ブロックに含むため、コードポイント数は256

ال

これは2文字!

Page 24: ナイーブベイズによる言語判定

عربيةأبجدية

• 代表的な文字

– アラビア文字: イスラムの文字として普及

• イスラムの聖典クルアーン(コーラン)は「アラビア語のみ」。翻

訳されたものはクルアーンではない

• そのためイスラム圏の諸語では、アラビア文字に数文字加え

た派生文字が使われる傾向(ペルシャ文字、ウルドゥー文字)

– ヘブライ文字:ユダヤ民族の文字

• ヘブライ語:日常語としては一度消滅。20世紀に復活

• 世界各地のユダヤ人が現地の言葉をヘブライ文字で表す

– イディッシュ語 ≒ ドイツ語のヘブライ文字表記

– ジュデズモ語 ≒ スペイン語のヘブライ文字表記

Page 25: ナイーブベイズによる言語判定

ブラーフミー文字系

• 古代インド発祥のブラーフミー文字から派生

• 主な特徴(文字ごとに例外有り)

– 潜在母音を持つ子音文字+母音付加文字+補助記

号(「アブギダ」)

• 母音なし=「ア」。母音文字付き=「イ」など他の母音

• 日本語の「五十音」もインドの文字体系を参考に

– 言語ごとに固有の文字が作られる

• 「丸くてかわいらしい」ものがおおい

• 固有の数字文字を持つ

– 文字種数は子音 30 前後、付加文字等 10~20

తెలుగు ๐๑๒๓๔๕๖๗๘๙

Page 26: ナイーブベイズによる言語判定

दवेनागरी

• 代表的な文字

– デーヴァナーガリー: ヒンズー教とともに普及

• ブラーフミー系にしては珍しく複数の言語で使われる(それで

も非常に少ないが)

– 言語固有文字

• 伝播先のインド国内や東南アジアで次々と独自の派生文字

が作られる

• テルグ文字、カンナダ文字、クメール文字、タイ文字、……

– ハングル文字:朝鮮で作られた人造文字

• 合字による音節文字の構成など、パスパ文字を参考に制定

されたと考えられる

Page 27: ナイーブベイズによる言語判定

漢字系

• 甲骨文字(亀甲獣骨文字)の発展系

• 特徴

– 現行文字としては唯一の表意文字

• 言葉の全く異なる日本語と中国語でも、漢字を使えばある程

度の意思疎通が可能

– 「普通」は逆(口頭は通じるが筆談は×:ヒンディーとウルドゥー)

– 文字種数は数万~数十万と膨大

• 正確な数は「わからない」

• 常用漢字(よく使われる字)というカテゴリーがある(他の文字

にそんなのがあるわけない!)

Page 28: ナイーブベイズによる言語判定

汉字

• 代表的な文字

– 漢字

• 現在は中国語(簡体字・繁体字)と日本語のみ

• 朝鮮での使用は事実上廃止(CJKなんだけど……)

• ベトナム語(チュノム):漢字を表意・表音の両方で用いるという

独特の体系。現在はラテン文字表記に

– ひらがな、カタカナ:漢字から作られた表音文字

• 現存する言語の中で、日本語は表意文字と表音文字の両方

を使う唯一の言語

• 全く同体系の2種類の表音文字を使い分けるのも日本語だけ

Page 29: ナイーブベイズによる言語判定

Prototype

Page 30: ナイーブベイズによる言語判定

言語判別の流れ(再掲)

• 学習: 学習コーパスから 𝑝(𝑋𝑖|𝐶k) を求める

– 最尤推定(MLE)なら

𝑝 𝑋𝑖 𝐶𝑘 =𝐶𝑘の文書内のXiの頻度言語𝐶𝑘の特徴量数

• 判定: 対象テキストから 𝑝 𝐶k 𝑋 を求める

– テキストから特徴量 𝑋𝑖 を抽出、 𝑝 𝐶k 𝑋(m)を更新

– 𝑝 𝐶k 𝑋(m+1) ∝ 𝑝 𝐶k 𝑋

m ⋅ 𝑝 𝑋𝑖 𝐶𝑘

– 正規化し、最大確率が閾値(0.99999)を超えたら終了

Page 31: ナイーブベイズによる言語判定

言語判定モジュール(プロトタイプ)

• 学習&判定を Ruby で実装して検証

– 1~3-gram を特徴量として用いる

• 頻度2回以下は足切り

• 4-gram を加えると、精度が低下する(原因未調査)

– 文字の正規化(後述)

– 近似&加算スムージング(手抜き!)

• 𝑝 𝑋𝑖 𝐶𝑘 =document frequency+𝛼言語𝐶𝑘のdocument数+V𝛼

• パラメータはα=1,2,5,10。確率を正規化してないので大きめ

– http://github.com/shuyo/iir/tree/master/langdetect/

• 学習済みモデルで、言語判定を試せます

$ ruby ./filetest.rb [判定したいファイル]

Page 32: ナイーブベイズによる言語判定

評価(プロトタイプ)

• テスト方法

– コーパス : Google News から22言語

• RSSをクロールして収集

• 学習用 兼 テスト用。学習用はランダムに 300件抽出

• RSSの抜粋なのでデータの粒度(記事の長さ)が揃っている

• ノイズが非常に少ない

• 学習後のモデルサイズ

– JSON形式で出力して 1.2MB

• gzip圧縮して 280KB

ar アラビア語de ドイツ語el ギリシャ語en 英語es スペイン語fr フランス語hi ヒンディー語hu ハンガリー語id インドネシア語it イタリア語ja 日本語ko 朝鮮語(韓国語)nl オランダ語pl ポーランド語pt-PT ポルトガル語ru ロシア語sv スウェーデン語th タイ語uk ウクライナ語vi ヴェトナム語zh-CN 中国語(簡体字)zh-TW 中国語(繁体字)

Page 33: ナイーブベイズによる言語判定

評価結果(プロトタイプ)

• 22言語平均で 98.6~99.7% の精度

Page 34: ナイーブベイズによる言語判定

プロトタイプの問題点

• コーパスに依存した作り

• Google Newsコーパスのpros/cons

– ○データの粒度(記事あたりの長さ)が揃っている

– ○ ノイズが少ない

• 適当にやっても、そこそこいい精度!!

– ○偏りの少ない表現を一箇所から拾える

• ソースが複数ニュースサイト

– ×未提供言語に対応できない(ペルシャ語などなど)

– ×まとまった量の入手に手間&時間がかかる

– ×コーパスを配布できない

Page 35: ナイーブベイズによる言語判定

Main Subject

Page 36: ナイーブベイズによる言語判定

言語判定ライブラリ for Java

• オープンソースとして公開(Apache License 2.0)

– http://code.google.com/p/language-detection/

• プロトタイプ+コーパス変更

– 学習コーパスに Wikipedia の abstract データベース

ファイルを採用

• Wikipedia は 273 言語に展開(2010/09 現在)

– 特徴量に Jefferys-Peaks (ELE)

• 𝑝 𝑋𝑖 𝐶𝑘 =𝐶𝑘の文書内のXiの頻度+𝛼

言語𝐶𝑘の特徴量数+V𝛼, where 𝛼 = 0.5

• 𝑝 𝑋𝑖 𝐶𝑘 > 10−4 で足切り

Page 37: ナイーブベイズによる言語判定

当初、まったく精度が出ない

• 初期版では平均精度が70%程度

–日本語、繁体字、ロシア語などが50%未満……

• 精度低下の要因:

– (1) 学習コーパスのノイズ

– (2) 学習コーパスの丌均一性

– (3) 文字種の偏り

– (4) 判定テキストのノイズ

Page 38: ナイーブベイズによる言語判定

(1) 学習コーパスのノイズ

• Wikipedia Abstract Database は意外とノイズだらけ

– abstract = 先頭1段落の抜粋

• 他言語での名称表記

– 由来となる言語での正式名を併記。n-gram に他言語のも

のが混ざる

– → 足切りで極力除外

• スタイル情報などの残留

– 本来、独自タグで囲まれているのだが、Abstract

Database ではタグのみ消えている(!!?)

– → 正規表現などで引っかけて、少しでも減らす

Page 39: ナイーブベイズによる言語判定

(2) 学習コーパスの不均一性

• 言語によって記事件数に大きな隔たり

–英語:340万件, イタリア語:72万件

–デンマーク語:13万件, ソマリ語: 1400件

–特徴量の分母が異なるため、discount 項の効き

方が言語によって異なってしまう

• 𝑝 𝑋𝑖 𝐶𝑘 =𝐶𝑘の文書内のXiの頻度+𝛼

言語𝐶𝑘の特徴量数+V𝛼, where 𝛼 = 0.5

– → 頻度の平均を用いて、分母を統一

Page 40: ナイーブベイズによる言語判定

(3) 文字種の偏り

• 漢字:文字種が他言語の1000倍!

• コーパスに出現しない文字

– Wikipedia で「谢」は使われない→ 「谢谢」が判定できない

– 日本人の人名漢字も同様

– → 文字の正規化時に「常用漢字」を考慮(後述)

• 日本語と繁体字の誤判定問題

– 確率を正規化すると、文字種が多い⇒確率小

• 共通文字について、文字種の多い言語が丌利

• アルファベットが混じっていると、負ける → ラテン文字ノイズ参照

– 漢字はかなり共通+日本語にはひらがな&カタカナ

• 漢字の日本語確率が下がりすぎ、繁体字判定されがち

– → 文字の正規化で解決(後述)

Page 41: ナイーブベイズによる言語判定

(4) 判定テキストのノイズ

• 言語に依存しない文字 → 単純に除去

– URL やメールアドレス

– 数字や記号(¥x21-¥x40, General Punctuation)

• ラテン文字ノイズ in 非ラテン文字

– 非ラテン文字の中にも頻繁に出現

• ある意味世界共通文字。でも精度低下の大きな要因

– → ラテン文字が2割以下なら除去

• ラテン文字ノイズ in ラテン文字

– 略字、人名は言語の特徴を表さない

• 特に人名はむしろ他の言語の特徴をもつことも

– → 全て大文字の単語は除去

– → 特徴サンプリングして、人名などの局所的な特徴の影響を低減

Page 42: ナイーブベイズによる言語判定

文字の正規化

• 文字を(言語判定の観点で)統一されたものに置き換え

– 学習時・判定時の両方で行う

• そもそもなぜ正規化が必要?

– ノイズ除去

• 言語に依存しない記号・アラビア数字(しかも高頻度)

– sparseness の解消

• 特に文字セットが巨大な場合に重要(後述)

– モデルの圧縮

• 判定時のメモリ・速度が有利に

• 文字の正規化が最も困難(要:言語の知識)

Page 43: ナイーブベイズによる言語判定

文字の正規化(基本)

• “stop character” の除外

– 数字や記号(¥x21-¥x40, General Punctuation 等)

• 特定の言語に対応する文字種の正規化

– 文字の「綴り」を言語判定に使う必要がない

– 文字種全体を代表となる1文字にまとめる

• モデルの圧縮に効果大

– ひらがな・カタカナ、特にハングル!

• 頻度は小さいが、言語判定の決め手となる文字

– ハングルの注音字母

Page 44: ナイーブベイズによる言語判定

文字の正規化(CJK漢字) (1)

• CJK漢字特有の問題

– 学習コーパスに「たまたま出現しない文字」

• 例: 「谢谢」、人名漢字

• 解決案:「頻度が似ている漢字」でグルーピングし、それぞれ代表文

字に正規化

• ★よく使われる文字をできるだけカバーするクラスタを作る

– 高頻度の共通文字で「負けている」と常に負ける

• 例:「的」

– 日本語、簡体字、繁体字で共通に使用。

– 日本語はひらがなカタカナもあるため、漢字の確率は低い

– 「的」を含むグループの確率の差のせいで、繁体字に判定されやすい

• ★できるだけ細かいクラスタを作りたい

Page 45: ナイーブベイズによる言語判定

文字の正規化(CJK漢字) (2)

• 大きすぎず、小さすぎない漢字クラスタを作る

– (1) K-meansによるクラスタ分類

• Wikipedia および Google News での tf-idf を特徴量とする

– 頻度をそのまま用いるよりはるかによい結果になる

• K=50 (アルファベットの個数 52 に合わせた)

– (2) 「常用漢字」による分類

• 簡体字: 现代汉语常用字表(3500字)

• 繁体字: Big5第1水準(5401字、「常用国字標準字体表」4808字を含む)

• 日本語: 常用漢字(2136字)+ JIS 第1水準(2965字) = 2998字

– 常用漢字だけでは、氏名や地名の漢字がほとんど入っていないため

– K-means のクラスタおよび、各「常用漢字」で集合積をとり、130のク

ラスタを作成

• +手動による補正……

Page 46: ナイーブベイズによる言語判定

文字の正規化(アラビア文字)

• 問題発生:ペルシャ語の判別が全滅(全てアラビア語に!!)

– 同じアラビア文字だが語派が全く違う→判別は容易なはず

• 原因:高頻度で使われる yeh のコードが異なる

– 学習コーパス(Wikipedia)では ی (¥u06cc, Farsi yeh) が(正しく)

使われている

– テストコーパス(Google News)では ي(¥u064a, Arabic yeh)

• 推測:アラビア語の文字コード CP-1256 には ¥u06cc にマッピングされる文字がないため、¥u064aで代用する手法が現場で定着している?

• 対策: ¥u06cc を ¥u064a に正規化

ペルシア語ではye( ی)の独立形・右接形には識別点を付けないが,付けているものをよく見かける。これはアラビア語キーボードでペルシア語を入力したときによく起こる問題である。また,OS

やブラウザーなどの環境によってはこの文字が正しく出ないため,ウェブでは確信犯的にアラビア語のyā’( ي)を使っていることが多い。

「アラビア語系文字の基礎知識」より

Page 47: ナイーブベイズによる言語判定

Experiments

Page 48: ナイーブベイズによる言語判定

評価

• 学習

– 対象言語数: 49言語

• Wikipedia にはもっと言語多いのでは?

– テストデータが用意できるもの

– 似すぎていて判別できないものを対象外

• 各言語プロファイルのサイズは30KB前後(JSON)

• テスト

– コーパス:Google News + 様々なニュースサイトの RSS

• マイナーな言語は RSS を配信しているニュースサイトを見つけるだ

けでも大変……

– 各言語ごとにランダムに 200件抽出

Page 49: ナイーブベイズによる言語判定

評価結果 (1)

言語 データ件数 正解数(率) 内訳af アフリカーンス語 200 199 (99.50%) en=1, af=199ar アラビア語 200 200 (100.00%) ar=200bg ブルガリア語 200 200 (100.00%) bg=200bn ベンガル語 200 200 (100.00%) bn=200cs チェコ語 200 200 (100.00%) cs=200da デンマーク語 200 179 (89.50%) da=179, no=14, en=7de ドイツ語 200 200 (100.00%) de=200el ギリシア語 200 200 (100.00%) el=200en 英語 200 200 (100.00%) en=200es スペイン語 200 200 (100.00%) es=200fa ペルシア語 200 200 (100.00%) fa=200fi フィンランド語 200 200 (100.00%) fi=200fr フランス語 200 200 (100.00%) fr=200gu グジャラート語 200 200 (100.00%) gu=200he ヘブライ語 200 200 (100.00%) he=200hi ヒンディー語 200 200 (100.00%) hi=200hr クロアチア語 200 200 (100.00%) hr=200hu ハンガリー語 200 200 (100.00%) hu=200id インドネシア語 200 200 (100.00%) id=200it イタリア語 200 200 (100.00%) it=200ja 日本語 200 200 (100.00%) ja=200kn カンナダ語 200 200 (100.00%) kn=200ko 朝鮮語(韓国語) 200 200 (100.00%) ko=200mk マケドニア語 200 200 (100.00%) mk=200ml マラヤーラム語 200 200 (100.00%) ml=200

Page 50: ナイーブベイズによる言語判定

評価結果 (2)

言語 データ件数 正解数(率) 内訳mr マラーティー語 200 200 (100.00%) mr=200ne ネパール語 200 200 (100.00%) ne=200nl オランダ語 200 200 (100.00%) nl=200no ノルウェー語 200 199 (99.50%) da=1, no=199pa パンジャーブ語 200 200 (100.00%) pa=200pl ポーランド語 200 200 (100.00%) pl=200pt ポルトガル語 200 200 (100.00%) pt=200ro ルーマニア語 200 200 (100.00%) ro=200ru ロシア語 200 200 (100.00%) ru=200sk スロバキア語 200 200 (100.00%) sk=200so ソマリ語 200 200 (100.00%) so=200sq アルバニア語 200 200 (100.00%) sq=200sv スウェーデン語 200 200 (100.00%) sv=200sw スワヒリ語 200 200 (100.00%) sw=200ta タミル語 200 200 (100.00%) ta=200te テルグ語 200 200 (100.00%) te=200th タイ語 200 200 (100.00%) th=200tl タガログ語 200 200 (100.00%) tl=200tr トルコ語 200 200 (100.00%) tr=200uk ウクライナ語 200 200 (100.00%) uk=200ur ウルドゥー語 200 200 (100.00%) ur=200vi ベトナム語 200 200 (100.00%) vi=200

zh-cn 中国語(簡体字) 200 200 (100.00%) zh-cn=200zh-tw 中国語(繁体字) 200 200 (100.00%) zh-tw=200

合計 9800 9777 (99.77%)

Page 51: ナイーブベイズによる言語判定

Conclusion

Page 52: ナイーブベイズによる言語判定

まとめ

• 99.8% で 49言語の判定可能な言語判定ライブ

ラリを開発

– オープンソース

• http://code.google.com/p/language-detection/

– ドキュメントは鋭意整備中……

• 90%までは簡単。でも実用レベルは99.*%~

– 理想:美しい理論で一発解答

– 現実:どこまでも泥臭い工夫の固まり

• 文字かわいいよ

Page 53: ナイーブベイズによる言語判定

Open issues

• アラビア語の母音記号をどう扱う?

• 複数言語で記述された文書の言語判別

–現行は「文書全体の言語の確率」のみ

– 「ここからここまでは○○語」は面白いが難しそう

• テキストにソースコードが入っていると……

Page 54: ナイーブベイズによる言語判定

参考文献

• 千野栄一編「世界のことば100語辞典 ヨーロッ

パ編」

• 町田和彦編「図説 世界の文字とことば」

• 世界の文字研究会「世界の文字の図典」

• 町田和彦「ニューエクスプレス ヒンディー語」

• 中村公則「らくらくペルシャ語 文法から会話」

• 道広勇司「アラビア系文字の基礎知識」

– http://moji.gr.jp/script/arabic/article01.html