ナイーブベイズによる
   言語判定
       2010/9/25
中谷 秀洋@サイボウズ・ラボ
  id:n_shuyo / @shuyo
Introduction
言語判定
• 不えられた文書が何語で書かれたものか判定
 – 英語/スペイン語/日本語/中国語(繁体・簡体)/アラビア語/……
 – 文字コードの判定を同時に行うこともあり(今回は対象外)
• 利用シーン
 – 言語の絞り込み付で検索したい
 – 言語別のフィルタを適用したい(SPAMフィルタとか)
   • Web本文抽出でも言語固有の特徴量を使った
• 利用対象
 – Web検索エンジン
   • Apache Nutch ではクローラに言語判定モジュールが付属
 – 掲示板                       グローバル化!
   • 例:日英中越入り交じりの書き込み
自分で作らなくちゃダメ?
• 言語判定ライブラリは数少ない
 – ニーズが限られている?
   • Web検索だけ? でもこれからはグローバル化の時代!
 – コーパス/モデルの構築が高コスト
   • 対象言語の知識がどうしてもある程度かなり必要

• 対応言語数が少ない。精度が低い
 – おおむね10言語程度。アジア系サポートなし
 – “Thank you. ありがとうございます”
   • → 「タガログ語かチェコ語かスロバキア語です」
