SlideShare a Scribd company logo
1 of 80
Download to read offline
∞-gram による短文言語判定

  2011/11/23 TokyoNLP #8
 中谷 秀洋@サイボウズ・ラボ
    @shuyo / id:n_shuyo
アジェンダ
• 言語判定
• 極大部分文字列
• 実装
• コーパス作りと正規化
• 評価
言語判定
これ何語?
• 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...
人間言語判定(一部)
• ik があればオランダ語。
• ich があればドイツ語。ß もドイツ語の特徴。
• czy があればポーランド語。Ł, ń, ś, ź もポーランド語のみ
• å があればデンマーク語かノルウェー語かスウェーデン語
    – af があればデンマーク語。「ありがとう」は tak
    – nei があればノルウェー語。「ありがとう」は takk
    – och があればスウェーデン語。「ありがとう」は tack
•   ı (点のない i) か ğ があればトルコ語
• ă や ș や ț があればルーマニア語
    – ă はベトナム語でも使うが、似てないから大丈夫
    – ş はトルコ語でも使うが、似てないから大丈夫
• WinXP で表示されない文字がいっぱいあったらベトナム語(ぇ
これ何語?(解答編)
• 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... ベトナム語
人間様の仕事じゃあ
 ないですね!
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 から同梱されるらしい
langdetect の中身
• 1~3-gram + ベイジアンフィルタ
 – 特徴選択は出現率で足切り(単純)
• 53言語について 99% 以上の精度で判定
 – 各種正規化と組み合わせることで、シンプル
   な手法でも実用的な精度が出せた
• ある程度の長さの文章が対象
 – 20語~, 50文字~ 程度が目安
 – 短い文章の判定が苦手(twitter とか)
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 以上のものを判定結果として採用
95% = 20個に 1個間違う
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
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(ノルウェー語)と解釈
短文の言語判定は
やっぱり難しい(らしい)
動機:それでも短文の言語判定したい?

• 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
問題設定:「短文言語判定できる」とは?

• やはり「精度 99% 以上」
 – とはいえ「一語文」で達成は厳しすぎる……
 – 「3語以上の文章で 99% 以上」を目標に
• 文字種の混合は考えなくていい
 – 文字種ごとにチャンクに分ければいい
 – 判別が一番難しい文字種はラテン文字
  • 話者 500万人以上いる言語だけで 25 以上
方針:短文の言語判定するには?
• 3-gram では素性が足りない (直感!)
 – 言語によっては短い素性で足りる
   • ベトナム語とか
 – 言語によっては長い素性が要る
   • ascii の範囲で済む言語間とか
   • 機能語の一致率がハンパない言語間とか
• 「巨大な辞書を持つしかないのでは?」
 – という議論を Issues 上でしたり
 – しかし辞書を手作りはありえない……
• ⇒ 可変長の素性を効率的に作成・選択したい
極大部分文字列
全ての部分文字列を考慮した文書分類
           [岡野原+ 2008]

• 全ての部分文字列を素性とする多クラスロジ
  スティック回帰
 – 極大部分文字列のみを用いても同値なモデル
 – 極大部分文字列は拡張 Suffix Array を使えば、
   文字列長に対して線形時間で抽出できる
• 特徴選択+L1正則化により、n-gramより高
  い性能をもつ十分小さいモデルが得られる
• 素性を TRIE に格納、予測(判定)も高速に
極大部分文字列とは? (1)
• (空でない)部分文字列の間に、ある種の
  「包含関係」(半順序)を入れる

        abracadabra
 – “ra” ⊂ “bra“ ⇔ 全ての ”ra” は “bra” の
                  部分文字列として現れる
 – “a” は “bra“ だけではなく “ca” などの部分
   文字列にもなるので “a” ⊄ “bra“
                  ※厳密には出現位置も考慮して定義する
極大部分文字列とは? (2)

              abracadabra
                                    自分より「大きい」
 – “r” ⊂ “ra” ⊂ “bra“⊂ “abra“       部分文字列がない
 – “c” ⊂ “ca” ⊂ ……⊂ “abracadabra“
    • 1回だけ現れる部分文字列は文字列全体に含まれる
 – “a” はどの部分文字列とも包含関係を持たない


• この包含関係における極大元が「極大部分文字列」
• したがって abracadabra の極大部分文字列は
  “a”, “abra”, “abracadabra” の3つ
極大部分文字列のメリット
           abracadabra
• “ra” ⊂ “bra“ であるとき、
  – “ra” と “bra“ の出現頻度(あるいは有無)は常に一致する
• 特徴量(出現頻度や有無)を線形結合するモデルなら、
  包含関係のある特徴量同士をくくり出せる
  – 例えばロジスティック回帰(対数線型モデル)
  – 極大部分文字列を代表元とすればいい

 極大部分文字列だけで、全部分文字列を
 使うのと同値なモデルが得られる
       ※ただし、未知の文書でも同じ包含関係が成り立っているとは限らない
極大部分文字列 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
 Alice's Adventures in Wonderland                       吾輩は猫である 1~4章
           (145283 バイト)                                 (utf-8 / 256147 バイト)
                「極大部分文字列 の味見 / 自然言語処理勉強会@東京 #3」より
                   http://d.hatena.ne.jp/n_shuyo/20101107/suffix_array
極大部分文字列の分布
                 極大部分文字列                   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)とその種類数の分布をとったもの
方針:短文の言語判定するには?

• 3-gram では素性が足りない (直感!)
 – 言語によっては短い素性で足りる
  • ベトナム語とか

 – 言語によっては長い素性が要る
  • ascii の範囲で済む言語間とか
  • 機能語の一致率がハンパない言語間とか
3-gram では足りないけど、
 9-gram とか多すぎる!
そういうとき
 極大部分文字列は
素性として有効では?
極大部分文字列の求め方
• 極大部分文字列をナイーブに求めると、
  文字列長 N に対して O(N2)
• 「拡張 Suffix Array」を使うと、 2回以
  上現れる極大部分文字列を線形時間で求
  めることができる [岡野原+ 2008]
 – 1回現れる極大部分文字列は文字列全体のみ
論文の残りは
参考リンクでご紹介……
(拡張) 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
多クラスロジスティック回帰
• 教師有り分類器
 – 識別モデル
 – 非独立な特徴量が使える
  • 今回そこまで行けませんでしたが

• パターン認識と機械学習(PRML) 4章
 – 詳しく載ってますw
特徴選択
• [Perkins+ 2003] Grafting
  – 素性候補のうち、目標関数の勾配が最も大き
    いものから順に有効にしていく手法
  – 今回使いません。
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 の「最後のデータに引っ張られて素性がつぶれにくい」という
     点を改良
   – 今回の実装で使用
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 の解説あり
実装
Language Detection with Infinity-Gram
               (ldig)

• ラテン文字言語判定器のプロトタイプ
 – https://github.com/shuyo/ldig
 – Python / numpy
 – MIT license
 – 多クラスLR + L1 SGD + Double Array
• ターゲット : ツイートの言語判定
 – twitter 特有の表現を正規化
 – 各種言語向け正規化
