Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
言語処理するのに
Python でいいの?
PyData.Tokyo #5 2015/5/22
サイボウズ・ラボ株式会社
中谷 秀洋(@shuyo)
@shuyo
今日の発表の姉妹編
• 数式を綺麗にプログラミングするコツ
– http://www.slideshare.net/shuyo/programming-based-on-formula
– 夏のプロシン2013
– 数式をコードに「短く」「正確...
自然言語処理
• 自然言語処理とは?
– 自然言語をコンピュータでうんぬん(略)
• 自然言語+処理
– 「実装して動いて なんぼ」
まあまあ
よく聞かれる
「自然言語処理するのに
何で実装するのが
いいですか?」
セットで
よく聞かれる
「やっぱり Python が
いいんですかねえ」
or
「やっぱり Python じゃあ
まずいですかねえ」
「実装したいモデルやアプリに
あわせて選べばいいですよ」
「好きな言語で実装すれば
いいんじゃあないですか」
自然言語処理の実装
• モデルの理解やドメインの知識 >>……
……>> プログラミング能力
– プログラミングが必ずしも得意じゃない
– 数学が(ry
– (データ解析とか統計処理とかも同様)
• 「好きなプログラミング言語で実装」
• 「ア...
「ライブラリ使えば?
最近はいいライブラリ
多いですし」
多すぎるし!
• Python
– Numpy / Scipy
– Scikit-learn
– Theano
– Caffe
– NLTK
• C++
– Octava / Eigen
– Vowpal Wabbit
• Java
– Mah...
そこで!
プログラミング言語選びガイド
• どのようなところが言語処理に向いてるか、
向いていないか
– Python
– C++
– Java
– (R言語)
• できるだけ公平に評価
– あとで「聞いてないよ!」と後悔しないように
Python
• 手軽
– 書いたらすぐ動く
– エラーもわかりやすい(超重要)
• 豊富なライブラリ
– Cython みたいな裏技めいたものも
• v2 と v3 の並立による混乱
– 例えば Theano は v3 未対応
C++
• 速度
– うまく書けば速い
• 省メモリ(重要)
– うまく書けば大規模OK
• うまく書けば……
– うまく書ける人は少ない
– 落とし穴の多さ深さでは誰にも負けない!
Java
• 環境要件ドリブン
– Hadoopありきとか
– J2EE サーバを使うことが決まっているとか
• 開発者(経験者)が多い
– (あとから)人を集められる
• 強力な IDE
– 誰が書いても同じコード。保守性が高い
• 冗長すぎ...
(R言語)
• 計量言語学やコーパス言語学の畑でよく
使われている印象
• エンジニアは……
– 文字列の扱いに癖がある
– 統計処理だけで完結しない場合に手間が多い
プログラミング言語の選び方を
具体例で見てみる
具体例:言語判定
• テキストが何語で書かれたものか推定
– 今日はいい天気ですね → 日本語
– It’s a fine day → 英語
– Een hele mooie dag → オランダ語
• 言語処理の前提タスク
– 何語の言語モデ...
langdetect (language-detection)
[中谷 2010]
• 言語判定 Java ライブラリ
– 新聞記事などの長く整った文章向け
– 文字 3-gram + ベイジアンフィルタ
– http://code.googl...
ldig (Language Detection with Infinity-Gram)
[中谷 NLP2012]
• twitter などの短文用の言語判定器
– 短文用の判別モデル
– ツイートコーパスを独自に作成
• 実装
– https...
なんかよくわからなかった?
• 言語判定が2種類ある
– langdetect (きれいな長文用)
– ldig (きたない短文用)
• ことだけ押さえておいてください
実装の変遷
• langdetect
– プロトタイプ : Ruby
– プロダクト : Java
• ldig
– プロトタイプ : Python
– プロトタイプ2 : C++
• 「なぜその言語で実装したの?」
理由には
実装に至るストーリーが
製品の検索機能に
言語の絞り込みを付けたい
• 既存の言語判定器を調査
– 対応言語が少ない&精度が低い
• 「3-gram+ベイジアンフィルタ」で十分
精度が出せそうな気がするから試そう
– 簡単なモデル(カウントさえできればいい)
– どの...
langdetect プロトタイプ
• Ruby で実装
– 速度は遅く、行列ライブラリもない(当時)
– テキスト処理が得意な、慣れた言語
• ものが動くまでの時間が短い
• テスト
– 16言語の判定に92%
• 特徴設計、クリーニング等を...
langdetect プロダクト
• Java で実装
– Apache Solr に組み込みたい(環境要件!)
• オープンソースの Java 製検索エンジン
– 53言語 99.8% の精度
• ライブラリをオープンソースで公開
– Sol...
twitter でやってみた!
• 精度 92% まで落ちる
– 3-gram では素性が足りなかった?
• ∞-gram ロジスティック回帰[岡野原+ 08]
– 任意の長さの部分文字列を素性に
• これを使えばできるかもしれない?
– プロ...
ldig プロトタイプ
• Python で実装
– 高次元ベクトルの計算
• Ruby ではツライ
– 予想:クリーニングで激しく試行錯誤するだろう
• (予想通り)
– 一部分だけ C++
• 素性(極大部分文字列)の抽出は重すぎる
• 岡...
Trie / DoubleArray
• 前方一致する文字列を探索するアルゴリズム
– 膨大かつ長さ不定の素性の探索に利用
• 当初、dict で素朴に Trie を実装
– 10MB のコーパス食わせたらメモリオーバー
• 「高速」かつ省メモ...
ldig プロトタイプ2
• C++ で実装
– より大規模なコーパスを食わせたい
– メモリをきちんと使えばもっといける
• 問題:C++の文字列は言語処理に適さない
– 1「キャラクタ」=1バイト≠1文字
– wchar ってのもあるが、い...
cybozu::String (cybozulib)
• https://github.com/herumi/cybozulib
– 3-Clause BSD License
• C++ で文字列を扱う
– std::string インターフェ...
おまけ:Cython
• Python コードを静的にコンパイル
– うまくいけば、少ない労力で高速化
– ldig の場合、DoubleArray が 3~9倍速、全体では
学習が2割up、推定が倍速に
• Python コードの時点で最適化...
まとめ
• 複数のプログラミング言語を学ぶ余裕があれ
ば Better だけど……
– Python / C++ / Java ができればまず困らない
• 1つしかできないなら、やりたいこと・規模
にあわせて選択したいけど……
– 自分に合わな...
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
Upcoming SlideShare
Loading in …5
×

言語処理するのに Python でいいの? #PyDataTokyo

18,615 views

Published on

Published in: Technology
  • Be the first to comment

言語処理するのに Python でいいの? #PyDataTokyo

  1. 1. 言語処理するのに Python でいいの? PyData.Tokyo #5 2015/5/22 サイボウズ・ラボ株式会社 中谷 秀洋(@shuyo)
  2. 2. @shuyo
  3. 3. 今日の発表の姉妹編 • 数式を綺麗にプログラミングするコツ – http://www.slideshare.net/shuyo/programming-based-on-formula – 夏のプロシン2013 – 数式をコードに「短く」「正確に」落とす
  4. 4. 自然言語処理 • 自然言語処理とは? – 自然言語をコンピュータでうんぬん(略) • 自然言語+処理 – 「実装して動いて なんぼ」
  5. 5. まあまあ よく聞かれる
  6. 6. 「自然言語処理するのに 何で実装するのが いいですか?」
  7. 7. セットで よく聞かれる
  8. 8. 「やっぱり Python が いいんですかねえ」 or 「やっぱり Python じゃあ まずいですかねえ」
  9. 9. 「実装したいモデルやアプリに あわせて選べばいいですよ」
  10. 10. 「好きな言語で実装すれば いいんじゃあないですか」
  11. 11. 自然言語処理の実装 • モデルの理解やドメインの知識 >>…… ……>> プログラミング能力 – プログラミングが必ずしも得意じゃない – 数学が(ry – (データ解析とか統計処理とかも同様) • 「好きなプログラミング言語で実装」 • 「アプリに合わせて言語を選ぶ」 – おまえは何を言っているんだ状態
  12. 12. 「ライブラリ使えば? 最近はいいライブラリ 多いですし」
  13. 13. 多すぎるし! • Python – Numpy / Scipy – Scikit-learn – Theano – Caffe – NLTK • C++ – Octava / Eigen – Vowpal Wabbit • Java – Mahout – Spark MLlib – Weka – Stanford CoreNLP • .NET – Accord.NET • Lua – Torch • Jubatus • OpenCV • AzureML • Amazon ML • R • MATLAB • …… • …………
  14. 14. そこで!
  15. 15. プログラミング言語選びガイド • どのようなところが言語処理に向いてるか、 向いていないか – Python – C++ – Java – (R言語) • できるだけ公平に評価 – あとで「聞いてないよ!」と後悔しないように
  16. 16. Python • 手軽 – 書いたらすぐ動く – エラーもわかりやすい(超重要) • 豊富なライブラリ – Cython みたいな裏技めいたものも • v2 と v3 の並立による混乱 – 例えば Theano は v3 未対応
  17. 17. C++ • 速度 – うまく書けば速い • 省メモリ(重要) – うまく書けば大規模OK • うまく書けば…… – うまく書ける人は少ない – 落とし穴の多さ深さでは誰にも負けない!
  18. 18. Java • 環境要件ドリブン – Hadoopありきとか – J2EE サーバを使うことが決まっているとか • 開発者(経験者)が多い – (あとから)人を集められる • 強力な IDE – 誰が書いても同じコード。保守性が高い • 冗長すぎる – Java で書いてる人「Javaで書きたくない」
  19. 19. (R言語) • 計量言語学やコーパス言語学の畑でよく 使われている印象 • エンジニアは…… – 文字列の扱いに癖がある – 統計処理だけで完結しない場合に手間が多い
  20. 20. プログラミング言語の選び方を 具体例で見てみる
  21. 21. 具体例:言語判定 • テキストが何語で書かれたものか推定 – 今日はいい天気ですね → 日本語 – It’s a fine day → 英語 – Een hele mooie dag → オランダ語 • 言語処理の前提タスク – 何語の言語モデルを使えばいいか – 検索、翻訳、分類、etc
  22. 22. langdetect (language-detection) [中谷 2010] • 言語判定 Java ライブラリ – 新聞記事などの長く整った文章向け – 文字 3-gram + ベイジアンフィルタ – http://code.google.com/p/language-detection/ • 詳細: – Language Detection Library for Java – http://www.slideshare.net/shuyo/language-detection-library-for-java
  23. 23. ldig (Language Detection with Infinity-Gram) [中谷 NLP2012] • twitter などの短文用の言語判定器 – 短文用の判別モデル – ツイートコーパスを独自に作成 • 実装 – https://github.com/shuyo/ldig (Python) – https://github.com/shuyo/ldig/tree/cpp/ldigcpp (C++) • 詳細: – Short Text Language Detection with Infinity-Gram – http://www.slideshare.net/shuyo/short-text-language-detection-with-infinitygram- 12949447
  24. 24. なんかよくわからなかった? • 言語判定が2種類ある – langdetect (きれいな長文用) – ldig (きたない短文用) • ことだけ押さえておいてください
  25. 25. 実装の変遷 • langdetect – プロトタイプ : Ruby – プロダクト : Java • ldig – プロトタイプ : Python – プロトタイプ2 : C++ • 「なぜその言語で実装したの?」
  26. 26. 理由には 実装に至るストーリーが
  27. 27. 製品の検索機能に 言語の絞り込みを付けたい • 既存の言語判定器を調査 – 対応言語が少ない&精度が低い • 「3-gram+ベイジアンフィルタ」で十分 精度が出せそうな気がするから試そう – 簡単なモデル(カウントさえできればいい) – どの程度の精度が見込めるか手早く知りたい
  28. 28. langdetect プロトタイプ • Ruby で実装 – 速度は遅く、行列ライブラリもない(当時) – テキスト処理が得意な、慣れた言語 • ものが動くまでの時間が短い • テスト – 16言語の判定に92% • 特徴設計、クリーニング等を全くしていない – 望む精度が出せる見込みが立った
  29. 29. langdetect プロダクト • Java で実装 – Apache Solr に組み込みたい(環境要件!) • オープンソースの Java 製検索エンジン – 53言語 99.8% の精度 • ライブラリをオープンソースで公開 – Solr の言語判定器として同梱 – Hadoop への組み込みで普及
  30. 30. twitter でやってみた! • 精度 92% まで落ちる – 3-gram では素性が足りなかった? • ∞-gram ロジスティック回帰[岡野原+ 08] – 任意の長さの部分文字列を素性に • これを使えばできるかもしれない? – プロトタイプで確認してみよう
  31. 31. ldig プロトタイプ • Python で実装 – 高次元ベクトルの計算 • Ruby ではツライ – 予想:クリーニングで激しく試行錯誤するだろう • (予想通り) – 一部分だけ C++ • 素性(極大部分文字列)の抽出は重すぎる • 岡野原さんの C++ ライブラリを使う
  32. 32. Trie / DoubleArray • 前方一致する文字列を探索するアルゴリズム – 膨大かつ長さ不定の素性の探索に利用 • 当初、dict で素朴に Trie を実装 – 10MB のコーパス食わせたらメモリオーバー • 「高速」かつ省メモリな DoubleArray に – メモリはギリギリ足りたが、速度は劇遅に • pure Python コードが増えた – 学習にまる1日かかる • DoubleArray が処理全体の3~7割を占める
  33. 33. ldig プロトタイプ2 • C++ で実装 – より大規模なコーパスを食わせたい – メモリをきちんと使えばもっといける • 問題:C++の文字列は言語処理に適さない – 1「キャラクタ」=1バイト≠1文字 – wchar ってのもあるが、いろいろ面倒
  34. 34. cybozu::String (cybozulib) • https://github.com/herumi/cybozulib – 3-Clause BSD License • C++ で文字列を扱う – std::string インターフェース互換 – 1「キャラクタ」=1文字 – 正規表現で .(dot) が1文字にマッチ – Python, Java などと同じ感覚で文字列を扱える※ ※内部表現の違い等に起因する細かい仕様の違いは存在する
  35. 35. おまけ:Cython • Python コードを静的にコンパイル – うまくいけば、少ない労力で高速化 – ldig の場合、DoubleArray が 3~9倍速、全体では 学習が2割up、推定が倍速に • Python コードの時点で最適化したものはあまり 速くならない – class メンバの型に制限があったり – 中途半端に型指定すると逆に遅くなることも • 試してみるのはアリ – メモリ管理事情は変わらないので、問題がそっちにある なら C/C++ に行かないと解決しない
  36. 36. まとめ • 複数のプログラミング言語を学ぶ余裕があれ ば Better だけど…… – Python / C++ / Java ができればまず困らない • 1つしかできないなら、やりたいこと・規模 にあわせて選択したいけど…… – 自分に合わない言語は身につかない! – 「実装できて なんぼ」 • 安心して Python を選ぼう

×