どの言語でつぶやかれたのか、機械が知る方法 #webdbf2013

33
どの言語でつぶやかれたのか、 機械が知る方法 2013/11/28 WebDB Forum 2013 中谷 秀洋@サイボウズ・ラボ @shuyo / id:n_shuyo

Upload: shuyo-nakatani

Post on 12-Nov-2014

8.568 views

Category:

Technology


1 download

DESCRIPTION

 

TRANSCRIPT

Page 1: どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013

どの言語でつぶやかれたのか、機械が知る方法

2013/11/28 WebDB Forum 2013

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

@shuyo / id:n_shuyo

Page 2: どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013

twitter の利用言語割合

• ターゲットは日本語だ

けでいいの?

– 残り 84% が対象外

6

(自社調べ、2013/11 現在)

言語 割合英語 37.5%日本語 16.0%スペイン語 9.7%マレー語/インドネシア語 7.0%アラビア語 6.4%ポルトガル語 4.0%トルコ語 2.6%ロシア語 2.4%フランス語 1.8%フィリピン語(タガログ語) 1.7%タイ語 1.2%韓国語 1.1%イタリア語 1.0%フィンランド語 0.7%オランダ語 0.7%ドイツ語 0.5%

Page 3: どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013

本発表の方針

• SNS (twitter や facebook) について

– 多言語に渡るサービスや研究をしたいとき

– 知ってて嬉しいテキスト表現の知見を紹介

• 正書法が通じると思ったら大間違い!

• 成果物やそのモデルについては最低限

7

Page 4: どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013

言語判定

8

Page 5: どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013

ある日こんなメールが

• 読めない……

9

Page 6: どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013

困ったときの Google 先生

• ポーランド語のスパムでした。 10

Page 7: どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013

そういえば 迷惑メールフォルダに入ってた

• でもなぜスパムだとわかったの? 11

Page 8: どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013

スパムフィルタ

• 「スパムっぽい単語」があると

スパム確率up

• フィルタは言語ごとに必要

12

無料 バイアグラ

オオアリクイ :

free mastercard account

:

英語用フィルタ 日本語用フィルタ

※ベイジアンフィルタなどを利用したモデルの場合。

他にルールベース(ホワイト&ブラックリスト)のアプローチなどもあります

Page 9: どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013

言語判定とは

• 入力テキストの記述言語を推定

– Time fries like arrow → 英語

– Buona sera! → イタリア語

• 多くの言語処理での前提タスク

– 言語モデルは言語ごとに構築

– 検索、分類、抽出、翻訳、……

• 言語判定を間違えると、後も全部こける!

13

Page 10: どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013

ニューステキストに対する言語判定 (後述する langdetect による評価)

