ナイーブベイズによる 言語判定 2010/9/25 中谷 秀洋@サイボウズ・ラボ id:n_shuyo / @shuyo
Nov 01, 2014
ナイーブベイズによる 言語判定
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 𝑋 を求める
– テキストから特徴量 𝑋𝑖 を抽出、 𝑝 𝐶k 𝑋(m)を更新
– 𝑝 𝐶k 𝑋(m+1) ∝ 𝑝 𝐶k 𝑋
m ⋅ 𝑝 𝑋𝑖 𝐶𝑘
– 正規化し、最大確率が閾値(0.99999)を超えたら終了
Preparation
「文字」について予習
• 世界で使われる文字は大きく4つに分類される
–アルファベット(ギリシャ文字系)
–アラム文字系
–ブラーフミー文字系
–漢字系
言語系統と「文字」
• 文字は必ずしも言語の系統と関係しない
–宗教上の理由
• カソリック→ラテン文字、ギリシャ正教→キリル文字
• イスラム→アラビア文字、ヒンズー→デーヴァナーガリー
– 「近代化」
• 旧体制との結びつきを連想させる文字を捨てる
• 普及した文字の方が、学習やコミュニケーションのコスト
が低い
言語-文字対応表(1)
• 同じ枠内の言語間は判別しにくい傾向がある
言語-文字対応表(2)
• 文字と語派がほぼ単独対応する言語
–文字=言語なので、比較的容易に判別可能
アルファベット(ギリシャ文字系)
• ギリシャ文字から派生(alpha-beta)
• 主な特徴(文字ごとに例外有り)
– 子音文字と母音文字を個別に持つ
• 表音文字として非常に優秀。多くの言語が「アルファベット表記」を持つ
– 大文字と小文字の区別がある
• ギリシャ文字とラテン文字に分岐したあと、両方に大文字小文字の区別が出来た
– 文字種は 30 前後
– UTF-8でも2バイト以下で表現可能
• コードブロックの「いい場所」を取っているw
Αλφάβητο
• 代表的な文字
– ラテン文字:ローマ・カソリックとともに普及
• アメリカ、ヨーロッパなど、最も多くの国・言語で使われる
• 意外なところではアフリカ諸国、東南アジアにも多い
– 植民地の文字をラテン文字表記に変えさせたり
• アルファベットに存在しない音があれば、付加記号を付
けて文字を増やす(拡張ラテン文字)
–キリル文字: ギリシャ正教とともに普及
• ロシア、東欧を中心に
• 旧・現 社会主義国にも多い(旧ソ連の仕業)
アラム文字系
• 中東で普及したアラム文字から派生
• 主な特徴
– 右から左に続き字で書く
• 続き字の頭・真ん中・お尻で字形が変わる
• 活字より手書きをよしとする(新聞も手書き)
• 慣れないとどこからどこまでが1文字かわからない
– 基本的に子音のみで表記される(「アブジャド」)
• 単語の意味によって母音がわかるので、知らない単語は読めない
• 文字がないせいか、母音が少ない(アラビア語は a/i/u のみ)
• クルアーンや子供向け文章は母音記号付き(「ふりがな」みたい)
– 文字種は 30 前後
• Unicodeでは派生文字(後述)も Arabic ブロックに含むため、コードポイント数は256
ال
これは2文字!
عربيةأبجدية
• 代表的な文字
– アラビア文字: イスラムの文字として普及
• イスラムの聖典クルアーン(コーラン)は「アラビア語のみ」。翻
訳されたものはクルアーンではない
• そのためイスラム圏の諸語では、アラビア文字に数文字加え
た派生文字が使われる傾向(ペルシャ文字、ウルドゥー文字)
– ヘブライ文字:ユダヤ民族の文字
• ヘブライ語:日常語としては一度消滅。20世紀に復活
• 世界各地のユダヤ人が現地の言葉をヘブライ文字で表す
– イディッシュ語 ≒ ドイツ語のヘブライ文字表記
– ジュデズモ語 ≒ スペイン語のヘブライ文字表記
ブラーフミー文字系
• 古代インド発祥のブラーフミー文字から派生
• 主な特徴(文字ごとに例外有り)
– 潜在母音を持つ子音文字+母音付加文字+補助記
号(「アブギダ」)
• 母音なし=「ア」。母音文字付き=「イ」など他の母音
• 日本語の「五十音」もインドの文字体系を参考に
– 言語ごとに固有の文字が作られる
• 「丸くてかわいらしい」ものがおおい
• 固有の数字文字を持つ
– 文字種数は子音 30 前後、付加文字等 10~20
తెలుగు ๐๑๒๓๔๕๖๗๘๙
दवेनागरी
• 代表的な文字
– デーヴァナーガリー: ヒンズー教とともに普及
• ブラーフミー系にしては珍しく複数の言語で使われる(それで
も非常に少ないが)
– 言語固有文字
• 伝播先のインド国内や東南アジアで次々と独自の派生文字
が作られる
• テルグ文字、カンナダ文字、クメール文字、タイ文字、……
– ハングル文字:朝鮮で作られた人造文字
• 合字による音節文字の構成など、パスパ文字を参考に制定
されたと考えられる
漢字系
• 甲骨文字(亀甲獣骨文字)の発展系
• 特徴
– 現行文字としては唯一の表意文字
• 言葉の全く異なる日本語と中国語でも、漢字を使えばある程
度の意思疎通が可能
– 「普通」は逆(口頭は通じるが筆談は×:ヒンディーとウルドゥー)
– 文字種数は数万~数十万と膨大
• 正確な数は「わからない」
• 常用漢字(よく使われる字)というカテゴリーがある(他の文字
にそんなのがあるわけない!)
汉字
• 代表的な文字
– 漢字
• 現在は中国語(簡体字・繁体字)と日本語のみ
• 朝鮮での使用は事実上廃止(CJKなんだけど……)
• ベトナム語(チュノム):漢字を表意・表音の両方で用いるという
独特の体系。現在はラテン文字表記に
– ひらがな、カタカナ:漢字から作られた表音文字
• 現存する言語の中で、日本語は表意文字と表音文字の両方
を使う唯一の言語
• 全く同体系の2種類の表音文字を使い分けるのも日本語だけ
Prototype
言語判別の流れ(再掲)
• 学習: 学習コーパスから 𝑝(𝑋𝑖|𝐶k) を求める
– 最尤推定(MLE)なら
𝑝 𝑋𝑖 𝐶𝑘 =𝐶𝑘の文書内のXiの頻度言語𝐶𝑘の特徴量数
• 判定: 対象テキストから 𝑝 𝐶k 𝑋 を求める
– テキストから特徴量 𝑋𝑖 を抽出、 𝑝 𝐶k 𝑋(m)を更新
– 𝑝 𝐶k 𝑋(m+1) ∝ 𝑝 𝐶k 𝑋
m ⋅ 𝑝 𝑋𝑖 𝐶𝑘
– 正規化し、最大確率が閾値(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
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 中国語(繁体字)
評価結果(プロトタイプ)
• 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の頻度+𝛼
言語𝐶𝑘の特徴量数+V𝛼, where 𝛼 = 0.5
• 𝑝 𝑋𝑖 𝐶𝑘 > 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の頻度+𝛼
言語𝐶𝑘の特徴量数+V𝛼, where 𝛼 = 0.5
– → 頻度の平均を用いて、分母を統一
(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=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
評価結果 (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%)
Conclusion
まとめ
• 99.8% で 49言語の判定可能な言語判定ライブ
ラリを開発
– オープンソース
• http://code.google.com/p/language-detection/
– ドキュメントは鋭意整備中……
• 90%までは簡単。でも実用レベルは99.*%~
– 理想:美しい理論で一発解答
– 現実:どこまでも泥臭い工夫の固まり
• 文字かわいいよ
Open issues
• アラビア語の母音記号をどう扱う?
• 複数言語で記述された文書の言語判別
–現行は「文書全体の言語の確率」のみ
– 「ここからここまでは○○語」は面白いが難しそう
• テキストにソースコードが入っていると……
参考文献
• 千野栄一編「世界のことば100語辞典 ヨーロッ
パ編」
• 町田和彦編「図説 世界の文字とことば」
• 世界の文字研究会「世界の文字の図典」
• 町田和彦「ニューエクスプレス ヒンディー語」
• 中村公則「らくらくペルシャ語 文法から会話」
• 道広勇司「アラビア系文字の基礎知識」
– http://moji.gr.jp/script/arabic/article01.html