∞-gram を使った短文言語判定

13,357 views
13,226 views

Published on

twitter のツイートのような短い文章を言語判定する

Published in: Technology
0 Comments
22 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
13,357
On SlideShare
0
From Embeds
0
Number of Embeds
5,934
Actions
Shares
0
Downloads
56
Comments
0
Likes
22
Embeds 0
No embeds

No notes for slide

∞-gram を使った短文言語判定

  1. 1. ∞-gram による短文言語判定 2011/11/23 TokyoNLP #8 中谷 秀洋@サイボウズ・ラボ @shuyo / id:n_shuyo
  2. 2. アジェンダ• 言語判定• 極大部分文字列• 実装• コーパス作りと正規化• 評価
  3. 3. 言語判定
  4. 4. これ何語?• Ik kan er nooit tegen als mensen me negeren.• Aha ich seh angeblich süß aus• Czy mógłbym zasnąć w przedmieściach Twoich myśli?• Ah. Tak. Så skal jeg bare finde ud af *hvordan*!• Det er ikke så digg nei å vi som har finale til helga....Skrekk og gru! Takk :)• tack kompis! Hade faktiskt tänkt maila dig på fb och fråga vart du tog vägen!• Çok doğru. En büyük hatayı yaptım.• Încântat de cunoștință.• Một người dân bị thương và bốn người mất tích sau khi một ngọn núi lửa ở miền trung...
  5. 5. 人間言語判定(一部)• ik があればオランダ語。• ich があればドイツ語。ß もドイツ語の特徴。• czy があればポーランド語。Ł, ń, ś, ź もポーランド語のみ• å があればデンマーク語かノルウェー語かスウェーデン語 – af があればデンマーク語。「ありがとう」は tak – nei があればノルウェー語。「ありがとう」は takk – och があればスウェーデン語。「ありがとう」は tack• ı (点のない i) か ğ があればトルコ語• ă や ș や ț があればルーマニア語 – ă はベトナム語でも使うが、似てないから大丈夫 – ş はトルコ語でも使うが、似てないから大丈夫• WinXP で表示されない文字がいっぱいあったらベトナム語(ぇ
  6. 6. これ何語?(解答編)• Ik kan er nooit tegen als mensen me negeren. オランダ語• Aha ich seh angeblich süß aus ドイツ語• Czy mógłbym zasnąć w przedmieściach Twoich myśli? ポーランド語• Ah. Tak. Så skal jeg bare finde ud af *hvordan*! デンマーク語• Det er ikke så digg nei å vi som har finale til helga....Skrekk og gru! Takk :) ノルウェー語• tack kompis! Hade faktiskt tänkt maila dig på fb och fråga vart du tog vägen! スウェーデン語• Çok doğru. En büyük hatayı yaptım. トルコ語• Încântat de cunoștință. ルーマニア語• Một người dân bị thương và bốn người mất tích sau khi một ngọn núi lửa ở miền trung... ベトナム語
  7. 7. 人間様の仕事じゃあ ないですね!
  8. 8. language-detection(langdetect) (中谷 2010)• 言語判定 Java ライブラリ – http://code.google.com/p/language-detection/ – Apache License 2.0• TokyoNLP #2 で発表 – http://d.hatena.ne.jp/n_shuyo/20100925/language_detection• Apache Solr の言語判定モジュールに – 次の 3.5 から同梱されるらしい
  9. 9. langdetect の中身• 1~3-gram + ベイジアンフィルタ – 特徴選択は出現率で足切り(単純)• 53言語について 99% 以上の精度で判定 – 各種正規化と組み合わせることで、シンプル な手法でも実用的な精度が出せた• ある程度の長さの文章が対象 – 20語~, 50文字~ 程度が目安 – 短い文章の判定が苦手(twitter とか)
  10. 10. langdetect でツイートを判定すると 言語 正解 件数 正解率 cs チェコ語 4,261 4,269 99.8% da デンマーク語 5,243 5,493 95.4% de ドイツ語 8,482 9,614 88.2% en 英語 8,798 9,600 91.6% es スペイン語 9,704 10,131 95.8% fi フィンランド語 2,235 2,241 99.7% fr フランス語 9,726 10,074 96.5% id インドネシア語 9,864 10,185 96.8% it イタリア語 9,852 10,166 96.9% nl オランダ語 8,450 9,682 87.3% no ノルウェー語 10,147 10,512 96.5% pl ポーランド語 9,830 9,886 99.4% pt ポルトガル語 8,708 9,461 92.0% ro ルーマニア語 3,793 4,057 93.5% sv スウェーデン語 9,667 9,932 97.3% tr トルコ語 10,153 10,309 98.5% vi ベトナム語 10,843 10,932 99.2% 139,756 146,544 95.4%• テストデータは17言語。3語以上のツイート (詳細後述)• langdetect に同梱のプロファイル(Wikipedia abstract で学習)を17言語に制限して使用• 小文字化して判定を行い、最大確率が 0.6 以上のものを判定結果として採用
  11. 11. 95% = 20個に 1個間違う
  12. 12. Chromium Compact Language Detection (CLD)• Google Chromium の言語判定部分をport – C++ 実装、Python バインディング – http://code.google.com/p/chromium-compact-language- detector/• langdetect の唯一のライバル? – 対応言語数 : CLD = 76, langdetect = 53 – 精度 : CLD = 98.82%, langdetect = 99.22% • Europarl データセット(17言語)での比較 – http://blog.mikemccandless.com/2011/10/accuracy-and- performance-of-googles.html
  13. 13. CLD でツイートを判定すると 言語 正解 件数 正解率 cs チェコ語 4,080 4,269 95.6% da デンマーク語 4,982 5,493 90.7% de ドイツ語 8,758 9,614 91.1% en 英語 8,443 9,600 87.9% es スペイン語 8,591 10,131 84.8% fi フィンランド語 2,240 2,241 100.0% fr フランス語 9,250 10,074 91.8% id インドネシア語 9,342 10,185 91.7% it イタリア語 9,157 10,166 90.1% nl オランダ語 8,942 9,682 92.4% no ノルウェー語 7,645 10,512 72.7% pl ポーランド語 9,679 9,886 97.9% pt ポルトガル語 8,167 9,461 86.3% ro ルーマニア語 3,824 4,057 94.3% sv スウェーデン語 9,500 9,932 95.7% tr トルコ語 9,956 10,309 96.6% vi ベトナム語 10,603 10,932 97.0% 133,159 146,544 90.9%• 判定範囲は76言語 (CLD には判定する対象言語を選択する方法がないっぽい)• 判定結果のms(マレー語) は id(インドネシア語)に同一視• nb(ノルウェー語ブールモーク)は no(ノルウェー語)と解釈
  14. 14. 短文の言語判定はやっぱり難しい(らしい)
  15. 15. 動機:それでも短文の言語判定したい?• twitter 向け多言語対応サービスとか – 他のサービスにも細切れのテキストはある – スケジュールとか、クエリーとか – langdetect の Issues の1割は短文判定に関するもの • http://code.google.com/p/language-detection/issues/detail?id=10• 複数の言語が交じった文書の言語判定 – チャンク(段落ごと、行ごと)に言語判定 – 短文の判定が出来れば、可能 • http://code.google.com/p/language-detection/issues/detail?id=7
  16. 16. 問題設定:「短文言語判定できる」とは?• やはり「精度 99% 以上」 – とはいえ「一語文」で達成は厳しすぎる…… – 「3語以上の文章で 99% 以上」を目標に• 文字種の混合は考えなくていい – 文字種ごとにチャンクに分ければいい – 判別が一番難しい文字種はラテン文字 • 話者 500万人以上いる言語だけで 25 以上
  17. 17. 方針:短文の言語判定するには?• 3-gram では素性が足りない (直感!) – 言語によっては短い素性で足りる • ベトナム語とか – 言語によっては長い素性が要る • ascii の範囲で済む言語間とか • 機能語の一致率がハンパない言語間とか• 「巨大な辞書を持つしかないのでは?」 – という議論を Issues 上でしたり – しかし辞書を手作りはありえない……• ⇒ 可変長の素性を効率的に作成・選択したい
  18. 18. 極大部分文字列
  19. 19. 全ての部分文字列を考慮した文書分類 [岡野原+ 2008]• 全ての部分文字列を素性とする多クラスロジ スティック回帰 – 極大部分文字列のみを用いても同値なモデル – 極大部分文字列は拡張 Suffix Array を使えば、 文字列長に対して線形時間で抽出できる• 特徴選択+L1正則化により、n-gramより高 い性能をもつ十分小さいモデルが得られる• 素性を TRIE に格納、予測(判定)も高速に
  20. 20. 極大部分文字列とは? (1)• (空でない)部分文字列の間に、ある種の 「包含関係」(半順序)を入れる abracadabra – “ra” ⊂ “bra“ ⇔ 全ての ”ra” は “bra” の 部分文字列として現れる – “a” は “bra“ だけではなく “ca” などの部分 文字列にもなるので “a” ⊄ “bra“ ※厳密には出現位置も考慮して定義する
  21. 21. 極大部分文字列とは? (2) abracadabra 自分より「大きい」 – “r” ⊂ “ra” ⊂ “bra“⊂ “abra“ 部分文字列がない – “c” ⊂ “ca” ⊂ ……⊂ “abracadabra“ • 1回だけ現れる部分文字列は文字列全体に含まれる – “a” はどの部分文字列とも包含関係を持たない• この包含関係における極大元が「極大部分文字列」• したがって abracadabra の極大部分文字列は “a”, “abra”, “abracadabra” の3つ
  22. 22. 極大部分文字列のメリット abracadabra• “ra” ⊂ “bra“ であるとき、 – “ra” と “bra“ の出現頻度(あるいは有無)は常に一致する• 特徴量(出現頻度や有無)を線形結合するモデルなら、 包含関係のある特徴量同士をくくり出せる – 例えばロジスティック回帰(対数線型モデル) – 極大部分文字列を代表元とすればいい 極大部分文字列だけで、全部分文字列を 使うのと同値なモデルが得られる ※ただし、未知の文書でも同じ包含関係が成り立っているとは限らない
  23. 23. 極大部分文字列 vs n-gram• 極大部分文字列は全部分文字列より小さい – 素性の長さはコーパスに応じて適宜変わる – 小さいコーパスなら 3~5-gram 程度 1-gram 69 1-gram 2188 2-gram 1186 2-gram 19749 3-gram 6283 3-gram 45032 4-gram 17709 4-gram 63754 5-gram 34912 5-gram 74997 極大~ 34058 極大~ 21088 Alices Adventures in Wonderland 吾輩は猫である 1~4章 (145283 バイト) (utf-8 / 256147 バイト) 「極大部分文字列 の味見 / 自然言語処理勉強会@東京 #3」より http://d.hatena.ne.jp/n_shuyo/20101107/suffix_array
  24. 24. 極大部分文字列の分布 極大部分文字列 n-gram gram 頻度≧2 頻度≧10 頻度≧1 頻度≧2 頻度≧10 1 66 56 79 72 57 2 1258 769 1817 1461 845 3 6715 2863 14074 8836 3623 4 14741 4110 48996 23572 6009 5 17253 2635 102573 35778 5004 6 14096 1691 156206 38142 3432 7 11466 1103 200885 35093 2123 8 8298 507 236085 29041 1066 9 5549 274 260642 22000 537 10 3855 119 277083 15899 249 11 2330 51 287635 10875 121 12 1443 15 294065 7366 62• 小文字化を含む正規化を行った英語ツイート 5090件(300KB)について、 素性の長さ(gram)とその種類数の分布をとったもの
  25. 25. 方針:短文の言語判定するには?• 3-gram では素性が足りない (直感!) – 言語によっては短い素性で足りる • ベトナム語とか – 言語によっては長い素性が要る • ascii の範囲で済む言語間とか • 機能語の一致率がハンパない言語間とか
  26. 26. 3-gram では足りないけど、 9-gram とか多すぎる!
  27. 27. そういうとき 極大部分文字列は素性として有効では?
  28. 28. 極大部分文字列の求め方• 極大部分文字列をナイーブに求めると、 文字列長 N に対して O(N2)• 「拡張 Suffix Array」を使うと、 2回以 上現れる極大部分文字列を線形時間で求 めることができる [岡野原+ 2008] – 1回現れる極大部分文字列は文字列全体のみ
  29. 29. 論文の残りは参考リンクでご紹介……
  30. 30. (拡張) Suffix Array• TokyoNLP #3「うきうき☆Compressed Suffix Array」 – http://d.hatena.ne.jp/echizen_tm/20101106/1289051060 – id:echizen_tm さんの Suffix Array 入門• [岡野原+ 2008] – 極大部分文字列の抽出に用いる方法について• esaxx : 岡野原さんによる拡張SAの実装 – http://code.google.com/p/esaxx/• esaxx で極大部分文字列を抽出(id:takeda25 さん) – http://d.hatena.ne.jp/takeda25/20101202/1291269994
  31. 31. 多クラスロジスティック回帰• 教師有り分類器 – 識別モデル – 非独立な特徴量が使える • 今回そこまで行けませんでしたが• パターン認識と機械学習(PRML) 4章 – 詳しく載ってますw
  32. 32. 特徴選択• [Perkins+ 2003] Grafting – 素性候補のうち、目標関数の勾配が最も大き いものから順に有効にしていく手法 – 今回使いません。
  33. 33. L1 正則化• 汎化性能を上げつつ、有効な素性を絞り込む• [Andrew+ 2007] OWL-QN – 省メモリな L1 準ニュートン法。論文内で使用• [Duchi+ 2009] FOBOS – オンライン L1 正則化• 劣微分を用いた最適化手法について(4) – http://research.preferred.jp/2010/12/subgradient-optimization-4/ – PFI 徳永さんによる FOBOS の紹介• [Tsuruoka+ ACL2009] Cumulative Penalty – FOBOS の「最後のデータに引っ張られて素性がつぶれにくい」という 点を改良 – 今回の実装で使用
  34. 34. TRIE• 前方一致が可能なデータ構造• DSIRNLP#1で発表しました「TRIEにトライ!~ 今日からはじめるTRIE入門~」 – http://d.hatena.ne.jp/echizen_tm/20110724/13 11519029 – id:echizen_tm さんのわかりやすい入門• WEB+DB Press vol. 64 「作って学ぶ日本語入力 ~かな漢字変換をどのように実現するか~」 – PFI 徳永さんの記事。TRIE および、今回の実装で用 いた Double Array の解説あり
  35. 35. 実装
  36. 36. Language Detection with Infinity-Gram (ldig)• ラテン文字言語判定器のプロトタイプ – https://github.com/shuyo/ldig – Python / numpy – MIT license – 多クラスLR + L1 SGD + Double Array• ターゲット : ツイートの言語判定 – twitter 特有の表現を正規化 – 各種言語向け正規化
  37. 37. 使い方 (1) モデルの初期化• ldig.py -m [モデル] --init [コーパス] -x [極大部分文字列抽出器] --ff=[頻度の最小値] – コーパスから素性を抽出し、モデルを初期化する – -m : モデルを格納するディレクトリ – -x : テキストから極大部分文字列を抽出する(外 部プロセスとして起動) – --ff : 素性を頻度で足きり
  38. 38. 極大部分文字列抽出器• maxsubst [input file] [output file] – 入力は複数行テキストファイル – 出力は ”[素性]¥t[頻度]” の形式 • タブは空白に置換、改行文字は U+0001 に置き換え• という仕様のツールを別途ご用意ください(ぇ – もちろん作ってあるが、未公開の社内ライブラリを組み込 んでいるのでまだ公開できない – そのうち公開できる、はず• なくてもモデルの新規作成が出来ないだけ – 既存モデルを使って言語判定するには問題なし
  39. 39. 配布モデル• github にてモデル(小)を配布中 – https://github.com/shuyo/ldig/tree/master/models – 展開すると model.small というディレクト リが作られる – -m オプションでこのディレクトリを指定
  40. 40. 使い方 (2) 学習• ldig.py -m [モデル] --learning [コーパス] -e [学習率] -r [正則化係数] --wr=[全体正則化を行う頻度] – SGD 1周分の学習を行う – -e : 学習率 – -r : 指定すると L1 正則化を行う – --wr : 全パラメータを正則化する回数 • パラメータが多くて非常に時間がかかるため、計算を サボっている……
  41. 41. 使い方 (3) モデル縮小• ldig.py -m [モデル] --shrink – 有効でない素性(=パラメータが全て0)を除外 して、モデルを小さくする
  42. 42. 使い方 (4) 言語判定• ldig.py -m [モデル] [テストデータ] – テストデータの言語判定を行い、結果とサマ リーを出力する
  43. 43. データ形式• 訓練データ・テストデータ共通 – [正解ラベル]¥t[テキスト]en Inside Sales Account Manager met sales driveen Just completed a 2.48 mi run with Check it out!en Vacancy: Senior Technical Advisor – Malariaen Which one? I cant decide!en Youre totally welcome :)en save by the bell so dom programma .
  44. 44. コーパス作成と正規化
  45. 45. コーパスの作り方• twitter Streaming API の sample メ ソッド – 全ツイートの 1%程度をサンプリング – 1日 200万件 • ラテン文字の言語はその6割程度• これに言語ラベルを振るだけの かんたんなお仕事
  46. 46. 言語ラベルを振る• ツイートをユーザのタイムゾーンごとに分類 – フランス語のツイートは全体の 1% 程度 ラテン文字中 7番目の多さ! – しかし Paris タイムゾーンに限れば 50% • ただし全体の2割はタイムゾーン未設定• langdetect で仮ラベルを振る – fr のツイートから、フランス語以外を除く(手作業) – fr 以外のツイートから、フランス語を拾う(手作業)• これを各言語ごとに繰り返し行い続ける
  47. 47. 手作業(イメージ図)
  48. 48. 手作業の一例Höb ne Preuvenelap gekreege vn .Dr zit dus mer eindeenk op: op naor t Vriethof.Tot ut is.Is de ...• (暫定)オランダ語のデータに含まれていた – オランダ語ではない – ドイツ語でもなさそう?• オランダのマーストリヒトでつぶやかれたものらしい – マーストリヒトについて調べる• どうやら「リンブルフ語」 – http://ja.wikipedia.org/wiki/リンブルフ語
  49. 49. 作成したデータセット 言語 訓練データ(小) 訓練データ(大) テストデータcs チェコ語 3,514 4,342da デンマーク語 4,007 5,654de ドイツ語 4,224 39,891 10,005en 英語 5,090 39,245 10,137es スペイン語 5,129 39,845 10,296fi フィンランド語 3,400 2,310fr フランス語 4,952 39,327 10,417id インドネシア語 5,034 39,878 10,397it イタリア語 4,187 39,996 10,561nl オランダ語 5,052 39,981 10,111no ノルウェー語 4,263 10,729pl ポーランド語 5,040 10,282pt ポルトガル語 5,054 39,451 9,754ro ルーマニア語 3,490 4,151sv スウェーデン語 4,330 40,000 10,230tr トルコ語 5,024 40,000 10,829vi ベトナム語 5,029 11,065 76,819 397,614 151,270
  50. 50. データ量の偏り• ラテン文字言語でつぶやかれているツイートの内訳 その他の言語は全部併せてこのくらい 英語 ポルトガル語 スペイン語 インドネシア語 オランダ語 フランス語 ドイツ語 トルコ語 イタリア語 スウェーデン語
  51. 51. データ量偏り対策• データを各言語ごとに重複サンプリング して、一番多い言語データの量にあわせ る – 実際には、「データの整数倍+余り分を重複 無しサンプリング」で近似
  52. 52. ところで
  53. 53. そもそも「ラテン文字」って? • ラテン文字 ≠ ascii アルファベット – å とか ą とか æ とか ð とか Ħ とか ŋ とかも • ユニコードで9個のコードブロックに割り当て 範囲 名称 日本語名称 備考U+0000-007F Basic Latin 基本ラテン文字 asciiU+0080-00FF Latin-1 Supplement ラテン1補助 ほとんどの言語はここU+0100-017F Latin Extended-A ラテン文字拡張A まででカバーU+0180-024F Latin Extended-B ラテン文字拡張B ルーマニア語くらい?U+0250-02AF IPA Extensions IPA拡張 (国際音声記号) Combining DiacriticalU+0300-036F ダイアクリティカルマーク 声調記号などを合成 Marks Latin ExtendedU+1E00-1EFF ラテン文字拡張追加 実質、ベトナム語専用 AdditionalU+2C60-2C7F Latin Extended-C ラテン文字拡張C 現代語では ほぼ使われU+A720-A7FF Latin Extended-D ラテン文字拡張D ない
  54. 54. ざっくり眺めるとこんな感じ まるっとよく使う ところどころ使う ベトナム語用
  55. 55. 小文字化• コーパスが乏しい – 大文字と小文字を別々の文字にするなんてもった いない!• モデルが巨大(後述) – 小文字化すればだいぶ小さくなる• Double Array 的に文字種が少ないと嬉しい – 詳細省略w
  56. 56. トルコ語を考慮した小文字化 大文字 小文字トルコ語以外 I (U+0049) i (U+0069) I (U+0049) ı (U+0131) トルコ語 İ (U+0130) i (U+0069)• トルコ語は I (U+0049) の小文字が異なる – Java, Python の小文字化はロケールを考慮• I と i で意味が異なる言語もある• ⇒ I を除外して小文字化
  57. 57. ルーマニア語文字の正規化• a~z 以外に â, ă, î, ș, ț の5文字を使う – ă, ș, ț があれば十中八九ルーマニア語 • ă はベトナム語、 ş はトルコ語で使うが、似てないからOK w• 「ヒゲ付き s/t」にはそれぞれ 2種類ある – U+0218-B : カンマ下付き s/t – U+015E-F, U+0162-3 : セディーユ付き s/t • しかも同じ「カンマ下付き」にデザインされたフォントも多い • つまり、見分けがつかない ș ş ț ţ どっちが 正解? U+0219 U+015F U+021B U+0163
  58. 58. 両方正解• 正書法が定めるのは ș, ț だが、代用字 ş, ţ の方が広く多く使われている – 1989年 ルーマニアの民主化 – 2001年 正書法の文字が ISO8859-16(Latin-10) と Unicode に – 2007年 ルーマニア EU 加盟 – 2007年 誰もが使えるように (Windows Vista)
  59. 59. ブカレストまで行って探してきた (Google Street View で)• 街中の看板にも代用字(セディーユ付き)が使われている
  60. 60. 同一視する正規化が必要• 代用字の方が使いやすい – web 上のニュース記事や twitter では、 正書法:代用字 = 1:2 くらいの割合 – 「ルーマニア語の IME 」でもセディーユ付き の方が出るらしい• ルーマニア語話者は多分区別してない ț ţ さ と みたいな雰囲気? U+021B U+0163
  61. 61. ベトナム語文字の正規化 (1)• ベトナム語は12個の「母音」を持つ – a, ă, â, e, ê, i, y, o, ô, ơ, u, ư• ベトナム語は6種類の「声調」を持つ – a, ả, à, ã, á, ạ – 新聞など一般の文書でも声調記号を付けて記 述される – 声調記号は全ての母音に付けることが出来る • 12 * 6 = 72
  62. 62. ベトナム語文字の正規化 (2) • 声調記号付き文字の表現 1. U+1ea0~U+1eff を使う • ẵ = U+1eb5 2. ダイアクリティカルマークとの合字と して表す • ẵ = U+0103 U+0303 – Webニュースやツイートでは半々 • ⇒ 正規化しないといけない – 2. を 1. に正規化
  63. 63. デンマーク語とノルウェー語• (略)
  64. 64. Twitter 向け正規化• 単純に除去 – URL – mention – ハッシュタグ – RT – 顔文字 (XD, :p など、ラテン文字が入るもの は特に)
  65. 65. twitter 表現を考慮した正規化• coooooooollllll みたいなやつ• 対応案1: [Brody+ 2011] で正規化辞書を作る – cooooooooollllllll => cool – http://d.hatena.ne.jp/n_shuyo/20110914/twitter – 辞書にない単語に対応できない 知ってる範囲で• 対応案2: 3文字以上の連続を2文字に縮める – 正書法の範囲で、同じラテン文字が3個以上続く言語はない • 日本語だと「かたたたき」とか「かわいいいぬ」とかあるけど • 略語だと WWW とか СССРとかあるけどね• 現在は案2のみ対応 – 案1 も組み合わせるのがおそらくベスト
  66. 66. Twitter 向け正規化(笑い)• 笑い方も言語によっていろいろ – HOW MUCH DO YOU LOVE COACH BEISTE??? HHAHAHAHAHAH – Hihihihi. :) Habe ich regulär 2x die Woche! – Tafil con eso...!!! Jajajajajajaja – Malo?? Jejejeje XP – kekeke chỗ đó làm áo được ko em?• ⇒ 2回(haha)に縮める – 削ってもいいが、言語の特徴も出ているので
  67. 67. 評価
  68. 68. 評価• 訓練データ(小+大)を使って、17言語判 別のモデルを学習 – 正則化無し SGD 8周 + L1-SGD 2周• 訓練データ(小)を使って、同様に学習• テストデータを言語判定した結果を評価
  69. 69. 評価結果 言語 正解 件数 正解率cs チェコ語 4,257 4,269 99.72%da デンマーク語 5,343 5,484 97.43%de ドイツ語 9,559 9,608 99.49%en 英語 9,468 9,630 98.32%es スペイン語 10,044 10,133 99.12%fi フィンランド語 2,220 2,241 99.06%fr フランス語 10,014 10,067 99.47%id インドネシア語 10,161 10,184 99.77%it イタリア語 10,120 10,167 99.54%nl オランダ語 9,510 9,680 98.24%no ノルウェー語 10,012 10,505 95.31%pl ポーランド語 9,849 9,886 99.63%pt ポルトガル語 9,358 9,456 98.96%ro ルーマニア語 3,988 4,057 98.30%sv スウェーデン語 9,852 9,932 99.19%tr トルコ語 10,302 10,309 99.93%vi ベトナム語 10,911 10,932 99.81% 144,968 146,540 98.93%
  70. 70. orz
  71. 71. で、でもあとは時間の問題?• データさえ増えれば精度はまだ上がる – フィンランド語やルーマニア語は確実に – ハンガリー語など、判別が容易な言語もまだ手つ かずで残っているw – Firehose があれば…… • 話者が少ないタイムゾーンだけでいいから……• データの正確さがまだ足りない – 特にノルウェー語 – 地道に人間言語判別……まさに時間の問題……
  72. 72. 小さいモデルで判定 言語 正解 件数 正解率cs チェコ語 4,252 4,269 99.60%da デンマーク語 5,290 5,493 96.30%de ドイツ語 9,478 9,614 98.59%en 英語 9,349 9,607 97.31%es スペイン語 9,961 10,133 98.30%fi フィンランド語 2,231 2,241 99.55%fr フランス語 9,932 10,069 98.64%id インドネシア語 10,126 10,185 99.42%it イタリア語 9,963 10,167 97.99%nl オランダ語 9,454 9,682 97.65%no ノルウェー語 10,285 10,512 97.84%pl ポーランド語 9,854 9,886 99.68%pt ポルトガル語 9,277 9,457 98.10%ro ルーマニア語 3,997 4,057 98.52%sv スウェーデン語 9,669 9,932 97.35%tr トルコ語 10,250 10,309 99.43%vi ベトナム語 10,900 10,932 99.71% 144,268 146,545 98.45%
  73. 73. モデルのサイズ• 小+大(17言語) – パラメータ行列 88MB – 素性(Double Array) 8MB• 小のみ(17言語) – パラメータ行列 16MB – 素性(Double Array) 1.5MB• langdetect(53言語) – 1.7MB
  74. 74. (参考) Europarl データセットに対して 言語 正解 件数 正解率 cs チェコ語 998 1,000 99.8% da デンマーク語 983 1,000 98.3% de ドイツ語 997 1,000 99.7% en 英語 1,000 1,000 100.0% es スペイン語 1,000 1,000 100.0% fi フィンランド語 997 1,000 99.7% fr フランス語 998 1,000 99.8% it イタリア語 1,000 1,000 100.0% nl オランダ語 1,000 1,000 100.0% pl ポーランド語 997 1,000 99.7% pt ポルトガル語 995 1,000 99.5% ro ルーマニア語 999 1,000 99.9% sv スウェーデン語 997 1,000 99.7% 12,961 13,000 99.7%• データセットに含まれる21言語から、ldig の学習データがな い bg, el, et, hu, lt, lv, sk, sl を除外 – CLD(76言語) = 98.82%, langdetect(53言語) = 99.22%
  75. 75. (参考) n-gram 素性を使ったら• (間に合いませんでした orz)
  76. 76. まとめ• 精度 99% に届かず…… – でも近日達成見込み• 汎用性のある手法 – ツイートコーパスで学習させても、 Europarl の判定精度で langdetect と互角• 現時点でツイートの言語判定するなら – langdetect + ツイートコーパスも現実的
  77. 77. langdetect + ツイートコーパス• ツイートコーパスから作った 17 言語分の langdetect 言語プロファイル – 近日公開予定 – かなり精度が上がる• 入力は小文字化する – 全文が大文字化されたツイートも少なくない • langdetect は大文字のみの単語を略語と見なして極力 除外する – ⇒ ベトナム語に誤判定する率が下がる
  78. 78. langdetect + ツイッターコーパス 言語 正解 件数 正解率 cs チェコ語 4,256 4,269 99.7% da デンマーク語 5,183 5,493 94.4% de ドイツ語 9,016 9,614 93.8% en 英語 9,178 9,600 95.6% es スペイン語 9,951 10,131 98.2% fi フィンランド語 2,232 2,241 99.6% fr フランス語 9,902 10,074 98.3% id インドネシア語 10,068 10,185 98.9% it イタリア語 9,936 10,166 97.7% nl オランダ語 9,402 9,682 97.1% no ノルウェー語 10,016 10,512 95.3% pl ポーランド語 9,852 9,886 99.7% pt ポルトガル語 9,166 9,461 96.9% ro ルーマニア語 3,987 4,057 98.3% sv スウェーデン語 9,752 9,932 98.2% tr トルコ語 10,262 10,309 99.5% vi ベトナム語 10,830 10,932 99.1% 142,989 146,544 97.6%• langdetect + Wikipedia コーパスでは 95.4%• やはりドメインに適したコーパスは強い
  79. 79. 課題• モデルが巨大 – 精度を落とさずモデルを小さくしたいが、 試行錯誤しようにも時間がかかりすぎる – 単精度で十分だけど、Python は非サポート – ⇒ C++ で実装します• デンマーク語/ノルウェー語が苦手 – 非独立素性を入れれば精度が上がるかも? • 直感!
  80. 80. 参考文献• [岡野原+ 2008] 全ての部分文字列を考慮した文書分類• ニューエクスプレスシリーズ(白水社) – スウェーデン語、ノルウェー語、デンマーク語、ポーランド語、ハンガリー語、ルー マニア語、チェコ語、リトアニア語、スペイン語、カタルーニャ語、ベトナム語、ト ルコ語、ドイツ語、オランダ語、スワヒリ語• [Andrew+ 2007] Scalable training of L1-regularized log-linear models• [Brody+ 2011] Cooooooooooooooollllllllllllll!!!!!!!!!!!!!! Using Word Lengthening to Detect Sentiment in Microblogs• [Duchi+ 2009] Efficient Online and Batch Learning using Forward Backward Splitting• [Perkins+ 2003] Grafting: Fast, Incremental Feature Selection by Gradient Descent in Function Space• [Tsuruoka+ ACL2009] Stochastic Gradient Descent Training for L1- regularized Log-linear Models with Cumulative Penalty

×