∞-gram を使った短文言語判定 (確率の科学 #6)

14

言語 データ件数 正解数(率) 内訳af アフリカーンス語 200 199 (99.50%) en=1, af=199ar アラビア語 200 200 (100.00%) ar=200bg ブルガリア語 200 200 (100.00%) bg=200bn ベンガル語 200 200 (100.00%) bn=200cs チェコ語 200 200 (100.00%) cs=200da デンマーク語 200 179 (89.50%) da=179, no=14, en=7de ドイツ語 200 200 (100.00%) de=200el ギリシア語 200 200 (100.00%) el=200en 英語 200 200 (100.00%) en=200es スペイン語 200 200 (100.00%) es=200fa ペルシア語 200 200 (100.00%) fa=200fi フィンランド語 200 200 (100.00%) fi=200fr フランス語 200 200 (100.00%) fr=200gu グジャラート語 200 200 (100.00%) gu=200he ヘブライ語 200 200 (100.00%) he=200hi ヒンディー語 200 200 (100.00%) hi=200hr クロアチア語 200 200 (100.00%) hr=200hu ハンガリー語 200 200 (100.00%) hu=200id インドネシア語 200 200 (100.00%) id=200it イタリア語 200 200 (100.00%) it=200ja 日本語 200 200 (100.00%) ja=200kn カンナダ語 200 200 (100.00%) kn=200ko 朝鮮語(韓国語) 200 200 (100.00%) ko=200mk マケドニア語 200 200 (100.00%) mk=200ml マラヤーラム語 200 200 (100.00%) ml=200

言語 データ件数 正解数(率) 内訳mr マラーティー語 200 200 (100.00%) mr=200ne ネパール語 200 200 (100.00%) ne=200nl オランダ語 200 200 (100.00%) nl=200no ノルウェー語 200 199 (99.50%) da=1, no=199pa パンジャーブ語 200 200 (100.00%) pa=200pl ポーランド語 200 200 (100.00%) pl=200pt ポルトガル語 200 200 (100.00%) pt=200ro ルーマニア語 200 200 (100.00%) ro=200ru ロシア語 200 200 (100.00%) ru=200sk スロバキア語 200 200 (100.00%) sk=200so ソマリ語 200 200 (100.00%) so=200sq アルバニア語 200 200 (100.00%) sq=200sv スウェーデン語 200 200 (100.00%) sv=200sw スワヒリ語 200 200 (100.00%) sw=200ta タミル語 200 200 (100.00%) ta=200te テルグ語 200 200 (100.00%) te=200th タイ語 200 200 (100.00%) th=200tl タガログ語 200 200 (100.00%) tl=200tr トルコ語 200 200 (100.00%) tr=200uk ウクライナ語 200 200 (100.00%) uk=200ur ウルドゥー語 200 200 (100.00%) ur=200vi ベトナム語 200 200 (100.00%) vi=200

zh-cn 中国語(簡体字) 200 200 (100.00%) zh-cn=200zh-tw 中国語(繁体字) 200 200 (100.00%) zh-tw=200

合計 9800 9777 (99.77%)

Page 11: どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013

言語判定は「単純なテキスト分類問題」

• 十分長い&低ノイズなテキストに対し

99%以上の精度 [Cavnar+ 94]

– ナイーブベイズ+文字3-gram による簡易な

実装だけでも 90% くらい出る

• 言語判定はオワコン?

– 研究的にはもしかしたらそうかも

– でも実用面ではまだまだがんばらないと!

15

Page 12: どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013

ツイートを言語判定すると

• 精度は 90~95%

• LD = language-detection

• CLD = Chromium Compact Language Detection

– http://code.google.com/p/chromium-compact-language-detector/

• Tika = Apache Tika

– http://tika.apache.org/

– 対応している15言語のみ評価

言語 LD CLD Tikaca カタルーニャ語 95.3 93.0 83.8cs チェコ語 96.3 96.6 ----da デンマーク語 94.5 90.7 58.7de ドイツ語 86.6 96.8 73.1en 英語 88.3 97.4 54.7es スペイン語 91.5 90.5 44.4fi フィンランド語 98.9 99.4 94.8fr フランス語 95.0 94.5 67.4hu ハンガリー語 85.8 89.0 76.2id インドネシア語 89.7 92.8 ----it イタリア語 96.2 93.8 87.1nl オランダ語 69.5 93.2 65.0no ノルウェー語 96.0 74.9 68.6pl ポーランド語 98.0 97.8 88.8pt ポルトガル語 88.0 88.6 47.4ro ルーマニア語 92.8 96.1 82.6sv スウェーデン語 96.0 96.4 75.6tr トルコ語 97.6 97.4 ----vi ベトナム語 98.7 98.9 ----

計 92.2 93.8 70.0

16

Page 13: どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013

twitter言語判定は難しい

• テキスト長が短い

– twitter は最大140字、多くは十数~数十字以下

– 3-gram ではわずかな素性しか取り出せない

– ★短文から豊富な素性を抽出できるモデルが必要

• ノイズが多い

– 正書法から外れた表現(省略語、短縮語、繰り返し)

– 通常の言語モデルに当てはめると尤度が小さい

– ★ノイズクリーニング&専用のコーパスが必要

17

Page 14: どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013

精度 90% もあれば十分?

• 実用には厳しい

– 10個に1個間違う

– 95% でも、20個に1個間違う

• 特に言語判定はがんばらないと

– 様々な言語処理の前提タスク

• 言語判定を間違えると、後も全部こける!

– 精度99%は欲しい

18

Page 15: どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013

言語判定の成果

19

Page 17: どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013

language-detection(langdetect) (中谷 2010)

• 言語判定 Java ライブラリ – http://code.google.com/p/language-detection/

– オープンソース (Apache License 2.0)

– 文字 3-gram + ベイジアンフィルタ

– 各種正規化+特徴のサンプリング

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

– 対象は新聞記事など「ある程度長く整った文章」

– アジア圏の言語にも広く対応

– Apache Solr など、多くの製品・研究に利用

21

Page 18: どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013

ldig プロトタイプ (Language Detection with Infinity-Gram)

• ラテン文字ツイートの言語判定器

– 19言語ツイートコーパスを作成し、学習

• Python 実装

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

– オープンソース (MIT license)

– 学習済みモデルも同 URL にて配布

• ∞-gram 多クラスロジスティック回帰

– 極大部分文字列[岡野原+ 08]

– L1 SGD (Cumulative Penalty) [Tsuruoka+ 09]

– Double Array

22

Page 19: どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013

ldigcpp

• ldig の C++ 実装

– https://github.com/shuyo/ldig/tree/cpp/ldigcpp

• 公開準備中(ドキュメント未整備)

– めざせ! 脱プロトタイプ

• ラテン文字以外も対応

– 50言語ツイートコーパス(約 48万件)

– その他、細かい改良

23

Page 20: どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013

コーパス作り(イメージ図)

24

Page 21: どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013

評価 on ldigcpp

25

# code 言語 訓練 テスト 正解 精度1 ar アラビア語 9,939 1,981 1,976 0.9972 ar-bz Arabizi 192 31 23 0.7423 bg ブルガリア語 9,540 1,864 1,819 0.9764 bn ベンガル語 9,993 1,814 1,791 0.9875 ca カタルーニャ語 8,202 1,240 1,227 0.9906 cs チェコ語 10,315 1,930 1,916 0.9937 da デンマーク語 10,251 1,905 1,859 0.9768 de ドイツ語 10,130 1,809 1,802 0.9969 dv ディベヒ語 978 102 102 1.000

10 el ギリシャ語 9,442 1,889 1,888 0.99911 en 英語 10,269 2,032 1,988 0.97812 es スペイン語 10,371 2,056 2,016 0.98113 et エストニア語 2,067 543 529 0.97414 fa ペルシャ語 9,904 1,965 1,956 0.99515 fi フィンランド語 9,702 2,055 2,036 0.99116 fr フランス語 9,927 2,042 2,010 0.98417 gu グルジア語 1,547 106 105 0.99118 he ヘブライ語 9,705 1,950 1,950 1.00019 hi ヒンディー語 9,956 1,821 1,817 0.99820 hr クロアチア語 8,624 1,923 1,880 0.97821 hu ハンガリー語 9,811 1,959 1,939 0.99022 id インドネシア語 9,903 1,974 1,951 0.98823 it イタリア語 10,283 1,988 1,982 0.99724 ja 日本語 9,916 1,968 1,967 0.99925 ko 韓国語 9,906 1,976 1,974 0.999

# code 言語 訓練 テスト 正解 精度26 lt リトアニア語 6,855 1,001 994 0.99327 lv ラトヴィア語 3,651 1,158 1,144 0.98828 mk マケドニア語 6,654 1,340 1,323 0.98729 ml マラヤーラム語 7,103 996 996 1.00030 mn モンゴル語 120 28 28 1.00031 nl オランダ語 9,840 1,964 1,939 0.98732 no ノルウェー語 9,673 1,896 1,838 0.96933 pa パンジャーブ語 1,550 201 201 1.00034 pl ポーランド語 10,186 1,722 1,717 0.99735 pt ポルトガル語 9,301 1,893 1,869 0.98736 ro ルーマニア語 9,571 1,924 1,909 0.99237 ru ロシア語 10,186 1,953 1,937 0.99238 si シンハラ語 4,114 671 670 0.99939 sq アルバニア語 2,432 421 414 0.98340 sv スウェーデン語 9,451 1,853 1,828 0.98741 ta タミル語 9,949 2,084 2,084 1.00042 te テルグ語 1,795 303 302 0.99743 th タイ語 8,993 1,761 1,761 1.00044 tl タガログ語 9,910 1,954 1,935 0.99045 tr トルコ語 9,698 1,928 1,918 0.99546 uk ウクライナ語 9,929 2,168 2,020 0.93247 ur ウルドゥー語 9,037 1,003 1,003 1.00048 vi ベトナム語 9,815 1,948 1,930 0.99149 zh-cn 中国語(簡体字) 9,790 1,840 1,816 0.98750 zh-tw 中国語(繁体字) 9,878 1,825 1,816 0.995

total 400,354 76,758 75,895 0.989

Page 22: どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013

SNS・チャット特有のテキスト表現

26

ブカレスト市内の看板(Google Streat View より)

Page 23: どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013

キーワードは 「易きに流れる」

27

Page 24: どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013

突然ですが 問題です

28

Page 25: どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013

何語のつぶやきでしょうか?

• ヒント

– 実際のツイートです

– 2億以上の話者がいるメジャーな言語です

29

t9b7en 3la khair

Page 26: どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013

30

t9b7en 3la khair

t 9 b 7 e n 3 l a kh ai r

ر ي خ ى ل ع ن ي ح ب ص ت

تصبحين على خير “Good night”

アラビア語

アラビア文字は右から左に

Arabizi にしたがって変換

Page 27: どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013

Arabizi (Arabic Chat Alphabet)

• アラビア文字をアルファベット+数字で置き換え

– http://en.wikipedia.org/wiki/Arabic_chat_alphabet

31 (Wikipedia より)

Page 28: どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013

Arabizi は90年代に誕生

• PC/スマホの普及にともない利用拡大

– 入力だけではなく Arabizi で読み書きを

• 「Arabizi はアラビア語を破壊しつつある」

– 学生「Arabizi に慣れたらアラビア文字で書けなくなってきた。レポートなどを書くときは一度 Arabizi で書いてからアラビア文字に変換」

– http://www.arabnews.com/node/374897

• 英単語混じりのアラビア語ツイートが!

32

入力/記述コストの低い方へ低い方へ

Page 29: どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013

アクセントの省略

• ascii アルファベット以外は入力しにくい

– ラテン文字言語ほぼ全般で発生

– スペイン語、クロアチア語、……

• 例:リトアニア語 “eik is cia”

– 正しくは “eik iš čia” (go from here)

• 例:一人称単数代名詞の主格

– チェコ語は “já”、スロバキア語は “ja”

– アクセント記号を省略された日には……

33

Page 30: どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013

文字の代替

• 入力しやすい別の文字で置き換え

• 例:ドイツ語の “ß”

– スイス以外でも “SS” に置き換えられる

• 例:モンゴル語

– キリル文字だがロシア語にない文字が2つある

– そのうちの1つ “ү”(U+04af) を “v”(U+0076) で表す

• 例:ルーマニア語

– 正書法の定める “ș”, “ț” より “ş”, “ţ” が多く使われる

• 例:ペルシャ語の ی (U+06cc, Farsi yeh)

– ي (U+064a, Arabic yeh)が使われる

34

Page 31: どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013

Twitter での「笑い」

• 綴りは言語によっていろいろ

– HOW MUCH DO YOU LOVE COACH BEISTE??? HHAHAHAHAHAH

– Hihihihi. :) Habe ich regulär 2x die Woche!

