80
∞-gram による短文言語判定 2011/11/23 TokyoNLP #8 中谷 秀洋@サイボウズ・ラボ @shuyo / id:n_shuyo

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

Embed Size (px)

DESCRIPTION

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

Citation preview

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

∞-gram による短文言語判定

2011/11/23 TokyoNLP #8

中谷 秀洋@サイボウズ・ラボ

@shuyo / id:n_shuyo

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

アジェンダ

• 言語判定

• 極大部分文字列

• 実装

• コーパス作りと正規化

• 評価

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

言語判定

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

これ何語?

• 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...

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

人間言語判定(一部)

• ik があればオランダ語。

• ich があればドイツ語。ß もドイツ語の特徴。

• czy があればポーランド語。Ł, ń, ś, ź もポーランド語のみ

• å があればデンマーク語かノルウェー語かスウェーデン語

– af があればデンマーク語。「ありがとう」は tak

– nei があればノルウェー語。「ありがとう」は takk

– och があればスウェーデン語。「ありがとう」は tack

• ı (点のない i) か ğ があればトルコ語

• ă や ș や ț があればルーマニア語

– ă はベトナム語でも使うが、似てないから大丈夫

– ş はトルコ語でも使うが、似てないから大丈夫

• WinXP で表示されない文字がいっぱいあったらベトナム語(ぇ

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

これ何語?(解答編)

• 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... ベトナム語

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

人間様の仕事じゃあ ないですね!

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

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 から同梱されるらしい

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

langdetect の中身

• 1~3-gram + ベイジアンフィルタ

– 特徴選択は出現率で足切り(単純)

• 53言語について 99% 以上の精度で判定

– 各種正規化と組み合わせることで、シンプル

な手法でも実用的な精度が出せた

• ある程度の長さの文章が対象

– 20語~, 50文字~ 程度が目安

– 短い文章の判定が苦手(twitter とか)

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

langdetect でツイートを判定すると

• テストデータは17言語。3語以上のツイート (詳細後述)

• langdetect に同梱のプロファイル(Wikipedia abstract で学習)を17言語に制限して使用

• 小文字化して判定を行い、最大確率が 0.6 以上のものを判定結果として採用

言語 正解 件数 正解率

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%

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

95% = 20個に 1個間違う

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

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

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

CLD でツイートを判定すると

• 判定範囲は76言語 (CLD には判定する対象言語を選択する方法がないっぽい)

• 判定結果のms(マレー語) は id(インドネシア語)に同一視

• nb(ノルウェー語ブールモーク)は no(ノルウェー語)と解釈

言語 正解 件数 正解率

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%

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

短文の言語判定は やっぱり難しい(らしい)

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

動機:それでも短文の言語判定したい?

• 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

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

問題設定:「短文言語判定できる」とは?

• やはり「精度 99% 以上」

– とはいえ「一語文」で達成は厳しすぎる……

– 「3語以上の文章で 99% 以上」を目標に

• 文字種の混合は考えなくていい

– 文字種ごとにチャンクに分ければいい

– 判別が一番難しい文字種はラテン文字

• 話者 500万人以上いる言語だけで 25 以上

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

方針:短文の言語判定するには?

• 3-gram では素性が足りない (直感!)

– 言語によっては短い素性で足りる

• ベトナム語とか

– 言語によっては長い素性が要る

• ascii の範囲で済む言語間とか

• 機能語の一致率がハンパない言語間とか

• 「巨大な辞書を持つしかないのでは?」

– という議論を Issues 上でしたり

– しかし辞書を手作りはありえない……

• ⇒ 可変長の素性を効率的に作成・選択したい

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

極大部分文字列

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

全ての部分文字列を考慮した文書分類 [岡野原+ 2008]

• 全ての部分文字列を素性とする多クラスロジ

スティック回帰

– 極大部分文字列のみを用いても同値なモデル

– 極大部分文字列は拡張 Suffix Array を使えば、

文字列長に対して線形時間で抽出できる

• 特徴選択+L1正則化により、n-gramより高

い性能をもつ十分小さいモデルが得られる

• 素性を TRIE に格納、予測(判定)も高速に

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

極大部分文字列とは? (1)

• (空でない)部分文字列の間に、ある種の

「包含関係」(半順序)を入れる

abracadabra

– “ra” ⊂ “bra“ ⇔ 全ての ”ra” は “bra” の

部分文字列として現れる

– “a” は “bra“ だけではなく “ca” などの部分

文字列にもなるので “a” ⊄ “bra“

※厳密には出現位置も考慮して定義する

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

極大部分文字列とは? (2)

abracadabra

– “r” ⊂ “ra” ⊂ “bra“⊂ “abra“

– “c” ⊂ “ca” ⊂ ……⊂ “abracadabra“

• 1回だけ現れる部分文字列は文字列全体に含まれる

– “a” はどの部分文字列とも包含関係を持たない

• この包含関係における極大元が「極大部分文字列」

• したがって abracadabra の極大部分文字列は

“a”, “abra”, “abracadabra” の3つ

自分より「大きい」 部分文字列がない

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

極大部分文字列のメリット

abracadabra

• “ra” ⊂ “bra“ であるとき、

– “ra” と “bra“ の出現頻度(あるいは有無)は常に一致する

• 特徴量(出現頻度や有無)を線形結合するモデルなら、包含関係のある特徴量同士をくくり出せる

– 例えばロジスティック回帰(対数線型モデル)

– 極大部分文字列を代表元とすればいい

※ただし、未知の文書でも同じ包含関係が成り立っているとは限らない

極大部分文字列だけで、全部分文字列を使うのと同値なモデルが得られる

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

極大部分文字列 vs n-gram

• 極大部分文字列は全部分文字列より小さい

– 素性の長さはコーパスに応じて適宜変わる

– 小さいコーパスなら 3~5-gram 程度

1-gram 69

2-gram 1186

3-gram 6283

4-gram 17709

5-gram 34912

極大~ 34058

Alice's Adventures in Wonderland

(145283 バイト)

1-gram 2188

2-gram 19749

3-gram 45032

4-gram 63754

5-gram 74997

極大~ 21088

吾輩は猫である 1~4章

(utf-8 / 256147 バイト)

「極大部分文字列 の味見 / 自然言語処理勉強会@東京 #3」より

http://d.hatena.ne.jp/n_shuyo/20101107/suffix_array

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

極大部分文字列の分布

• 小文字化を含む正規化を行った英語ツイート 5090件(300KB)について、素性の長さ(gram)とその種類数の分布をとったもの

gram 極大部分文字列 n-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

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

方針:短文の言語判定するには?

• 3-gram では素性が足りない (直感!)

–言語によっては短い素性で足りる

• ベトナム語とか

–言語によっては長い素性が要る

• ascii の範囲で済む言語間とか

• 機能語の一致率がハンパない言語間とか

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

3-gram では足りないけど、 9-gram とか多すぎる!

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

そういうとき 極大部分文字列は 素性として有効では?

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

極大部分文字列の求め方

• 極大部分文字列をナイーブに求めると、

文字列長 N に対して O(N2)

• 「拡張 Suffix Array」を使うと、 2回以

上現れる極大部分文字列を線形時間で求

めることができる [岡野原+ 2008]

– 1回現れる極大部分文字列は文字列全体のみ

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

論文の残りは 参考リンクでご紹介……

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

(拡張) 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

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

多クラスロジスティック回帰

• 教師有り分類器

– 識別モデル

– 非独立な特徴量が使える

• 今回そこまで行けませんでしたが

• パターン認識と機械学習(PRML) 4章

– 詳しく載ってますw

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

特徴選択

• [Perkins+ 2003] Grafting

– 素性候補のうち、目標関数の勾配が最も大き

いものから順に有効にしていく手法

– 今回使いません。

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

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 の「最後のデータに引っ張られて素性がつぶれにくい」という点を改良

– 今回の実装で使用

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

TRIE

• 前方一致が可能なデータ構造

• DSIRNLP#1で発表しました「TRIEにトライ!~今日からはじめるTRIE入門~」

– http://d.hatena.ne.jp/echizen_tm/20110724/1311519029

– id:echizen_tm さんのわかりやすい入門

• WEB+DB Press vol. 64 「作って学ぶ日本語入力 ~かな漢字変換をどのように実現するか~」

– PFI 徳永さんの記事。TRIE および、今回の実装で用いた Double Array の解説あり

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

実装

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

Language Detection with Infinity-Gram (ldig)

• ラテン文字言語判定器のプロトタイプ

– https://github.com/shuyo/ldig

– Python / numpy

– MIT license

– 多クラスLR + L1 SGD + Double Array

• ターゲット : ツイートの言語判定

– twitter 特有の表現を正規化

– 各種言語向け正規化

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

使い方 (1) モデルの初期化

• ldig.py -m [モデル] --init [コーパス]

-x [極大部分文字列抽出器]

--ff=[頻度の最小値]

– コーパスから素性を抽出し、モデルを初期化する

– -m : モデルを格納するディレクトリ

– -x : テキストから極大部分文字列を抽出する(外

部プロセスとして起動)

– --ff : 素性を頻度で足きり

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

極大部分文字列抽出器

• maxsubst [input file] [output file]

– 入力は複数行テキストファイル

– 出力は ”[素性]¥t[頻度]” の形式

• タブは空白に置換、改行文字は U+0001 に置き換え

• という仕様のツールを別途ご用意ください(ぇ

– もちろん作ってあるが、未公開の社内ライブラリを組み込んでいるのでまだ公開できない

– そのうち公開できる、はず

• なくてもモデルの新規作成が出来ないだけ

– 既存モデルを使って言語判定するには問題なし

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

配布モデル

• github にてモデル(小)を配布中

– https://github.com/shuyo/ldig/tree/master/models

– 展開すると model.small というディレクト

リが作られる

– -m オプションでこのディレクトリを指定

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

使い方 (2) 学習

• ldig.py -m [モデル] --learning [コーパス] -e [学習率] -r [正則化係数] --wr=[全体正則化を行う頻度]

– SGD 1周分の学習を行う

– -e : 学習率

– -r : 指定すると L1 正則化を行う

– --wr : 全パラメータを正則化する回数

• パラメータが多くて非常に時間がかかるため、計算をサボっている……

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

使い方 (3) モデル縮小

• ldig.py -m [モデル] --shrink

– 有効でない素性(=パラメータが全て0)を除外

して、モデルを小さくする

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

使い方 (4) 言語判定

• ldig.py -m [モデル] [テストデータ]

– テストデータの言語判定を行い、結果とサマ

リーを出力する

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

データ形式

• 訓練データ・テストデータ共通

– [正解ラベル]¥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 .

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

コーパス作成と正規化

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

コーパスの作り方

• twitter Streaming API の sample メ

ソッド

– 全ツイートの 1%程度をサンプリング

– 1日 200万件

• ラテン文字の言語はその6割程度

• これに言語ラベルを振るだけの

かんたんなお仕事

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

言語ラベルを振る

• ツイートをユーザのタイムゾーンごとに分類

– フランス語のツイートは全体の 1% 程度

– しかし Paris タイムゾーンに限れば 50%

• ただし全体の2割はタイムゾーン未設定

• langdetect で仮ラベルを振る

– fr のツイートから、フランス語以外を除く(手作業)

– fr 以外のツイートから、フランス語を拾う(手作業)

• これを各言語ごとに繰り返し行い続ける

ラテン文字中 7番目の多さ!

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

手作業(イメージ図)

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

手作業の一例

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/リンブルフ語

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

作成したデータセット 言語 訓練データ(小) 訓練データ(大) テストデータ

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

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

データ量の偏り

• ラテン文字言語でつぶやかれているツイートの内訳

英語

ポルトガル語

スペイン語

インドネシア語

オランダ語

フランス語

ドイツ語

トルコ語

イタリア語

スウェーデン語

その他の言語は 全部併せてこのくらい

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

データ量偏り対策

• データを各言語ごとに重複サンプリング

して、一番多い言語データの量にあわせ

– 実際には、「データの整数倍+余り分を重複

無しサンプリング」で近似

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

ところで

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

そもそも「ラテン文字」って?

• ラテン文字 ≠ 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拡張 (国際音声記号)

U+0300-036F Combining Diacritical Marks

ダイアクリティカルマーク 声調記号などを合成

U+1E00-1EFF Latin Extended Additional

ラテン文字拡張追加 実質、ベトナム語専用

U+2C60-2C7F Latin Extended-C ラテン文字拡張C 現代語では ほぼ使われない U+A720-A7FF Latin Extended-D ラテン文字拡張D

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

ざっくり眺めるとこんな感じ

まるっと

ベトナム語用 よく使う ところどころ使う

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

小文字化

• コーパスが乏しい

– 大文字と小文字を別々の文字にするなんてもった

いない!

• モデルが巨大(後述)

– 小文字化すればだいぶ小さくなる

• Double Array 的に文字種が少ないと嬉しい

– 詳細省略w

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

トルコ語を考慮した小文字化

• トルコ語は I (U+0049) の小文字が異なる

– Java, Python の小文字化はロケールを考慮

• I と i で意味が異なる言語もある

• ⇒ I を除外して小文字化

大文字 小文字

トルコ語以外 I (U+0049) i (U+0069)

トルコ語 I (U+0049) ı (U+0131)

İ (U+0130) i (U+0069)

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

ルーマニア語文字の正規化

• 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

どっちが 正解?

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

両方正解

• 正書法が定めるのは ș, ț だが、

代用字 ş, ţ の方が広く多く使われている

– 1989年 ルーマニアの民主化

– 2001年 正書法の文字が ISO8859-16(Latin-10)

と Unicode に

– 2007年 ルーマニア EU 加盟

– 2007年 誰もが使えるように (Windows Vista)

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

ブカレストまで行って探してきた (Google Street View で)

• 街中の看板にも代用字(セディーユ付き)が使われている

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

同一視する正規化が必要

• 代用字の方が使いやすい

– web 上のニュース記事や twitter では、

正書法:代用字 = 1:2 くらいの割合

– 「ルーマニア語の IME 」でもセディーユ付き

の方が出るらしい

• ルーマニア語話者は多分区別してない

ț ţ U+021B U+0163

みたいな雰囲気?

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

ベトナム語文字の正規化 (1)

• ベトナム語は12個の「母音」を持つ

– a, ă, â, e, ê, i, y, o, ô, ơ, u, ư

• ベトナム語は6種類の「声調」を持つ

– a, ả, à, ã, á, ạ

– 新聞など一般の文書でも声調記号を付けて記

述される

– 声調記号は全ての母音に付けることが出来る

• 12 * 6 = 72

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

ベトナム語文字の正規化 (2)

• 声調記号付き文字の表現

1. U+1ea0~U+1eff を使う

• ẵ = U+1eb5

2. ダイアクリティカルマークとの合字と

して表す

• ẵ = U+0103 U+0303

– Webニュースやツイートでは半々

• ⇒ 正規化しないといけない

– 2. を 1. に正規化

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

デンマーク語とノルウェー語

• (略)

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

Twitter 向け正規化

• 単純に除去

– URL

– mention

– ハッシュタグ

– RT

– 顔文字 (XD, :p など、ラテン文字が入るもの

は特に)

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

twitter 表現を考慮した正規化

• coooooooollllll みたいなやつ

• 対応案1: [Brody+ 2011] で正規化辞書を作る

– cooooooooollllllll => cool

– http://d.hatena.ne.jp/n_shuyo/20110914/twitter

– 辞書にない単語に対応できない

• 対応案2: 3文字以上の連続を2文字に縮める

– 正書法の範囲で、同じラテン文字が3個以上続く言語はない

• 日本語だと「かたたたき」とか「かわいいいぬ」とかあるけど

• 略語だと WWW とか СССРとかあるけどね

• 現在は案2のみ対応

– 案1 も組み合わせるのがおそらくベスト

知ってる範囲で

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

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)に縮める

– 削ってもいいが、言語の特徴も出ているので

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

評価

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

評価

• 訓練データ(小+大)を使って、17言語判

別のモデルを学習

– 正則化無し SGD 8周 + L1-SGD 2周

• 訓練データ(小)を使って、同様に学習

• テストデータを言語判定した結果を評価

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

評価結果 言語 正解 件数 正解率

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%

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

orz

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

で、でもあとは時間の問題?

• データさえ増えれば精度はまだ上がる

– フィンランド語やルーマニア語は確実に

– ハンガリー語など、判別が容易な言語もまだ手つかずで残っているw

– Firehose があれば……

• 話者が少ないタイムゾーンだけでいいから……

• データの正確さがまだ足りない

– 特にノルウェー語

– 地道に人間言語判別……まさに時間の問題……

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

小さいモデルで判定

言語 正解 件数 正解率

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%

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

モデルのサイズ

• 小+大(17言語)

– パラメータ行列 88MB

– 素性(Double Array) 8MB

• 小のみ(17言語)

– パラメータ行列 16MB

– 素性(Double Array) 1.5MB

• langdetect(53言語)

– 1.7MB

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

(参考) Europarl データセットに対して

• データセットに含まれる21言語から、ldig の学習データがない bg, el, et, hu, lt, lv, sk, sl を除外

– CLD(76言語) = 98.82%, langdetect(53言語) = 99.22%

言語 正解 件数 正解率

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%

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

(参考) n-gram 素性を使ったら

• (間に合いませんでした orz)

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

まとめ

• 精度 99% に届かず……

– でも近日達成見込み

• 汎用性のある手法

– ツイートコーパスで学習させても、 Europarl

の判定精度で langdetect と互角

• 現時点でツイートの言語判定するなら

– langdetect + ツイートコーパスも現実的

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

langdetect + ツイートコーパス

• ツイートコーパスから作った 17 言語分の langdetect 言語プロファイル

– 近日公開予定

– かなり精度が上がる

• 入力は小文字化する

– 全文が大文字化されたツイートも少なくない

• langdetect は大文字のみの単語を略語と見なして極力除外する

– ⇒ ベトナム語に誤判定する率が下がる

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

langdetect + ツイッターコーパス

• langdetect + Wikipedia コーパスでは 95.4%

• やはりドメインに適したコーパスは強い

言語 正解 件数 正解率

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%

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

課題

• モデルが巨大

– 精度を落とさずモデルを小さくしたいが、

試行錯誤しようにも時間がかかりすぎる

– 単精度で十分だけど、Python は非サポート

– ⇒ C++ で実装します

• デンマーク語/ノルウェー語が苦手

– 非独立素性を入れれば精度が上がるかも?

• 直感!

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

参考文献

• [岡野原+ 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