使い方 (1) モデルの初期化
• ldig.py -m [モデル] --init [コーパス]
           -x [極大部分文字列抽出器]
           --ff=[頻度の最小値]
  – コーパスから素性を抽出し、モデルを初期化する
  – -m : モデルを格納するディレクトリ
  – -x : テキストから極大部分文字列を抽出する(外
    部プロセスとして起動)
  – --ff : 素性を頻度で足きり
極大部分文字列抽出器
• maxsubst [input file] [output file]
   – 入力は複数行テキストファイル
   – 出力は ”[素性]¥t[頻度]” の形式
      • タブは空白に置換、改行文字は U+0001 に置き換え
• という仕様のツールを別途ご用意ください(ぇ
   – もちろん作ってあるが、未公開の社内ライブラリを組み込
     んでいるのでまだ公開できない
   – そのうち公開できる、はず
• なくてもモデルの新規作成が出来ないだけ
   – 既存モデルを使って言語判定するには問題なし
配布モデル
• github にてモデル(小)を配布中
 – https://github.com/shuyo/ldig/tree/master/models

 – 展開すると model.small というディレクト
   リが作られる
 – -m オプションでこのディレクトリを指定
使い方 (2) 学習
• ldig.py -m [モデル] --learning [コーパス]
           -e [学習率] -r [正則化係数]
           --wr=[全体正則化を行う頻度]
  – SGD 1周分の学習を行う
  – -e : 学習率
  – -r : 指定すると L1 正則化を行う
  – --wr : 全パラメータを正則化する回数
    • パラメータが多くて非常に時間がかかるため、計算を
      サボっている……
使い方 (3) モデル縮小
• ldig.py -m [モデル] --shrink
  – 有効でない素性(=パラメータが全て0)を除外
    して、モデルを小さくする
使い方 (4) 言語判定
• ldig.py -m [モデル] [テストデータ]
 – テストデータの言語判定を行い、結果とサマ
   リーを出力する
データ形式
• 訓練データ・テストデータ共通
     – [正解ラベル]¥t[テキスト]


en    Inside Sales Account Manager met sales drive
en    Just completed a 2.48 mi run with Check it out!
en    Vacancy: Senior Technical Advisor – Malaria
en    Which one? I can't decide!
en    You're totally welcome :)
en    save by the bell so dom programma .
コーパス作成と正規化
コーパスの作り方
• twitter Streaming API の sample メ
  ソッド
  – 全ツイートの 1%程度をサンプリング
  – 1日 200万件
    • ラテン文字の言語はその6割程度

• これに言語ラベルを振るだけの
  かんたんなお仕事
言語ラベルを振る
• ツイートをユーザのタイムゾーンごとに分類
 – フランス語のツイートは全体の 1% 程度       ラテン文字中
                              7番目の多さ!
 – しかし Paris タイムゾーンに限れば 50%
   • ただし全体の2割はタイムゾーン未設定

• langdetect で仮ラベルを振る
 – fr のツイートから、フランス語以外を除く(手作業)
 – fr 以外のツイートから、フランス語を拾う(手作業)
• これを各言語ごとに繰り返し行い続ける
手作業(イメージ図)
手作業の一例
Höb 'ne Preuvenelap gekreege vn .D'r zit dus mer ein
deenk op: op naor 't Vriethof.Tot ut is.Is de ...

• (暫定)オランダ語のデータに含まれていた
   – オランダ語ではない
   – ドイツ語でもなさそう?
• オランダのマーストリヒトでつぶやかれたものらしい
   – マーストリヒトについて調べる
• どうやら「リンブルフ語」
   – http://ja.wikipedia.org/wiki/リンブルフ語
作成したデータセット
      言語       訓練データ(小) 訓練データ(大)       テストデータ
cs    チェコ語          3,514                  4,342
da   デンマーク語         4,007                  5,654
de    ドイツ語          4,224     39,891      10,005
en     英語           5,090     39,245      10,137
es   スペイン語          5,129     39,845      10,296
fi   フィンランド語        3,400                  2,310
fr   フランス語          4,952     39,327      10,417
id   インドネシア語        5,034     39,878      10,397
it   イタリア語          4,187     39,996      10,561
nl   オランダ語          5,052     39,981      10,111
no   ノルウェー語         4,263                 10,729
pl   ポーランド語         5,040                 10,282
pt   ポルトガル語         5,054     39,451       9,754
ro   ルーマニア語         3,490                  4,151
sv   スウェーデン語        4,330     40,000      10,230
tr    トルコ語          5,024     40,000      10,829
vi   ベトナム語          5,029                 11,065

                 76,819     397,614    151,270
データ量の偏り
• ラテン文字言語でつぶやかれているツイートの内訳
  その他の言語は
全部併せてこのくらい
                   英語
                   ポルトガル語
                   スペイン語
                   インドネシア語
                   オランダ語
                   フランス語
                   ドイツ語
                   トルコ語
                   イタリア語
                   スウェーデン語
データ量偏り対策
• データを各言語ごとに重複サンプリング
  して、一番多い言語データの量にあわせ
  る
 – 実際には、「データの整数倍+余り分を重複
   無しサンプリング」で近似
ところで
そもそも「ラテン文字」って?
 • ラテン文字 ≠ ascii アルファベット
     – å とか ą とか æ とか ð とか Ħ とか ŋ とかも
 • ユニコードで9個のコードブロックに割り当て
   範囲                 名称                  日本語名称            備考
U+0000-007F   Basic Latin             基本ラテン文字          ascii
U+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 Diacritical
U+0300-036F                           ダイアクリティカルマーク     声調記号などを合成
              Marks
              Latin Extended
U+1E00-1EFF                           ラテン文字拡張追加        実質、ベトナム語専用
              Additional
U+2C60-2C7F   Latin Extended-C        ラテン文字拡張C         現代語では ほぼ使われ
U+A720-A7FF   Latin Extended-D        ラテン文字拡張D         ない
ざっくり眺めるとこんな感じ
                   まるっと
よく使う   ところどころ使う   ベトナム語用
小文字化
• コーパスが乏しい
 – 大文字と小文字を別々の文字にするなんてもった
   いない!
• モデルが巨大(後述)
 – 小文字化すればだいぶ小さくなる
• Double Array 的に文字種が少ないと嬉しい
 – 詳細省略w
トルコ語を考慮した小文字化
            大文字         小文字
トルコ語以外   I (U+0049) i (U+0069)
         I (U+0049) ı (U+0131)
 トルコ語
         İ (U+0130) i (U+0069)
• トルコ語は I (U+0049) の小文字が異なる
 – Java, Python の小文字化はロケールを考慮
• I と i で意味が異なる言語もある
• ⇒ I を除外して小文字化
ルーマニア語文字の正規化
• 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
両方正解
• 正書法が定めるのは       ș, ț だが、
代用字 ş, ţ の方が広く多く使われている
 – 1989年 ルーマニアの民主化
 – 2001年 正書法の文字が ISO8859-16(Latin-10)
   と Unicode に
 – 2007年 ルーマニア EU 加盟
 – 2007年 誰もが使えるように (Windows Vista)
ブカレストまで行って探してきた
            (Google Street View で)




• 街中の看板にも代用字(セディーユ付き)が使われている
同一視する正規化が必要
• 代用字の方が使いやすい
 – web 上のニュース記事や twitter では、
   正書法:代用字 = 1:2 くらいの割合
 – 「ルーマニア語の IME 」でもセディーユ付き
   の方が出るらしい
• ルーマニア語話者は多分区別してない


  ț        ţ       さ   と

                   みたいな雰囲気?
 U+021B   U+0163
ベトナム語文字の正規化 (1)
• ベトナム語は12個の「母音」を持つ
 – a, ă, â, e, ê, i, y, o, ô, ơ, u, ư
• ベトナム語は6種類の「声調」を持つ
 – a, ả, à, ã, á, ạ
 – 新聞など一般の文書でも声調記号を付けて記
   述される
 – 声調記号は全ての母音に付けることが出来る
   • 12 * 6 = 72
ベトナム語文字の正規化 (2)
 • 声調記号付き文字の表現
  1. U+1ea0~U+1eff を使う
    • ẵ = U+1eb5
  2. ダイアクリティカルマークとの合字と
     して表す
    • ẵ = U+0103 U+0303
  – Webニュースやツイートでは半々
 • ⇒ 正規化しないといけない
  – 2. を 1. に正規化
デンマーク語とノルウェー語
• (略)
Twitter 向け正規化
• 単純に除去
 – URL
 – mention
 – ハッシュタグ
 – RT
 – 顔文字 (XD, :p など、ラテン文字が入るもの
   は特に)
twitter 表現を考慮した正規化
• coooooooollllll みたいなやつ
• 対応案1: [Brody+ 2011] で正規化辞書を作る
  – cooooooooollllllll => cool
  – http://d.hatena.ne.jp/n_shuyo/20110914/twitter
  – 辞書にない単語に対応できない
                                                知ってる範囲で
• 対応案2: 3文字以上の連続を2文字に縮める
  – 正書法の範囲で、同じラテン文字が3個以上続く言語はない
     • 日本語だと「かたたたき」とか「かわいいいぬ」とかあるけど
     • 略語だと WWW とか СССРとかあるけどね
• 現在は案2のみ対応
  – 案1 も組み合わせるのがおそらくベスト
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)に縮める
 – 削ってもいいが、言語の特徴も出ているので
