Your SlideShare is downloading. ×
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

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

284

Published on

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

No Downloads
Views
Total Views
284
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
2
Comments
0
Likes
4
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

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

×