– Tafil con eso...!!! Jajajajajajaja

– Malo?? Jejejeje XP

– หน้าพาไมซ่ึง้เหรอ 5555555555555 กตูิสต้องเข้าใจ

• タイ語の 5 の読みは「ハー」(๕)

– Ахаха )) ось чому я її ніколи не любила

• でも基本は世界中で「(ア)ハハハ」でほぼ共通の音

– 「(イ)ヒヒ」「(エ)ヘヘ」「カカカ」「ククク」なども

– なぜか日本だけ「ちょwwwwwおまwwwwww」

39 ※ http://en.wikipedia.org/wiki/LOL に各国語の笑い表現がまとめられている

Page 32: どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013

まとめ

• 「易きに流れる」

– SNS テキストが正書法の通りだと思ったら大間違い

– これらの知識で正規化→単語共起などもより正確に

• 実用化とは

– ギリギリの精度を叩き出すためになんでもやる

• 自動でやれることには限界がある

– ライバルは自分?

• 「先行研究」がない領域

40

Page 33: どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013

References

• [中谷 NLP12]極大部分文字列を使った twitter 言語判定

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

• ニューエクスプレスシリーズ(白水社)

– スウェーデン語、ノルウェー語、デンマーク語、ポーランド語、ハンガリー語、ルーマニア語、チェコ語、リトアニア語、スペイン語、カタルーニャ語、ベトナム語、トルコ語、ドイツ語、オランダ語、マレー語、セルビア語・クロアチア語、他

• [Cavnar+ 94] N-Gram-Based Text Categorization

• [Tsuruoka+ 09] Stochastic Gradient Descent Training for L1-regularized Log-linear Models with Cumulative Penalty

41