評価
評価
• 訓練データ(小+大)を使って、17言語判
  別のモデルを学習
 – 正則化無し SGD 8周 + L1-SGD 2周
• 訓練データ(小)を使って、同様に学習
• テストデータを言語判定した結果を評価
評価結果
      言語        正解         件数        正解率
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%
orz
で、でもあとは時間の問題?
• データさえ増えれば精度はまだ上がる
 – フィンランド語やルーマニア語は確実に
 – ハンガリー語など、判別が容易な言語もまだ手つ
   かずで残っているw
 – Firehose があれば……
   • 話者が少ないタイムゾーンだけでいいから……
• データの正確さがまだ足りない
 – 特にノルウェー語
 – 地道に人間言語判別……まさに時間の問題……
小さいモデルで判定
      言語        正解         件数        正解率
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%
モデルのサイズ
• 小+大(17言語)
  – パラメータ行列 88MB
  – 素性(Double Array) 8MB
• 小のみ(17言語)
  – パラメータ行列 16MB
  – 素性(Double Array) 1.5MB
• langdetect(53言語)
  – 1.7MB
(参考) 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%
(参考) n-gram 素性を使ったら

• (間に合いませんでした orz)
まとめ
• 精度 99% に届かず……
 – でも近日達成見込み
• 汎用性のある手法
 – ツイートコーパスで学習させても、 Europarl
   の判定精度で langdetect と互角
• 現時点でツイートの言語判定するなら
 – langdetect + ツイートコーパスも現実的
langdetect + ツイートコーパス

• ツイートコーパスから作った 17 言語分の
  langdetect 言語プロファイル
 – 近日公開予定
 – かなり精度が上がる
• 入力は小文字化する
 – 全文が大文字化されたツイートも少なくない
  • langdetect は大文字のみの単語を略語と見なして極力
    除外する
 – ⇒ ベトナム語に誤判定する率が下がる
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%
•   やはりドメインに適したコーパスは強い
課題
• モデルが巨大
 – 精度を落とさずモデルを小さくしたいが、
   試行錯誤しようにも時間がかかりすぎる
 – 単精度で十分だけど、Python は非サポート
 – ⇒ C++ で実装します
• デンマーク語/ノルウェー語が苦手
 – 非独立素性を入れれば精度が上がるかも?
  • 直感!
