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