Related Works
既存の言語判定サービス
• 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
既存の言語判定ライブラリ
•   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/
言語判定の論文 (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 のランキングの類似度による判別。
言語判定の論文 (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 を不えるのではなく人工蟻コロニーで推定する
やっぱり自分で作らなきゃダメみたい
• 使いやすいライブラリがない
• 速度が遅い
• 対応言語が少ない(特にアジア系)
• 類似度ベースのものが多い
 – 値を絶対評価できない


• (個人的に)確率的手法の方が好き♪
 – ナイーブベイズで十分じゃあないかなあ
Our Approach
ナイーブベイズによる文書分類
                                                                          本当は独立なわけ
• 文書  = ( ) をカテゴリ  に分類する問題                                      ないんだけどね!

  – 文書は単語  の集合と見なす(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
ナイーブベイズによる「言語判定」
• 「言語」をカテゴリとした文書分類を行う
 – 文書が「英語」に分類されるか、「日本語」に分類されるか判定
• 特徴量に単語ではなく「文字 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
文字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
言語判別の流れ
• 学習: 学習コーパスから ( |k ) を求める
  – 最尤推定(MLE)なら

                      の文書内のXi の頻度
       =
                        言語の特徴量数
• 判定: 対象テキストから  k  を求める
                                                           (m) を更新
  – テキストから特徴量  を抽出、  k 
                (m+1)                 m
  –  k            ∝  k        ⋅   
  – 正規化し、最大確率が閾値(0.99999)を超えたら終了
Preparation
「文字」について予習
• 世界で使われる文字は大きく4つに分類される
 – アルファベット(ギリシャ文字系)
 – アラム文字系
 – ブラーフミー文字系
 – 漢字系
言語系統と「文字」
• 文字は必ずしも言語の系統と関係しない
 – 宗教上の理由
  • カソリック→ラテン文字、ギリシャ正教→キリル文字
  • イスラム→アラビア文字、ヒンズー→デーヴァナーガリー
 – 「近代化」
  • 旧体制との結びつきを連想させる文字を捨てる
  • 普及した文字の方が、学習やコミュニケーションのコスト
    が低い
言語-文字対応表(1)
• 同じ枠内の言語間は判別しにくい傾向がある
言語-文字対応表(2)
• 文字と語派がほぼ単独対応する言語
 – 文字=言語なので、比較的容易に判別可能
アルファベット(ギリシャ文字系)
• ギリシャ文字から派生(alpha-beta)
• 主な特徴(文字ごとに例外有り)
 – 子音文字と母音文字を個別に持つ
   • 表音文字として非常に優秀。多くの言語が「アルファベット表
     記」を持つ
 – 大文字と小文字の区別がある
   • ギリシャ文字とラテン文字に分岐したあと、両方に大文字小
     文字の区別が出来た
 – 文字種は 30 前後
 – UTF-8でも2バイト以下で表現可能
   • コードブロックの「いい場所」を取っているw
Αλφάβητο
• 代表的な文字
 – ラテン文字:ローマ・カソリックとともに普及
  • アメリカ、ヨーロッパなど、最も多くの国・言語で使われる
  • 意外なところではアフリカ諸国、東南アジアにも多い
    – 植民地の文字をラテン文字表記に変えさせたり
  • アルファベットに存在しない音があれば、付加記号を付
    けて文字を増やす(拡張ラテン文字)
 – キリル文字: ギリシャ正教とともに普及
  • ロシア、東欧を中心に
  • 旧・現 社会主義国にも多い(旧ソ連の仕業)
アラム文字系
• 中東で普及したアラム文字から派生
                                      これは2文字!
• 主な特徴
 – 右から左に続き字で書く
   • 続き字の頭・真ん中・お尻で字形が変わる
   • 活字より手書きをよしとする(新聞も手書き)
   • 慣れないとどこからどこまでが1文字かわからない
                                         ‫ال‬
 – 基本的に子音のみで表記される(「アブジャド」)
   • 単語の意味によって母音がわかるので、知らない単語は読めない
   • 文字がないせいか、母音が少ない(アラビア語は a/i/u のみ)
   • クルアーンや子供向け文章は母音記号付き(「ふりがな」みたい)
 – 文字種は 30 前後
   • Unicodeでは派生文字(後述)も Arabic ブロックに含むため、コードポイ
     ント数は256
‫أبجدية عربية‬
• 代表的な文字
 – アラビア文字: イスラムの文字として普及
  • イスラムの聖典クルアーン(コーラン)は「アラビア語のみ」。翻
    訳されたものはクルアーンではない
  • そのためイスラム圏の諸語では、アラビア文字に数文字加え
    た派生文字が使われる傾向(ペルシャ文字、ウルドゥー文字)
 – ヘブライ文字:ユダヤ民族の文字
  • ヘブライ語:日常語としては一度消滅。20世紀に復活
  • 世界各地のユダヤ人が現地の言葉をヘブライ文字で表す
    – イディッシュ語 ≒ ドイツ語のヘブライ文字表記
    – ジュデズモ語 ≒ スペイン語のヘブライ文字表記
ブラーフミー文字系
• 古代インド発祥のブラーフミー文字から派生
• 主な特徴(文字ごとに例外有り)
 – 潜在母音を持つ子音文字+母音付加文字+補助記
   号(「アブギダ」)
   • 母音なし=「ア」。母音文字付き=「イ」など他の母音
   • 日本語の「五十音」もインドの文字体系を参考に
 – 言語ごとに固有の文字が作られる
   • 「丸くてかわいらしい」ものがおおい      తెలుగు
   • 固有の数字文字を持つ          ๐๑๒๓๔๕๖๗๘๙
 – 文字種数は子音 30 前後、付加文字等 10~20
देवनागरी
• 代表的な文字
 – デーヴァナーガリー: ヒンズー教とともに普及
  • ブラーフミー系にしては珍しく複数の言語で使われる(それで
    も非常に少ないが)
 – 言語固有文字
  • 伝播先のインド国内や東南アジアで次々と独自の派生文字
    が作られる
  • テルグ文字、カンナダ文字、クメール文字、タイ文字、……
 – ハングル文字:朝鮮で作られた人造文字
  • 合字による音節文字の構成など、パスパ文字を参考に制定
    されたと考えられる
漢字系
• 甲骨文字(亀甲獣骨文字)の発展系
• 特徴
 – 現行文字としては唯一の表意文字
   • 言葉の全く異なる日本語と中国語でも、漢字を使えばある程
     度の意思疎通が可能
       – 「普通」は逆(口頭は通じるが筆談は×:ヒンディーとウルドゥー)

 – 文字種数は数万~数十万と膨大
   • 正確な数は「わからない」
   • 常用漢字(よく使われる字)というカテゴリーがある(他の文字
     にそんなのがあるわけない!)
汉字
• 代表的な文字
 – 漢字
  • 現在は中国語(簡体字・繁体字)と日本語のみ
  • 朝鮮での使用は事実上廃止(CJKなんだけど……)
  • ベトナム語(チュノム):漢字を表意・表音の両方で用いるという
    独特の体系。現在はラテン文字表記に

 – ひらがな、カタカナ:漢字から作られた表音文字
  • 現存する言語の中で、日本語は表意文字と表音文字の両方
    を使う唯一の言語
  • 全く同体系の2種類の表音文字を使い分けるのも日本語だけ
Prototype
言語判別の流れ(再掲)
• 学習: 学習コーパスから ( |k ) を求める
  – 最尤推定(MLE)なら

                      の文書内のXi の頻度
       =
                        言語の特徴量数
• 判定: 対象テキストから  k  を求める
                                                           (m) を更新
  – テキストから特徴量  を抽出、  k 
                (m+1)                 m
  –  k            ∝  k        ⋅   
  – 正規化し、最大確率が閾値(0.99999)を超えたら終了
言語判定モジュール(プロトタイプ)
• 学習&判定を 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 [判定したいファイル]
評価(プロトタイプ)
• テスト方法
 – コーパス : Google News から22言語
   • RSSをクロールして収集
   • 学習用 兼 テスト用。学習用はランダムに 300件抽出
   • RSSの抜粋なのでデータの粒度(記事の長さ)が揃っている
   • ノイズが非常に少ない

• 学習後のモデルサイズ
 – JSON形式で出力して 1.2MB
   • gzip圧縮して 280KB
評価結果(プロトタイプ)
• 22言語平均で 98.6~99.7% の精度
プロトタイプの問題点
• コーパスに依存した作り
• Google Newsコーパスのpros/cons
  – ○データの粒度(記事あたりの長さ)が揃っている
  – ○ ノイズが少ない
    • 適当にやっても、そこそこいい精度!!
  – ○偏りの少ない表現を一箇所から拾える
    • ソースが複数ニュースサイト
  – ×未提供言語に対応できない(ペルシャ語などなど)
  – ×まとまった量の入手に手間&時間がかかる
  – ×コーパスを配布できない
Main Subject
言語判定ライブラリ 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 で足切り
当初、まったく精度が出ない
• 初期版では平均精度が70%程度
 – 日本語、繁体字、ロシア語などが50%未満……
• 精度低下の要因:
 – (1) 学習コーパスのノイズ
 – (2) 学習コーパスの丌均一性
 – (3) 文字種の偏り
 – (4) 判定テキストのノイズ
(1) 学習コーパスのノイズ
• Wikipedia Abstract Database は意外とノイズだらけ
                          – abstract = 先頭1段落の抜粋

• 他言語での名称表記
  – 由来となる言語での正式名を併記。n-gram に他言語のも
    のが混ざる
  –   → 足切りで極力除外
• スタイル情報などの残留
  – 本来、独自タグで囲まれているのだが、Abstract
    Database ではタグのみ消えている(!!?)
  –   → 正規表現などで引っかけて、少しでも減らす
(2) 学習コーパスの不均一性
• 言語によって記事件数に大きな隔たり
 – 英語:340万件, イタリア語:72万件
 – デンマーク語:13万件, ソマリ語: 1400件
 – 特徴量の分母が異なるため、discount 項の効き
  方が言語によって異なってしまう

                      の文書内のXi の頻度+
  •    =                         , where  = 0.5
                     言語の特徴量数+V
 – → 頻度の平均を用いて、分母を統一
(3) 文字種の偏り
• 漢字:文字種が他言語の1000倍!
• コーパスに出現しない文字
 – Wikipedia で「谢」は使われない→ 「谢谢」が判定できない
 – 日本人の人名漢字も同様
 –   → 文字の正規化時に「常用漢字」を考慮(後述)
• 日本語と繁体字の誤判定問題
 – 確率を正規化すると、文字種が多い⇒確率小
     • 共通文字について、文字種の多い言語が丌利
     • アルファベットが混じっていると、負ける → ラテン文字ノイズ参照
 – 漢字はかなり共通+日本語にはひらがな&カタカナ
     • 漢字の日本語確率が下がりすぎ、繁体字判定されがち
 –   → 文字の正規化で解決(後述)
(4) 判定テキストのノイズ
• 言語に依存しない文字 → 単純に除去
  – URL やメールアドレス
  – 数字や記号(¥x21-¥x40, General Punctuation)
• ラテン文字ノイズ in 非ラテン文字
  – 非ラテン文字の中にも頻繁に出現
      • ある意味世界共通文字。でも精度低下の大きな要因
  –   → ラテン文字が2割以下なら除去
• ラテン文字ノイズ in ラテン文字
  – 略字、人名は言語の特徴を表さない
      • 特に人名はむしろ他の言語の特徴をもつことも
  –   → 全て大文字の単語は除去
  –   → 特徴サンプリングして、人名などの局所的な特徴の影響を低減
文字の正規化
• 文字を(言語判定の観点で)統一されたものに置き換え
 – 学習時・判定時の両方で行う
• そもそもなぜ正規化が必要?
 – ノイズ除去
   • 言語に依存しない記号・アラビア数字(しかも高頻度)
 – sparseness の解消
   • 特に文字セットが巨大な場合に重要(後述)
 – モデルの圧縮
   • 判定時のメモリ・速度が有利に


• 文字の正規化が最も困難(要:言語の知識)
文字の正規化(基本)
• “stop character” の除外
  – 数字や記号(¥x21-¥x40, General Punctuation 等)
• 特定の言語に対応する文字種の正規化
  – 文字の「綴り」を言語判定に使う必要がない
  – 文字種全体を代表となる1文字にまとめる
    • モデルの圧縮に効果大
       – ひらがな・カタカナ、特にハングル!
    • 頻度は小さいが、言語判定の決め手となる文字
       – ハングルの注音字母
文字の正規化(CJK漢字) (1)
• CJK漢字特有の問題
 – 学習コーパスに「たまたま出現しない文字」
   • 例: 「谢谢」、人名漢字
   • 解決案:「頻度が似ている漢字」でグルーピングし、それぞれ代表文
     字に正規化
   • ★よく使われる文字をできるだけカバーするクラスタを作る
 – 高頻度の共通文字で「負けている」と常に負ける
   • 例:「的」
     – 日本語、簡体字、繁体字で共通に使用。
     – 日本語はひらがなカタカナもあるため、漢字の確率は低い
     – 「的」を含むグループの確率の差のせいで、繁体字に判定されやすい
   • ★できるだけ細かいクラスタを作りたい
文字の正規化(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のク
   ラスタを作成
   • +手動による補正……
文字の正規化(アラビア文字)
• 問題発生:ペルシャ語の判別が全滅(全てアラビア語に!!)
  – 同じアラビア文字だが語派が全く違う→判別は容易なはず
• 原因:高頻度で使われる yeh のコードが異なる
  – 学習コーパス(Wikipedia)では ‫¥( ی‬u06cc, Farsi yeh) が(正しく)
    使われている
  – テストコーパス(Google News)では ‫¥(ي‬u064a, Arabic yeh)
     • 推測:アラビア語の文字コード CP-1256 には ¥u06cc にマッピングされ
       る文字がないため、¥u064aで代用する手法が現場で定着している?
• 対策: ¥u06cc を ¥u064a に正規化
ペルシア語ではye( ‫)ی‬の独立形・右接形には識別点を付けないが,付けているものをよく見かけ
る。これはアラビア語キーボードでペルシア語を入力したときによく起こる問題である。また,OS
やブラウザーなどの環境によってはこの文字が正しく出ないため,ウェブでは確信犯的にアラビ
ア語のyā’( ‫)ي‬を使っていることが多い。
                             「アラビア語系文字の基礎知識」より
Experiments
評価
• 学習
  – 対象言語数: 49言語
    • Wikipedia にはもっと言語多いのでは?
        – テストデータが用意できるもの
        – 似すぎていて判別できないものを対象外
    • 各言語プロファイルのサイズは30KB前後(JSON)
• テスト
  – コーパス:Google News + 様々なニュースサイトの RSS
    • マイナーな言語は RSS を配信しているニュースサイトを見つけるだ
      けでも大変……
  – 各言語ごとにランダムに 200件抽出
評価結果 (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
評価結果 (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%)
Conclusion
まとめ
• 99.8% で 49言語の判定可能な言語判定ライブ
  ラリを開発
 – オープンソース
   • http://code.google.com/p/language-detection/
 – ドキュメントは鋭意整備中……
• 90%までは簡単。でも実用レベルは99.*%~
 – 理想:美しい理論で一発解答
 – 現実:どこまでも泥臭い工夫の固まり
• 文字かわいいよ
Open issues
• アラビア語の母音記号をどう扱う?
• 複数言語で記述された文書の言語判別
 – 現行は「文書全体の言語の確率」のみ
 – 「ここからここまでは○○語」は面白いが難しそう
• テキストにソースコードが入っていると……
参考文献
• 千野栄一編「世界のことば100語辞典 ヨーロッ
  パ編」
• 町田和彦編「図説 世界の文字とことば」
• 世界の文字研究会「世界の文字の図典」
• 町田和彦「ニューエクスプレス ヒンディー語」
• 中村公則「らくらくペルシャ語 文法から会話」
• 道広勇司「アラビア系文字の基礎知識」
 – http://moji.gr.jp/script/arabic/article01.html

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

  • 1.
    ナイーブベイズによる 言語判定 2010/9/25 中谷 秀洋@サイボウズ・ラボ id:n_shuyo / @shuyo
  • 2.
  • 3.
    言語判定 • 不えられた文書が何語で書かれたものか判定 –英語/スペイン語/日本語/中国語(繁体・簡体)/アラビア語/…… – 文字コードの判定を同時に行うこともあり(今回は対象外) • 利用シーン – 言語の絞り込み付で検索したい – 言語別のフィルタを適用したい(SPAMフィルタとか) • Web本文抽出でも言語固有の特徴量を使った • 利用対象 – Web検索エンジン • Apache Nutch ではクローラに言語判定モジュールが付属 – 掲示板 グローバル化! • 例:日英中越入り交じりの書き込み
  • 4.
    自分で作らなくちゃダメ? • 言語判定ライブラリは数少ない –ニーズが限られている? • Web検索だけ? でもこれからはグローバル化の時代! – コーパス/モデルの構築が高コスト • 対象言語の知識がどうしてもある程度かなり必要 • 対応言語数が少ない。精度が低い – おおむね10言語程度。アジア系サポートなし – “Thank you. ありがとうございます” • → 「タガログ語かチェコ語かスロバキア語です」
  • 5.
  • 6.
    既存の言語判定サービス • Google AJAXLanguage 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 を不えるのではなく人工蟻コロニーで推定する
  • 10.
    やっぱり自分で作らなきゃダメみたい • 使いやすいライブラリがない • 速度が遅い •対応言語が少ない(特にアジア系) • 類似度ベースのものが多い – 値を絶対評価できない • (個人的に)確率的手法の方が好き♪ – ナイーブベイズで十分じゃあないかなあ
  • 11.
  • 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)を超えたら終了
  • 16.
  • 17.
    「文字」について予習 • 世界で使われる文字は大きく4つに分類される –アルファベット(ギリシャ文字系) – アラム文字系 – ブラーフミー文字系 – 漢字系
  • 18.
    言語系統と「文字」 • 文字は必ずしも言語の系統と関係しない –宗教上の理由 • カソリック→ラテン文字、ギリシャ正教→キリル文字 • イスラム→アラビア文字、ヒンズー→デーヴァナーガリー – 「近代化」 • 旧体制との結びつきを連想させる文字を捨てる • 普及した文字の方が、学習やコミュニケーションのコスト が低い
  • 19.
  • 20.
    言語-文字対応表(2) • 文字と語派がほぼ単独対応する言語 –文字=言語なので、比較的容易に判別可能
  • 21.
    アルファベット(ギリシャ文字系) • ギリシャ文字から派生(alpha-beta) • 主な特徴(文字ごとに例外有り) – 子音文字と母音文字を個別に持つ • 表音文字として非常に優秀。多くの言語が「アルファベット表 記」を持つ – 大文字と小文字の区別がある • ギリシャ文字とラテン文字に分岐したあと、両方に大文字小 文字の区別が出来た – 文字種は 30 前後 – UTF-8でも2バイト以下で表現可能 • コードブロックの「いい場所」を取っているw
  • 22.
    Αλφάβητο • 代表的な文字 –ラテン文字:ローマ・カソリックとともに普及 • アメリカ、ヨーロッパなど、最も多くの国・言語で使われる • 意外なところではアフリカ諸国、東南アジアにも多い – 植民地の文字をラテン文字表記に変えさせたり • アルファベットに存在しない音があれば、付加記号を付 けて文字を増やす(拡張ラテン文字) – キリル文字: ギリシャ正教とともに普及 • ロシア、東欧を中心に • 旧・現 社会主義国にも多い(旧ソ連の仕業)
  • 23.
    アラム文字系 • 中東で普及したアラム文字から派生 これは2文字! • 主な特徴 – 右から左に続き字で書く • 続き字の頭・真ん中・お尻で字形が変わる • 活字より手書きをよしとする(新聞も手書き) • 慣れないとどこからどこまでが1文字かわからない ‫ال‬ – 基本的に子音のみで表記される(「アブジャド」) • 単語の意味によって母音がわかるので、知らない単語は読めない • 文字がないせいか、母音が少ない(アラビア語は a/i/u のみ) • クルアーンや子供向け文章は母音記号付き(「ふりがな」みたい) – 文字種は 30 前後 • Unicodeでは派生文字(後述)も Arabic ブロックに含むため、コードポイ ント数は256
  • 24.
    ‫أبجدية عربية‬ • 代表的な文字 – アラビア文字: イスラムの文字として普及 • イスラムの聖典クルアーン(コーラン)は「アラビア語のみ」。翻 訳されたものはクルアーンではない • そのためイスラム圏の諸語では、アラビア文字に数文字加え た派生文字が使われる傾向(ペルシャ文字、ウルドゥー文字) – ヘブライ文字:ユダヤ民族の文字 • ヘブライ語:日常語としては一度消滅。20世紀に復活 • 世界各地のユダヤ人が現地の言葉をヘブライ文字で表す – イディッシュ語 ≒ ドイツ語のヘブライ文字表記 – ジュデズモ語 ≒ スペイン語のヘブライ文字表記
  • 25.
    ブラーフミー文字系 • 古代インド発祥のブラーフミー文字から派生 • 主な特徴(文字ごとに例外有り) – 潜在母音を持つ子音文字+母音付加文字+補助記 号(「アブギダ」) • 母音なし=「ア」。母音文字付き=「イ」など他の母音 • 日本語の「五十音」もインドの文字体系を参考に – 言語ごとに固有の文字が作られる • 「丸くてかわいらしい」ものがおおい తెలుగు • 固有の数字文字を持つ ๐๑๒๓๔๕๖๗๘๙ – 文字種数は子音 30 前後、付加文字等 10~20
  • 26.
    देवनागरी • 代表的な文字 –デーヴァナーガリー: ヒンズー教とともに普及 • ブラーフミー系にしては珍しく複数の言語で使われる(それで も非常に少ないが) – 言語固有文字 • 伝播先のインド国内や東南アジアで次々と独自の派生文字 が作られる • テルグ文字、カンナダ文字、クメール文字、タイ文字、…… – ハングル文字:朝鮮で作られた人造文字 • 合字による音節文字の構成など、パスパ文字を参考に制定 されたと考えられる
  • 27.
    漢字系 • 甲骨文字(亀甲獣骨文字)の発展系 • 特徴 – 現行文字としては唯一の表意文字 • 言葉の全く異なる日本語と中国語でも、漢字を使えばある程 度の意思疎通が可能 – 「普通」は逆(口頭は通じるが筆談は×:ヒンディーとウルドゥー) – 文字種数は数万~数十万と膨大 • 正確な数は「わからない」 • 常用漢字(よく使われる字)というカテゴリーがある(他の文字 にそんなのがあるわけない!)
  • 28.
    汉字 • 代表的な文字 –漢字 • 現在は中国語(簡体字・繁体字)と日本語のみ • 朝鮮での使用は事実上廃止(CJKなんだけど……) • ベトナム語(チュノム):漢字を表意・表音の両方で用いるという 独特の体系。現在はラテン文字表記に – ひらがな、カタカナ:漢字から作られた表音文字 • 現存する言語の中で、日本語は表意文字と表音文字の両方 を使う唯一の言語 • 全く同体系の2種類の表音文字を使い分けるのも日本語だけ
  • 29.
  • 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
  • 33.
  • 34.
    プロトタイプの問題点 • コーパスに依存した作り • GoogleNewsコーパスのpros/cons – ○データの粒度(記事あたりの長さ)が揃っている – ○ ノイズが少ない • 適当にやっても、そこそこいい精度!! – ○偏りの少ない表現を一箇所から拾える • ソースが複数ニュースサイト – ×未提供言語に対応できない(ペルシャ語などなど) – ×まとまった量の入手に手間&時間がかかる – ×コーパスを配布できない
  • 35.
  • 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 で足切り
  • 37.
    当初、まったく精度が出ない • 初期版では平均精度が70%程度 –日本語、繁体字、ロシア語などが50%未満…… • 精度低下の要因: – (1) 学習コーパスのノイズ – (2) 学習コーパスの丌均一性 – (3) 文字種の偏り – (4) 判定テキストのノイズ
  • 38.
    (1) 学習コーパスのノイズ • WikipediaAbstract 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ā’( ‫)ي‬を使っていることが多い。 「アラビア語系文字の基礎知識」より
  • 47.
  • 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%)
  • 51.
  • 52.
    まとめ • 99.8% で49言語の判定可能な言語判定ライブ ラリを開発 – オープンソース • http://code.google.com/p/language-detection/ – ドキュメントは鋭意整備中…… • 90%までは簡単。でも実用レベルは99.*%~ – 理想:美しい理論で一発解答 – 現実:どこまでも泥臭い工夫の固まり • 文字かわいいよ
  • 53.
    Open issues • アラビア語の母音記号をどう扱う? •複数言語で記述された文書の言語判別 – 現行は「文書全体の言語の確率」のみ – 「ここからここまでは○○語」は面白いが難しそう • テキストにソースコードが入っていると……
  • 54.
    参考文献 • 千野栄一編「世界のことば100語辞典 ヨーロッ パ編」 • 町田和彦編「図説 世界の文字とことば」 • 世界の文字研究会「世界の文字の図典」 • 町田和彦「ニューエクスプレス ヒンディー語」 • 中村公則「らくらくペルシャ語 文法から会話」 • 道広勇司「アラビア系文字の基礎知識」 – http://moji.gr.jp/script/arabic/article01.html