参考文献
•   [岡野原+ 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

More Related Content

What's hot

コードクローン研究 ふりかえり ~ストロング・スタイルで行こう~
コードクローン研究 ふりかえり ~ストロング・スタイルで行こう~コードクローン研究 ふりかえり ~ストロング・スタイルで行こう~
コードクローン研究 ふりかえり ~ストロング・スタイルで行こう~Kamiya Toshihiro
 
ダブル配列の豆知識
ダブル配列の豆知識ダブル配列の豆知識
ダブル配列の豆知識s5yata
 
楽天における機械学習アルゴリズムの活用
楽天における機械学習アルゴリズムの活用楽天における機械学習アルゴリズムの活用
楽天における機械学習アルゴリズムの活用Rakuten Group, Inc.
 
ダブル配列の実装方法
ダブル配列の実装方法ダブル配列の実装方法
ダブル配列の実装方法Higashiyama Masahiko
 
高速フーリエ変換
高速フーリエ変換高速フーリエ変換
高速フーリエ変換AtCoder Inc.
 
Elix_はじめてのAI創薬_2022-04-01.pdf
Elix_はじめてのAI創薬_2022-04-01.pdfElix_はじめてのAI創薬_2022-04-01.pdf
Elix_はじめてのAI創薬_2022-04-01.pdfssuser5ec200
 
質問応答システム入門
質問応答システム入門質問応答システム入門
質問応答システム入門Hiroyoshi Komatsu
 
適切な研究課題の設定が論文掲載の第一歩
適切な研究課題の設定が論文掲載の第一歩 適切な研究課題の設定が論文掲載の第一歩
適切な研究課題の設定が論文掲載の第一歩 英文校正エディテージ
 
ハイパースレッディングの並列化への影響
ハイパースレッディングの並列化への影響ハイパースレッディングの並列化への影響
ハイパースレッディングの並列化への影響Hiroshi Watanabe
 
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~Takuya Akiba
 
TensorFlowで会話AIを作ってみた。
TensorFlowで会話AIを作ってみた。TensorFlowで会話AIを作ってみた。
TensorFlowで会話AIを作ってみた。tak9029
 
人工知能技術を用いた各医学画像処理の基礎 (2022/09/09)
人工知能技術を用いた各医学画像処理の基礎 (2022/09/09)人工知能技術を用いた各医学画像処理の基礎 (2022/09/09)
人工知能技術を用いた各医学画像処理の基礎 (2022/09/09)Yutaka KATAYAMA
 
すごいConstたのしく使おう!
すごいConstたのしく使おう!すごいConstたのしく使おう!
すごいConstたのしく使おう!Akihiro Nishimura
 
LR parsing
LR parsingLR parsing
LR parsingichikaz3
 
続・わかりやすいパターン認識_3章
続・わかりやすいパターン認識_3章続・わかりやすいパターン認識_3章
続・わかりやすいパターン認識_3章weda654
 
【論文読み会】Universal Language Model Fine-tuning for Text Classification
【論文読み会】Universal Language Model Fine-tuning for Text Classification【論文読み会】Universal Language Model Fine-tuning for Text Classification
【論文読み会】Universal Language Model Fine-tuning for Text ClassificationARISE analytics
 
TokyoNLP#5 パーセプトロンで楽しい仲間がぽぽぽぽ~ん
TokyoNLP#5 パーセプトロンで楽しい仲間がぽぽぽぽ~んTokyoNLP#5 パーセプトロンで楽しい仲間がぽぽぽぽ~ん
TokyoNLP#5 パーセプトロンで楽しい仲間がぽぽぽぽ~んsleepy_yoshi
 

What's hot (20)

コードクローン研究 ふりかえり ~ストロング・スタイルで行こう~
コードクローン研究 ふりかえり ~ストロング・スタイルで行こう~コードクローン研究 ふりかえり ~ストロング・スタイルで行こう~
コードクローン研究 ふりかえり ~ストロング・スタイルで行こう~
 
ダブル配列の豆知識
ダブル配列の豆知識ダブル配列の豆知識
ダブル配列の豆知識
 
楽天における機械学習アルゴリズムの活用
楽天における機械学習アルゴリズムの活用楽天における機械学習アルゴリズムの活用
楽天における機械学習アルゴリズムの活用
 
機械学習と主成分分析
機械学習と主成分分析機械学習と主成分分析
機械学習と主成分分析
 
ダブル配列の実装方法
ダブル配列の実装方法ダブル配列の実装方法
ダブル配列の実装方法
 
高速フーリエ変換
高速フーリエ変換高速フーリエ変換
高速フーリエ変換
 
Elix_はじめてのAI創薬_2022-04-01.pdf
Elix_はじめてのAI創薬_2022-04-01.pdfElix_はじめてのAI創薬_2022-04-01.pdf
Elix_はじめてのAI創薬_2022-04-01.pdf
 
質問応答システム入門
質問応答システム入門質問応答システム入門
質問応答システム入門
 
適切な研究課題の設定が論文掲載の第一歩
適切な研究課題の設定が論文掲載の第一歩 適切な研究課題の設定が論文掲載の第一歩
適切な研究課題の設定が論文掲載の第一歩
 
ハイパースレッディングの並列化への影響
ハイパースレッディングの並列化への影響ハイパースレッディングの並列化への影響
ハイパースレッディングの並列化への影響
 
動的計画法を極める!
動的計画法を極める!動的計画法を極める!
動的計画法を極める!
 
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
 
TensorFlowで会話AIを作ってみた。
TensorFlowで会話AIを作ってみた。TensorFlowで会話AIを作ってみた。
TensorFlowで会話AIを作ってみた。
 
人工知能技術を用いた各医学画像処理の基礎 (2022/09/09)
人工知能技術を用いた各医学画像処理の基礎 (2022/09/09)人工知能技術を用いた各医学画像処理の基礎 (2022/09/09)
人工知能技術を用いた各医学画像処理の基礎 (2022/09/09)
 
すごいConstたのしく使おう!
すごいConstたのしく使おう!すごいConstたのしく使おう!
すごいConstたのしく使おう!
 
LR parsing
LR parsingLR parsing
LR parsing
 
Lispマシン・シミュレータの紹介
Lispマシン・シミュレータの紹介Lispマシン・シミュレータの紹介
Lispマシン・シミュレータの紹介
 
続・わかりやすいパターン認識_3章
続・わかりやすいパターン認識_3章続・わかりやすいパターン認識_3章
続・わかりやすいパターン認識_3章
 
【論文読み会】Universal Language Model Fine-tuning for Text Classification
【論文読み会】Universal Language Model Fine-tuning for Text Classification【論文読み会】Universal Language Model Fine-tuning for Text Classification
【論文読み会】Universal Language Model Fine-tuning for Text Classification
 
TokyoNLP#5 パーセプトロンで楽しい仲間がぽぽぽぽ~ん
TokyoNLP#5 パーセプトロンで楽しい仲間がぽぽぽぽ~んTokyoNLP#5 パーセプトロンで楽しい仲間がぽぽぽぽ~ん
TokyoNLP#5 パーセプトロンで楽しい仲間がぽぽぽぽ~ん
 

Viewers also liked

Short Text Language Detection with Infinity-Gram
Short Text Language Detection with Infinity-GramShort Text Language Detection with Infinity-Gram
Short Text Language Detection with Infinity-GramShuyo Nakatani
 
言語判定へのいざない
言語判定へのいざない言語判定へのいざない
言語判定へのいざないShuyo Nakatani
 
極大部分文字列を使った twitter 言語判定
極大部分文字列を使った twitter 言語判定極大部分文字列を使った twitter 言語判定
極大部分文字列を使った twitter 言語判定Shuyo Nakatani
 
徹底比較!! Heliosearch vs Solr
徹底比較!! Heliosearch vs Solr徹底比較!! Heliosearch vs Solr
徹底比較!! Heliosearch vs SolrEbisawa Shinobu
 
類義語検索と類義語ハイライト
類義語検索と類義語ハイライト類義語検索と類義語ハイライト
類義語検索と類義語ハイライトShinichiro Abe
 
第17回Lucene/Solr勉強会 #SolrJP – Apache Lucene Solrによる形態素解析の課題とN-bestの提案
第17回Lucene/Solr勉強会 #SolrJP – Apache Lucene Solrによる形態素解析の課題とN-bestの提案第17回Lucene/Solr勉強会 #SolrJP – Apache Lucene Solrによる形態素解析の課題とN-bestの提案
第17回Lucene/Solr勉強会 #SolrJP – Apache Lucene Solrによる形態素解析の課題とN-bestの提案Yahoo!デベロッパーネットワーク
 
第15回 Solr勉強会 #SolrJP Amazon CloudSearch Deep Dive
第15回 Solr勉強会 #SolrJP Amazon CloudSearch Deep Dive第15回 Solr勉強会 #SolrJP Amazon CloudSearch Deep Dive
第15回 Solr勉強会 #SolrJP Amazon CloudSearch Deep DiveAmazon Web Services Japan
 
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyoShuyo Nakatani
 
正規表現リテラルは本当に必要なのか?
正規表現リテラルは本当に必要なのか?正規表現リテラルは本当に必要なのか?
正規表現リテラルは本当に必要なのか?kwatch
 
Deep Learningと画像認識   ~歴史・理論・実践~
Deep Learningと画像認識 ~歴史・理論・実践~Deep Learningと画像認識 ~歴史・理論・実践~
Deep Learningと画像認識   ~歴史・理論・実践~nlab_utokyo
 

Viewers also liked (12)

Short Text Language Detection with Infinity-Gram
Short Text Language Detection with Infinity-GramShort Text Language Detection with Infinity-Gram
Short Text Language Detection with Infinity-Gram
 
言語判定へのいざない
言語判定へのいざない言語判定へのいざない
言語判定へのいざない
 
極大部分文字列を使った twitter 言語判定
極大部分文字列を使った twitter 言語判定極大部分文字列を使った twitter 言語判定
極大部分文字列を使った twitter 言語判定
 
徹底比較!! Heliosearch vs Solr
徹底比較!! Heliosearch vs Solr徹底比較!! Heliosearch vs Solr
徹底比較!! Heliosearch vs Solr
 
類義語検索と類義語ハイライト
類義語検索と類義語ハイライト類義語検索と類義語ハイライト
類義語検索と類義語ハイライト
 
第17回Lucene/Solr勉強会 #SolrJP – Apache Lucene Solrによる形態素解析の課題とN-bestの提案
第17回Lucene/Solr勉強会 #SolrJP – Apache Lucene Solrによる形態素解析の課題とN-bestの提案第17回Lucene/Solr勉強会 #SolrJP – Apache Lucene Solrによる形態素解析の課題とN-bestの提案
第17回Lucene/Solr勉強会 #SolrJP – Apache Lucene Solrによる形態素解析の課題とN-bestの提案
 
第15回 Solr勉強会 #SolrJP Amazon CloudSearch Deep Dive
第15回 Solr勉強会 #SolrJP Amazon CloudSearch Deep Dive第15回 Solr勉強会 #SolrJP Amazon CloudSearch Deep Dive
第15回 Solr勉強会 #SolrJP Amazon CloudSearch Deep Dive
 
第15回Solr勉強会 - Solr at Yahoo! JAPAN #SolrJP
第15回Solr勉強会 - Solr at Yahoo! JAPAN #SolrJP第15回Solr勉強会 - Solr at Yahoo! JAPAN #SolrJP
第15回Solr勉強会 - Solr at Yahoo! JAPAN #SolrJP
 
Spark MLlibではじめるスケーラブルな機械学習
Spark MLlibではじめるスケーラブルな機械学習Spark MLlibではじめるスケーラブルな機械学習
Spark MLlibではじめるスケーラブルな機械学習
 
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
 
正規表現リテラルは本当に必要なのか?
正規表現リテラルは本当に必要なのか?正規表現リテラルは本当に必要なのか?
正規表現リテラルは本当に必要なのか?
 
Deep Learningと画像認識   ~歴史・理論・実践~
Deep Learningと画像認識 ~歴史・理論・実践~Deep Learningと画像認識 ~歴史・理論・実践~
Deep Learningと画像認識   ~歴史・理論・実践~
 

More from Shuyo Nakatani

画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15Shuyo Nakatani
 
Generative adversarial networks
Generative adversarial networksGenerative adversarial networks
Generative adversarial networksShuyo Nakatani
 
無限関係モデル (続・わかりやすいパターン認識 13章)
無限関係モデル (続・わかりやすいパターン認識 13章)無限関係モデル (続・わかりやすいパターン認識 13章)
無限関係モデル (続・わかりやすいパターン認識 13章)Shuyo Nakatani
 
Memory Networks (End-to-End Memory Networks の Chainer 実装)
Memory Networks (End-to-End Memory Networks の Chainer 実装)Memory Networks (End-to-End Memory Networks の Chainer 実装)
Memory Networks (End-to-End Memory Networks の Chainer 実装)Shuyo Nakatani
 
人工知能と機械学習の違いって?
人工知能と機械学習の違いって?人工知能と機械学習の違いって?
人工知能と機械学習の違いって?Shuyo Nakatani
 
RとStanでクラウドセットアップ時間を分析してみたら #TokyoR
RとStanでクラウドセットアップ時間を分析してみたら #TokyoRRとStanでクラウドセットアップ時間を分析してみたら #TokyoR
RとStanでクラウドセットアップ時間を分析してみたら #TokyoRShuyo Nakatani
 
ドラえもんでわかる統計的因果推論 #TokyoR
ドラえもんでわかる統計的因果推論 #TokyoRドラえもんでわかる統計的因果推論 #TokyoR
ドラえもんでわかる統計的因果推論 #TokyoRShuyo Nakatani
 
[Yang, Downey and Boyd-Graber 2015] Efficient Methods for Incorporating Knowl...
[Yang, Downey and Boyd-Graber 2015] Efficient Methods for Incorporating Knowl...[Yang, Downey and Boyd-Graber 2015] Efficient Methods for Incorporating Knowl...
[Yang, Downey and Boyd-Graber 2015] Efficient Methods for Incorporating Knowl...Shuyo Nakatani
 
星野「調査観察データの統計科学」第3章
星野「調査観察データの統計科学」第3章星野「調査観察データの統計科学」第3章
星野「調査観察データの統計科学」第3章Shuyo Nakatani
 
星野「調査観察データの統計科学」第1&2章
星野「調査観察データの統計科学」第1&2章星野「調査観察データの統計科学」第1&2章
星野「調査観察データの統計科学」第1&2章Shuyo Nakatani
 
Zipf? (ジップ則のひみつ?) #DSIRNLP
Zipf? (ジップ則のひみつ?) #DSIRNLPZipf? (ジップ則のひみつ?) #DSIRNLP
Zipf? (ジップ則のひみつ?) #DSIRNLPShuyo Nakatani
 
ACL2014 Reading: [Zhang+] "Kneser-Ney Smoothing on Expected Count" and [Pickh...
ACL2014 Reading: [Zhang+] "Kneser-Ney Smoothing on Expected Count" and [Pickh...ACL2014 Reading: [Zhang+] "Kneser-Ney Smoothing on Expected Count" and [Pickh...
ACL2014 Reading: [Zhang+] "Kneser-Ney Smoothing on Expected Count" and [Pickh...Shuyo Nakatani
 
ソーシャルメディアの多言語判定 #SoC2014
ソーシャルメディアの多言語判定 #SoC2014ソーシャルメディアの多言語判定 #SoC2014
ソーシャルメディアの多言語判定 #SoC2014Shuyo Nakatani
 
猫に教えてもらうルベーグ可測
猫に教えてもらうルベーグ可測猫に教えてもらうルベーグ可測
猫に教えてもらうルベーグ可測Shuyo Nakatani
 
アラビア語とペルシャ語の見分け方 #DSIRNLP 5
アラビア語とペルシャ語の見分け方 #DSIRNLP 5アラビア語とペルシャ語の見分け方 #DSIRNLP 5
アラビア語とペルシャ語の見分け方 #DSIRNLP 5Shuyo Nakatani
 
どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013
どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013
どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013Shuyo Nakatani
 
Active Learning 入門
Active Learning 入門Active Learning 入門
Active Learning 入門Shuyo Nakatani
 
数式を綺麗にプログラミングするコツ #spro2013
数式を綺麗にプログラミングするコツ #spro2013数式を綺麗にプログラミングするコツ #spro2013
数式を綺麗にプログラミングするコツ #spro2013Shuyo Nakatani
 
ノンパラベイズ入門の入門
ノンパラベイズ入門の入門ノンパラベイズ入門の入門
ノンパラベイズ入門の入門Shuyo Nakatani
 
[Kim+ ICML2012] Dirichlet Process with Mixed Random Measures : A Nonparametri...
[Kim+ ICML2012] Dirichlet Process with Mixed Random Measures : A Nonparametri...[Kim+ ICML2012] Dirichlet Process with Mixed Random Measures : A Nonparametri...
[Kim+ ICML2012] Dirichlet Process with Mixed Random Measures : A Nonparametri...Shuyo Nakatani
 

More from Shuyo Nakatani (20)

画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
 
Generative adversarial networks
Generative adversarial networksGenerative adversarial networks
Generative adversarial networks
 
無限関係モデル (続・わかりやすいパターン認識 13章)
無限関係モデル (続・わかりやすいパターン認識 13章)無限関係モデル (続・わかりやすいパターン認識 13章)
無限関係モデル (続・わかりやすいパターン認識 13章)
 
Memory Networks (End-to-End Memory Networks の Chainer 実装)
Memory Networks (End-to-End Memory Networks の Chainer 実装)Memory Networks (End-to-End Memory Networks の Chainer 実装)
Memory Networks (End-to-End Memory Networks の Chainer 実装)
 
人工知能と機械学習の違いって?
人工知能と機械学習の違いって?人工知能と機械学習の違いって?
人工知能と機械学習の違いって?
 
RとStanでクラウドセットアップ時間を分析してみたら #TokyoR
RとStanでクラウドセットアップ時間を分析してみたら #TokyoRRとStanでクラウドセットアップ時間を分析してみたら #TokyoR
RとStanでクラウドセットアップ時間を分析してみたら #TokyoR
 
ドラえもんでわかる統計的因果推論 #TokyoR
ドラえもんでわかる統計的因果推論 #TokyoRドラえもんでわかる統計的因果推論 #TokyoR
ドラえもんでわかる統計的因果推論 #TokyoR
 
[Yang, Downey and Boyd-Graber 2015] Efficient Methods for Incorporating Knowl...
[Yang, Downey and Boyd-Graber 2015] Efficient Methods for Incorporating Knowl...[Yang, Downey and Boyd-Graber 2015] Efficient Methods for Incorporating Knowl...
[Yang, Downey and Boyd-Graber 2015] Efficient Methods for Incorporating Knowl...
 
星野「調査観察データの統計科学」第3章
星野「調査観察データの統計科学」第3章星野「調査観察データの統計科学」第3章
星野「調査観察データの統計科学」第3章
 
星野「調査観察データの統計科学」第1&2章
星野「調査観察データの統計科学」第1&2章星野「調査観察データの統計科学」第1&2章
星野「調査観察データの統計科学」第1&2章
 
Zipf? (ジップ則のひみつ?) #DSIRNLP
Zipf? (ジップ則のひみつ?) #DSIRNLPZipf? (ジップ則のひみつ?) #DSIRNLP
Zipf? (ジップ則のひみつ?) #DSIRNLP
 
ACL2014 Reading: [Zhang+] "Kneser-Ney Smoothing on Expected Count" and [Pickh...
ACL2014 Reading: [Zhang+] "Kneser-Ney Smoothing on Expected Count" and [Pickh...ACL2014 Reading: [Zhang+] "Kneser-Ney Smoothing on Expected Count" and [Pickh...
ACL2014 Reading: [Zhang+] "Kneser-Ney Smoothing on Expected Count" and [Pickh...
 
ソーシャルメディアの多言語判定 #SoC2014
ソーシャルメディアの多言語判定 #SoC2014ソーシャルメディアの多言語判定 #SoC2014
ソーシャルメディアの多言語判定 #SoC2014
 
猫に教えてもらうルベーグ可測
猫に教えてもらうルベーグ可測猫に教えてもらうルベーグ可測
猫に教えてもらうルベーグ可測
 
アラビア語とペルシャ語の見分け方 #DSIRNLP 5
アラビア語とペルシャ語の見分け方 #DSIRNLP 5アラビア語とペルシャ語の見分け方 #DSIRNLP 5
アラビア語とペルシャ語の見分け方 #DSIRNLP 5
 
どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013
どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013
どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013
 
Active Learning 入門
Active Learning 入門Active Learning 入門
Active Learning 入門
 
数式を綺麗にプログラミングするコツ #spro2013
数式を綺麗にプログラミングするコツ #spro2013数式を綺麗にプログラミングするコツ #spro2013
数式を綺麗にプログラミングするコツ #spro2013
 
ノンパラベイズ入門の入門
ノンパラベイズ入門の入門ノンパラベイズ入門の入門
ノンパラベイズ入門の入門
 
[Kim+ ICML2012] Dirichlet Process with Mixed Random Measures : A Nonparametri...
[Kim+ ICML2012] Dirichlet Process with Mixed Random Measures : A Nonparametri...[Kim+ ICML2012] Dirichlet Process with Mixed Random Measures : A Nonparametri...
[Kim+ ICML2012] Dirichlet Process with Mixed Random Measures : A Nonparametri...
 

Recently uploaded

CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 

Recently uploaded (14)

CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 

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

  • 1. ∞-gram による短文言語判定 2011/11/23 TokyoNLP #8 中谷 秀洋@サイボウズ・ラボ @shuyo / id:n_shuyo
  • 2. アジェンダ • 言語判定 • 極大部分文字列 • 実装 • コーパス作りと正規化 • 評価
  • 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. 人間言語判定(一部) • ik があればオランダ語。 • ich があればドイツ語。ß もドイツ語の特徴。 • czy があればポーランド語。Ł, ń, ś, ź もポーランド語のみ • å があればデンマーク語かノルウェー語かスウェーデン語 – af があればデンマーク語。「ありがとう」は tak – nei があればノルウェー語。「ありがとう」は takk – och があればスウェーデン語。「ありがとう」は tack • ı (点のない i) か ğ があればトルコ語 • ă や ș や ț があればルーマニア語 – ă はベトナム語でも使うが、似てないから大丈夫 – ş はトルコ語でも使うが、似てないから大丈夫 • WinXP で表示されない文字がいっぱいあったらベトナム語(ぇ
  • 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... ベトナム語
  • 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. langdetect の中身 • 1~3-gram + ベイジアンフィルタ – 特徴選択は出現率で足切り(単純) • 53言語について 99% 以上の精度で判定 – 各種正規化と組み合わせることで、シンプル な手法でも実用的な精度が出せた • ある程度の長さの文章が対象 – 20語~, 50文字~ 程度が目安 – 短い文章の判定が苦手(twitter とか)
  • 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. 95% = 20個に 1個間違う
  • 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. 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(ノルウェー語)と解釈
  • 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. 問題設定:「短文言語判定できる」とは? • やはり「精度 99% 以上」 – とはいえ「一語文」で達成は厳しすぎる…… – 「3語以上の文章で 99% 以上」を目標に • 文字種の混合は考えなくていい – 文字種ごとにチャンクに分ければいい – 判別が一番難しい文字種はラテン文字 • 話者 500万人以上いる言語だけで 25 以上
  • 17. 方針:短文の言語判定するには? • 3-gram では素性が足りない (直感!) – 言語によっては短い素性で足りる • ベトナム語とか – 言語によっては長い素性が要る • ascii の範囲で済む言語間とか • 機能語の一致率がハンパない言語間とか • 「巨大な辞書を持つしかないのでは?」 – という議論を Issues 上でしたり – しかし辞書を手作りはありえない…… • ⇒ 可変長の素性を効率的に作成・選択したい
  • 19. 全ての部分文字列を考慮した文書分類 [岡野原+ 2008] • 全ての部分文字列を素性とする多クラスロジ スティック回帰 – 極大部分文字列のみを用いても同値なモデル – 極大部分文字列は拡張 Suffix Array を使えば、 文字列長に対して線形時間で抽出できる • 特徴選択+L1正則化により、n-gramより高 い性能をもつ十分小さいモデルが得られる • 素性を TRIE に格納、予測(判定)も高速に
  • 20. 極大部分文字列とは? (1) • (空でない)部分文字列の間に、ある種の 「包含関係」(半順序)を入れる abracadabra – “ra” ⊂ “bra“ ⇔ 全ての ”ra” は “bra” の 部分文字列として現れる – “a” は “bra“ だけではなく “ca” などの部分 文字列にもなるので “a” ⊄ “bra“ ※厳密には出現位置も考慮して定義する
  • 21. 極大部分文字列とは? (2) abracadabra 自分より「大きい」 – “r” ⊂ “ra” ⊂ “bra“⊂ “abra“ 部分文字列がない – “c” ⊂ “ca” ⊂ ……⊂ “abracadabra“ • 1回だけ現れる部分文字列は文字列全体に含まれる – “a” はどの部分文字列とも包含関係を持たない • この包含関係における極大元が「極大部分文字列」 • したがって abracadabra の極大部分文字列は “a”, “abra”, “abracadabra” の3つ
  • 22. 極大部分文字列のメリット abracadabra • “ra” ⊂ “bra“ であるとき、 – “ra” と “bra“ の出現頻度(あるいは有無)は常に一致する • 特徴量(出現頻度や有無)を線形結合するモデルなら、 包含関係のある特徴量同士をくくり出せる – 例えばロジスティック回帰(対数線型モデル) – 極大部分文字列を代表元とすればいい 極大部分文字列だけで、全部分文字列を 使うのと同値なモデルが得られる ※ただし、未知の文書でも同じ包含関係が成り立っているとは限らない
  • 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 Alice's Adventures in Wonderland 吾輩は猫である 1~4章 (145283 バイト) (utf-8 / 256147 バイト) 「極大部分文字列 の味見 / 自然言語処理勉強会@東京 #3」より http://d.hatena.ne.jp/n_shuyo/20101107/suffix_array
  • 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. 方針:短文の言語判定するには? • 3-gram では素性が足りない (直感!) – 言語によっては短い素性で足りる • ベトナム語とか – 言語によっては長い素性が要る • ascii の範囲で済む言語間とか • 機能語の一致率がハンパない言語間とか
  • 28. 極大部分文字列の求め方 • 極大部分文字列をナイーブに求めると、 文字列長 N に対して O(N2) • 「拡張 Suffix Array」を使うと、 2回以 上現れる極大部分文字列を線形時間で求 めることができる [岡野原+ 2008] – 1回現れる極大部分文字列は文字列全体のみ
  • 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. 多クラスロジスティック回帰 • 教師有り分類器 – 識別モデル – 非独立な特徴量が使える • 今回そこまで行けませんでしたが • パターン認識と機械学習(PRML) 4章 – 詳しく載ってますw
  • 32. 特徴選択 • [Perkins+ 2003] Grafting – 素性候補のうち、目標関数の勾配が最も大き いものから順に有効にしていく手法 – 今回使いません。
  • 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. 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 の解説あり
  • 36. Language Detection with Infinity-Gram (ldig) • ラテン文字言語判定器のプロトタイプ – https://github.com/shuyo/ldig – Python / numpy – MIT license – 多クラスLR + L1 SGD + Double Array • ターゲット : ツイートの言語判定 – twitter 特有の表現を正規化 – 各種言語向け正規化
  • 37. 使い方 (1) モデルの初期化 • ldig.py -m [モデル] --init [コーパス] -x [極大部分文字列抽出器] --ff=[頻度の最小値] – コーパスから素性を抽出し、モデルを初期化する – -m : モデルを格納するディレクトリ – -x : テキストから極大部分文字列を抽出する(外 部プロセスとして起動) – --ff : 素性を頻度で足きり
  • 38. 極大部分文字列抽出器 • maxsubst [input file] [output file] – 入力は複数行テキストファイル – 出力は ”[素性]¥t[頻度]” の形式 • タブは空白に置換、改行文字は U+0001 に置き換え • という仕様のツールを別途ご用意ください(ぇ – もちろん作ってあるが、未公開の社内ライブラリを組み込 んでいるのでまだ公開できない – そのうち公開できる、はず • なくてもモデルの新規作成が出来ないだけ – 既存モデルを使って言語判定するには問題なし
  • 39. 配布モデル • github にてモデル(小)を配布中 – https://github.com/shuyo/ldig/tree/master/models – 展開すると model.small というディレクト リが作られる – -m オプションでこのディレクトリを指定
  • 40. 使い方 (2) 学習 • ldig.py -m [モデル] --learning [コーパス] -e [学習率] -r [正則化係数] --wr=[全体正則化を行う頻度] – SGD 1周分の学習を行う – -e : 学習率 – -r : 指定すると L1 正則化を行う – --wr : 全パラメータを正則化する回数 • パラメータが多くて非常に時間がかかるため、計算を サボっている……
  • 41. 使い方 (3) モデル縮小 • ldig.py -m [モデル] --shrink – 有効でない素性(=パラメータが全て0)を除外 して、モデルを小さくする
  • 42. 使い方 (4) 言語判定 • ldig.py -m [モデル] [テストデータ] – テストデータの言語判定を行い、結果とサマ リーを出力する
  • 43. データ形式 • 訓練データ・テストデータ共通 – [正解ラベル]¥t[テキスト] en Inside Sales Account Manager met sales drive en Just completed a 2.48 mi run with Check it out! en Vacancy: Senior Technical Advisor – Malaria en Which one? I can't decide! en You're totally welcome :) en save by the bell so dom programma .
  • 45. コーパスの作り方 • twitter Streaming API の sample メ ソッド – 全ツイートの 1%程度をサンプリング – 1日 200万件 • ラテン文字の言語はその6割程度 • これに言語ラベルを振るだけの かんたんなお仕事
  • 46. 言語ラベルを振る • ツイートをユーザのタイムゾーンごとに分類 – フランス語のツイートは全体の 1% 程度 ラテン文字中 7番目の多さ! – しかし Paris タイムゾーンに限れば 50% • ただし全体の2割はタイムゾーン未設定 • langdetect で仮ラベルを振る – fr のツイートから、フランス語以外を除く(手作業) – fr 以外のツイートから、フランス語を拾う(手作業) • これを各言語ごとに繰り返し行い続ける
  • 48. 手作業の一例 Höb 'ne Preuvenelap gekreege vn .D'r zit dus mer ein deenk op: op naor 't Vriethof.Tot ut is.Is de ... • (暫定)オランダ語のデータに含まれていた – オランダ語ではない – ドイツ語でもなさそう? • オランダのマーストリヒトでつぶやかれたものらしい – マーストリヒトについて調べる • どうやら「リンブルフ語」 – http://ja.wikipedia.org/wiki/リンブルフ語
  • 49. 作成したデータセット 言語 訓練データ(小) 訓練データ(大) テストデータ cs チェコ語 3,514 4,342 da デンマーク語 4,007 5,654 de ドイツ語 4,224 39,891 10,005 en 英語 5,090 39,245 10,137 es スペイン語 5,129 39,845 10,296 fi フィンランド語 3,400 2,310 fr フランス語 4,952 39,327 10,417 id インドネシア語 5,034 39,878 10,397 it イタリア語 4,187 39,996 10,561 nl オランダ語 5,052 39,981 10,111 no ノルウェー語 4,263 10,729 pl ポーランド語 5,040 10,282 pt ポルトガル語 5,054 39,451 9,754 ro ルーマニア語 3,490 4,151 sv スウェーデン語 4,330 40,000 10,230 tr トルコ語 5,024 40,000 10,829 vi ベトナム語 5,029 11,065 76,819 397,614 151,270
  • 50. データ量の偏り • ラテン文字言語でつぶやかれているツイートの内訳 その他の言語は 全部併せてこのくらい 英語 ポルトガル語 スペイン語 インドネシア語 オランダ語 フランス語 ドイツ語 トルコ語 イタリア語 スウェーデン語
  • 51. データ量偏り対策 • データを各言語ごとに重複サンプリング して、一番多い言語データの量にあわせ る – 実際には、「データの整数倍+余り分を重複 無しサンプリング」で近似
  • 53. そもそも「ラテン文字」って? • ラテン文字 ≠ ascii アルファベット – å とか ą とか æ とか ð とか Ħ とか ŋ とかも • ユニコードで9個のコードブロックに割り当て 範囲 名称 日本語名称 備考 U+0000-007F Basic Latin 基本ラテン文字 ascii U+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 Diacritical U+0300-036F ダイアクリティカルマーク 声調記号などを合成 Marks Latin Extended U+1E00-1EFF ラテン文字拡張追加 実質、ベトナム語専用 Additional U+2C60-2C7F Latin Extended-C ラテン文字拡張C 現代語では ほぼ使われ U+A720-A7FF Latin Extended-D ラテン文字拡張D ない
  • 54. ざっくり眺めるとこんな感じ まるっと よく使う ところどころ使う ベトナム語用
  • 55. 小文字化 • コーパスが乏しい – 大文字と小文字を別々の文字にするなんてもった いない! • モデルが巨大(後述) – 小文字化すればだいぶ小さくなる • Double Array 的に文字種が少ないと嬉しい – 詳細省略w
  • 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. ルーマニア語文字の正規化 • 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. 両方正解 • 正書法が定めるのは ș, ț だが、 代用字 ş, ţ の方が広く多く使われている – 1989年 ルーマニアの民主化 – 2001年 正書法の文字が ISO8859-16(Latin-10) と Unicode に – 2007年 ルーマニア EU 加盟 – 2007年 誰もが使えるように (Windows Vista)
  • 59. ブカレストまで行って探してきた (Google Street View で) • 街中の看板にも代用字(セディーユ付き)が使われている
  • 60. 同一視する正規化が必要 • 代用字の方が使いやすい – web 上のニュース記事や twitter では、 正書法:代用字 = 1:2 くらいの割合 – 「ルーマニア語の IME 」でもセディーユ付き の方が出るらしい • ルーマニア語話者は多分区別してない ț ţ さ と みたいな雰囲気? U+021B U+0163
  • 61. ベトナム語文字の正規化 (1) • ベトナム語は12個の「母音」を持つ – a, ă, â, e, ê, i, y, o, ô, ơ, u, ư • ベトナム語は6種類の「声調」を持つ – a, ả, à, ã, á, ạ – 新聞など一般の文書でも声調記号を付けて記 述される – 声調記号は全ての母音に付けることが出来る • 12 * 6 = 72
  • 62. ベトナム語文字の正規化 (2) • 声調記号付き文字の表現 1. U+1ea0~U+1eff を使う • ẵ = U+1eb5 2. ダイアクリティカルマークとの合字と して表す • ẵ = U+0103 U+0303 – Webニュースやツイートでは半々 • ⇒ 正規化しないといけない – 2. を 1. に正規化
  • 64. Twitter 向け正規化 • 単純に除去 – URL – mention – ハッシュタグ – RT – 顔文字 (XD, :p など、ラテン文字が入るもの は特に)
  • 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. 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)に縮める – 削ってもいいが、言語の特徴も出ているので
  • 68. 評価 • 訓練データ(小+大)を使って、17言語判 別のモデルを学習 – 正則化無し SGD 8周 + L1-SGD 2周 • 訓練データ(小)を使って、同様に学習 • テストデータを言語判定した結果を評価
  • 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%
  • 71. で、でもあとは時間の問題? • データさえ増えれば精度はまだ上がる – フィンランド語やルーマニア語は確実に – ハンガリー語など、判別が容易な言語もまだ手つ かずで残っているw – Firehose があれば…… • 話者が少ないタイムゾーンだけでいいから…… • データの正確さがまだ足りない – 特にノルウェー語 – 地道に人間言語判別……まさに時間の問題……
  • 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. モデルのサイズ • 小+大(17言語) – パラメータ行列 88MB – 素性(Double Array) 8MB • 小のみ(17言語) – パラメータ行列 16MB – 素性(Double Array) 1.5MB • langdetect(53言語) – 1.7MB
  • 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. (参考) n-gram 素性を使ったら • (間に合いませんでした orz)
  • 76. まとめ • 精度 99% に届かず…… – でも近日達成見込み • 汎用性のある手法 – ツイートコーパスで学習させても、 Europarl の判定精度で langdetect と互角 • 現時点でツイートの言語判定するなら – langdetect + ツイートコーパスも現実的
  • 77. langdetect + ツイートコーパス • ツイートコーパスから作った 17 言語分の langdetect 言語プロファイル – 近日公開予定 – かなり精度が上がる • 入力は小文字化する – 全文が大文字化されたツイートも少なくない • langdetect は大文字のみの単語を略語と見なして極力 除外する – ⇒ ベトナム語に誤判定する率が下がる
  • 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. 課題 • モデルが巨大 – 精度を落とさずモデルを小さくしたいが、 試行錯誤しようにも時間がかかりすぎる – 単精度で十分だけど、Python は非サポート – ⇒ C++ で実装します • デンマーク語/ノルウェー語が苦手 – 非独立素性を入れれば精度が上がるかも? • 直感!
  • 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