Contenu connexe Similaire à ナイーブベイズによる言語判定 Similaire à ナイーブベイズによる言語判定 (20) Plus de Shuyo Nakatani (20) ナイーブベイズによる言語判定1. ナイーブベイズによる
言語判定
2010/9/25
中谷 秀洋@サイボウズ・ラボ
id:n_shuyo / @shuyo
3. 言語判定
• 不えられた文書が何語で書かれたものか判定
– 英語/スペイン語/日本語/中国語(繁体・簡体)/アラビア語/……
– 文字コードの判定を同時に行うこともあり(今回は対象外)
• 利用シーン
– 言語の絞り込み付で検索したい
– 言語別のフィルタを適用したい(SPAMフィルタとか)
• Web本文抽出でも言語固有の特徴量を使った
• 利用対象
– Web検索エンジン
• Apache Nutch ではクローラに言語判定モジュールが付属
– 掲示板 グローバル化!
• 例:日英中越入り交じりの書き込み
4. 自分で作らなくちゃダメ?
• 言語判定ライブラリは数少ない
– ニーズが限られている?
• Web検索だけ? でもこれからはグローバル化の時代!
– コーパス/モデルの構築が高コスト
• 対象言語の知識がどうしてもある程度かなり必要
• 対応言語数が少ない。精度が低い
– おおむね10言語程度。アジア系サポートなし
– “Thank you. ありがとうございます”
• → 「タガログ語かチェコ語かスロバキア語です」
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
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/
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 のランキングの類似度による判別。
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 を不えるのではなく人工蟻コロニーで推定する
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
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
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
15. 言語判別の流れ
• 学習: 学習コーパスから ������(������������ |������k ) を求める
– 最尤推定(MLE)なら
������������ の文書内のXi の頻度
������ ������������ ������������ =
言語������������の特徴量数
• 判定: 対象テキストから ������ ������k ������ を求める
(m) を更新
– テキストから特徴量 ������������ を抽出、 ������ ������k ������
(m+1) m
– ������ ������k ������ ∝ ������ ������k ������ ⋅ ������ ������������ ������������
– 正規化し、最大確率が閾値(0.99999)を超えたら終了
18. 言語系統と「文字」
• 文字は必ずしも言語の系統と関係しない
– 宗教上の理由
• カソリック→ラテン文字、ギリシャ正教→キリル文字
• イスラム→アラビア文字、ヒンズー→デーヴァナーガリー
– 「近代化」
• 旧体制との結びつきを連想させる文字を捨てる
• 普及した文字の方が、学習やコミュニケーションのコスト
が低い
22. Αλφάβητο
• 代表的な文字
– ラテン文字:ローマ・カソリックとともに普及
• アメリカ、ヨーロッパなど、最も多くの国・言語で使われる
• 意外なところではアフリカ諸国、東南アジアにも多い
– 植民地の文字をラテン文字表記に変えさせたり
• アルファベットに存在しない音があれば、付加記号を付
けて文字を増やす(拡張ラテン文字)
– キリル文字: ギリシャ正教とともに普及
• ロシア、東欧を中心に
• 旧・現 社会主義国にも多い(旧ソ連の仕業)
23. アラム文字系
• 中東で普及したアラム文字から派生
これは2文字!
• 主な特徴
– 右から左に続き字で書く
• 続き字の頭・真ん中・お尻で字形が変わる
• 活字より手書きをよしとする(新聞も手書き)
• 慣れないとどこからどこまでが1文字かわからない
ال
– 基本的に子音のみで表記される(「アブジャド」)
• 単語の意味によって母音がわかるので、知らない単語は読めない
• 文字がないせいか、母音が少ない(アラビア語は a/i/u のみ)
• クルアーンや子供向け文章は母音記号付き(「ふりがな」みたい)
– 文字種は 30 前後
• Unicodeでは派生文字(後述)も Arabic ブロックに含むため、コードポイ
ント数は256
24. أبجدية عربية
• 代表的な文字
– アラビア文字: イスラムの文字として普及
• イスラムの聖典クルアーン(コーラン)は「アラビア語のみ」。翻
訳されたものはクルアーンではない
• そのためイスラム圏の諸語では、アラビア文字に数文字加え
た派生文字が使われる傾向(ペルシャ文字、ウルドゥー文字)
– ヘブライ文字:ユダヤ民族の文字
• ヘブライ語:日常語としては一度消滅。20世紀に復活
• 世界各地のユダヤ人が現地の言葉をヘブライ文字で表す
– イディッシュ語 ≒ ドイツ語のヘブライ文字表記
– ジュデズモ語 ≒ スペイン語のヘブライ文字表記
26. देवनागरी
• 代表的な文字
– デーヴァナーガリー: ヒンズー教とともに普及
• ブラーフミー系にしては珍しく複数の言語で使われる(それで
も非常に少ないが)
– 言語固有文字
• 伝播先のインド国内や東南アジアで次々と独自の派生文字
が作られる
• テルグ文字、カンナダ文字、クメール文字、タイ文字、……
– ハングル文字:朝鮮で作られた人造文字
• 合字による音節文字の構成など、パスパ文字を参考に制定
されたと考えられる
27. 漢字系
• 甲骨文字(亀甲獣骨文字)の発展系
• 特徴
– 現行文字としては唯一の表意文字
• 言葉の全く異なる日本語と中国語でも、漢字を使えばある程
度の意思疎通が可能
– 「普通」は逆(口頭は通じるが筆談は×:ヒンディーとウルドゥー)
– 文字種数は数万~数十万と膨大
• 正確な数は「わからない」
• 常用漢字(よく使われる字)というカテゴリーがある(他の文字
にそんなのがあるわけない!)
28. 汉字
• 代表的な文字
– 漢字
• 現在は中国語(簡体字・繁体字)と日本語のみ
• 朝鮮での使用は事実上廃止(CJKなんだけど……)
• ベトナム語(チュノム):漢字を表意・表音の両方で用いるという
独特の体系。現在はラテン文字表記に
– ひらがな、カタカナ:漢字から作られた表音文字
• 現存する言語の中で、日本語は表意文字と表音文字の両方
を使う唯一の言語
• 全く同体系の2種類の表音文字を使い分けるのも日本語だけ
30. 言語判別の流れ(再掲)
• 学習: 学習コーパスから ������(������������ |������k ) を求める
– 最尤推定(MLE)なら
������������ の文書内のXi の頻度
������ ������������ ������������ =
言語������������の特徴量数
• 判定: 対象テキストから ������ ������k ������ を求める
(m) を更新
– テキストから特徴量 ������������ を抽出、 ������ ������k ������
(m+1) m
– ������ ������k ������ ∝ ������ ������k ������ ⋅ ������ ������������ ������������
– 正規化し、最大確率が閾値(0.99999)を超えたら終了
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 [判定したいファイル]
32. 評価(プロトタイプ)
• テスト方法
– コーパス : Google News から22言語
• RSSをクロールして収集
• 学習用 兼 テスト用。学習用はランダムに 300件抽出
• RSSの抜粋なのでデータの粒度(記事の長さ)が揃っている
• ノイズが非常に少ない
• 学習後のモデルサイズ
– JSON形式で出力して 1.2MB
• gzip圧縮して 280KB
34. プロトタイプの問題点
• コーパスに依存した作り
• Google Newsコーパスのpros/cons
– ○データの粒度(記事あたりの長さ)が揃っている
– ○ ノイズが少ない
• 適当にやっても、そこそこいい精度!!
– ○偏りの少ない表現を一箇所から拾える
• ソースが複数ニュースサイト
– ×未提供言語に対応できない(ペルシャ語などなど)
– ×まとまった量の入手に手間&時間がかかる
– ×コーパスを配布できない
36. 言語判定ライブラリ for Java
• オープンソースとして公開(Apache License 2.0)
– http://code.google.com/p/language-detection/
• プロトタイプ+コーパス変更
– 学習コーパスに Wikipedia の abstract データベース
ファイルを採用
• Wikipedia は 273 言語に展開(2010/09 現在)
– 特徴量に Jefferys-Peaks (ELE)
������������ の文書内のXi の頻度+������
• ������ ������������ ������������ = , where ������ = 0.5
言語������������ の特徴量数+V������
• ������ ������������ ������������ > 10−4 で足切り
38. (1) 学習コーパスのノイズ
• Wikipedia Abstract Database は意外とノイズだらけ
– abstract = 先頭1段落の抜粋
• 他言語での名称表記
– 由来となる言語での正式名を併記。n-gram に他言語のも
のが混ざる
– → 足切りで極力除外
• スタイル情報などの残留
– 本来、独自タグで囲まれているのだが、Abstract
Database ではタグのみ消えている(!!?)
– → 正規表現などで引っかけて、少しでも減らす
39. (2) 学習コーパスの不均一性
• 言語によって記事件数に大きな隔たり
– 英語:340万件, イタリア語:72万件
– デンマーク語:13万件, ソマリ語: 1400件
– 特徴量の分母が異なるため、discount 項の効き
方が言語によって異なってしまう
������������ の文書内のXi の頻度+������
• ������ ������������ ������������ = , where ������ = 0.5
言語������������の特徴量数+V������
– → 頻度の平均を用いて、分母を統一
40. (3) 文字種の偏り
• 漢字:文字種が他言語の1000倍!
• コーパスに出現しない文字
– Wikipedia で「谢」は使われない→ 「谢谢」が判定できない
– 日本人の人名漢字も同様
– → 文字の正規化時に「常用漢字」を考慮(後述)
• 日本語と繁体字の誤判定問題
– 確率を正規化すると、文字種が多い⇒確率小
• 共通文字について、文字種の多い言語が丌利
• アルファベットが混じっていると、負ける → ラテン文字ノイズ参照
– 漢字はかなり共通+日本語にはひらがな&カタカナ
• 漢字の日本語確率が下がりすぎ、繁体字判定されがち
– → 文字の正規化で解決(後述)
41. (4) 判定テキストのノイズ
• 言語に依存しない文字 → 単純に除去
– URL やメールアドレス
– 数字や記号(¥x21-¥x40, General Punctuation)
• ラテン文字ノイズ in 非ラテン文字
– 非ラテン文字の中にも頻繁に出現
• ある意味世界共通文字。でも精度低下の大きな要因
– → ラテン文字が2割以下なら除去
• ラテン文字ノイズ in ラテン文字
– 略字、人名は言語の特徴を表さない
• 特に人名はむしろ他の言語の特徴をもつことも
– → 全て大文字の単語は除去
– → 特徴サンプリングして、人名などの局所的な特徴の影響を低減
42. 文字の正規化
• 文字を(言語判定の観点で)統一されたものに置き換え
– 学習時・判定時の両方で行う
• そもそもなぜ正規化が必要?
– ノイズ除去
• 言語に依存しない記号・アラビア数字(しかも高頻度)
– sparseness の解消
• 特に文字セットが巨大な場合に重要(後述)
– モデルの圧縮
• 判定時のメモリ・速度が有利に
• 文字の正規化が最も困難(要:言語の知識)
43. 文字の正規化(基本)
• “stop character” の除外
– 数字や記号(¥x21-¥x40, General Punctuation 等)
• 特定の言語に対応する文字種の正規化
– 文字の「綴り」を言語判定に使う必要がない
– 文字種全体を代表となる1文字にまとめる
• モデルの圧縮に効果大
– ひらがな・カタカナ、特にハングル!
• 頻度は小さいが、言語判定の決め手となる文字
– ハングルの注音字母
44. 文字の正規化(CJK漢字) (1)
• CJK漢字特有の問題
– 学習コーパスに「たまたま出現しない文字」
• 例: 「谢谢」、人名漢字
• 解決案:「頻度が似ている漢字」でグルーピングし、それぞれ代表文
字に正規化
• ★よく使われる文字をできるだけカバーするクラスタを作る
– 高頻度の共通文字で「負けている」と常に負ける
• 例:「的」
– 日本語、簡体字、繁体字で共通に使用。
– 日本語はひらがなカタカナもあるため、漢字の確率は低い
– 「的」を含むグループの確率の差のせいで、繁体字に判定されやすい
• ★できるだけ細かいクラスタを作りたい
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のク
ラスタを作成
• +手動による補正……
46. 文字の正規化(アラビア文字)
• 問題発生:ペルシャ語の判別が全滅(全てアラビア語に!!)
– 同じアラビア文字だが語派が全く違う→判別は容易なはず
• 原因:高頻度で使われる yeh のコードが異なる
– 学習コーパス(Wikipedia)では ¥( یu06cc, Farsi yeh) が(正しく)
使われている
– テストコーパス(Google News)では ¥(يu064a, Arabic yeh)
• 推測:アラビア語の文字コード CP-1256 には ¥u06cc にマッピングされ
る文字がないため、¥u064aで代用する手法が現場で定着している?
• 対策: ¥u06cc を ¥u064a に正規化
ペルシア語ではye( )یの独立形・右接形には識別点を付けないが,付けているものをよく見かけ
る。これはアラビア語キーボードでペルシア語を入力したときによく起こる問題である。また,OS
やブラウザーなどの環境によってはこの文字が正しく出ないため,ウェブでは確信犯的にアラビ
ア語のyā’( )يを使っていることが多い。
「アラビア語系文字の基礎知識」より
48. 評価
• 学習
– 対象言語数: 49言語
• Wikipedia にはもっと言語多いのでは?
– テストデータが用意できるもの
– 似すぎていて判別できないものを対象外
• 各言語プロファイルのサイズは30KB前後(JSON)
• テスト
– コーパス:Google News + 様々なニュースサイトの RSS
• マイナーな言語は RSS を配信しているニュースサイトを見つけるだ
けでも大変……
– 各言語ごとにランダムに 200件抽出
49. 評価結果 (1)
言語 データ件数 正解数(率) 内訳
af アフリカーンス語 200 199 (99.50%) en=1, af=199
ar アラビア語 200 200 (100.00%) ar=200
bg ブルガリア語 200 200 (100.00%) bg=200
bn ベンガル語 200 200 (100.00%) bn=200
cs チェコ語 200 200 (100.00%) cs=200
da デンマーク語 200 179 (89.50%) da=179, no=14, en=7
de ドイツ語 200 200 (100.00%) de=200
el ギリシア語 200 200 (100.00%) el=200
en 英語 200 200 (100.00%) en=200
es スペイン語 200 200 (100.00%) es=200
fa ペルシア語 200 200 (100.00%) fa=200
fi フィンランド語 200 200 (100.00%) fi=200
fr フランス語 200 200 (100.00%) fr=200
gu グジャラート語 200 200 (100.00%) gu=200
he ヘブライ語 200 200 (100.00%) he=200
hi ヒンディー語 200 200 (100.00%) hi=200
hr クロアチア語 200 200 (100.00%) hr=200
hu ハンガリー語 200 200 (100.00%) hu=200
id インドネシア語 200 200 (100.00%) id=200
it イタリア語 200 200 (100.00%) it=200
ja 日本語 200 200 (100.00%) ja=200
kn カンナダ語 200 200 (100.00%) kn=200
ko 朝鮮語(韓国語) 200 200 (100.00%) ko=200
mk マケドニア語 200 200 (100.00%) mk=200
ml マラヤーラム語 200 200 (100.00%) ml=200
50. 評価結果 (2)
言語 データ件数 正解数(率) 内訳
mr マラーティー語 200 200 (100.00%) mr=200
ne ネパール語 200 200 (100.00%) ne=200
nl オランダ語 200 200 (100.00%) nl=200
no ノルウェー語 200 199 (99.50%) da=1, no=199
pa パンジャーブ語 200 200 (100.00%) pa=200
pl ポーランド語 200 200 (100.00%) pl=200
pt ポルトガル語 200 200 (100.00%) pt=200
ro ルーマニア語 200 200 (100.00%) ro=200
ru ロシア語 200 200 (100.00%) ru=200
sk スロバキア語 200 200 (100.00%) sk=200
so ソマリ語 200 200 (100.00%) so=200
sq アルバニア語 200 200 (100.00%) sq=200
sv スウェーデン語 200 200 (100.00%) sv=200
sw スワヒリ語 200 200 (100.00%) sw=200
ta タミル語 200 200 (100.00%) ta=200
te テルグ語 200 200 (100.00%) te=200
th タイ語 200 200 (100.00%) th=200
tl タガログ語 200 200 (100.00%) tl=200
tr トルコ語 200 200 (100.00%) tr=200
uk ウクライナ語 200 200 (100.00%) uk=200
ur ウルドゥー語 200 200 (100.00%) ur=200
vi ベトナム語 200 200 (100.00%) vi=200
zh-cn 中国語(簡体字) 200 200 (100.00%) zh-cn=200
zh-tw 中国語(繁体字) 200 200 (100.00%) zh-tw=200
合計 9800 9777 (99.77%)
52. まとめ
• 99.8% で 49言語の判定可能な言語判定ライブ
ラリを開発
– オープンソース
• http://code.google.com/p/language-detection/
– ドキュメントは鋭意整備中……
• 90%までは簡単。でも実用レベルは99.*%~
– 理想:美しい理論で一発解答
– 現実:どこまでも泥臭い工夫の固まり
• 文字かわいいよ
54. 参考文献
• 千野栄一編「世界のことば100語辞典 ヨーロッ
パ編」
• 町田和彦編「図説 世界の文字とことば」
• 世界の文字研究会「世界の文字の図典」
• 町田和彦「ニューエクスプレス ヒンディー語」
• 中村公則「らくらくペルシャ語 文法から会話」
• 道広勇司「アラビア系文字の基礎知識」
– http://moji.gr.jp/script/arabic/article01.html