38
言語処理するのに Python でいいの? PyData.Tokyo #5 2015/5/22 サイボウズ・ラボ株式会社 中谷 秀洋(@shuyo)

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

Embed Size (px)

Citation preview

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

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

PyData.Tokyo #5 2015/5/22

サイボウズ・ラボ株式会社

中谷 秀洋(@shuyo)

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

@shuyo

Page 3: 言語処理するのに Python でいいの? #PyDataTokyo
Page 4: 言語処理するのに Python でいいの? #PyDataTokyo
Page 5: 言語処理するのに Python でいいの? #PyDataTokyo

今日の発表の姉妹編

• 数式を綺麗にプログラミングするコツ– http://www.slideshare.net/shuyo/programming-based-on-formula

– 夏のプロシン2013

– 数式をコードに「短く」「正確に」落とす

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

自然言語処理

• 自然言語処理とは?

– 自然言語をコンピュータでうんぬん(略)

• 自然言語+処理

–「実装して動いて なんぼ」

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

まあまあよく聞かれる

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

「自然言語処理するのに何で実装するのがいいですか?」

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

セットでよく聞かれる

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

「やっぱり Python がいいんですかねえ」

or「やっぱり Python じゃあまずいですかねえ」

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

「実装したいモデルやアプリにあわせて選べばいいですよ」

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

「好きな言語で実装すればいいんじゃあないですか」

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

自然言語処理の実装

• モデルの理解やドメインの知識 >>……

……>> プログラミング能力

– プログラミングが必ずしも得意じゃない

– 数学が(ry

– (データ解析とか統計処理とかも同様)

• 「好きなプログラミング言語で実装」

• 「アプリに合わせて言語を選ぶ」

– おまえは何を言っているんだ状態

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

「ライブラリ使えば?最近はいいライブラリ

多いですし」

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

多すぎるし!

• 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

• ……

• …………

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

そこで!

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

プログラミング言語選びガイド

• どのようなところが言語処理に向いてるか、

向いていないか

– Python

– C++

– Java

– (R言語)

• できるだけ公平に評価

– あとで「聞いてないよ!」と後悔しないように

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

Python

• 手軽

– 書いたらすぐ動く

– エラーもわかりやすい(超重要)

• 豊富なライブラリ

– Cython みたいな裏技めいたものも

• v2 と v3 の並立による混乱

– 例えば Theano は v3 未対応

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

C++

• 速度

– うまく書けば速い

• 省メモリ(重要)

– うまく書けば大規模OK

• うまく書けば……

– うまく書ける人は少ない

– 落とし穴の多さ深さでは誰にも負けない!

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

Java

• 環境要件ドリブン

– Hadoopありきとか

– J2EE サーバを使うことが決まっているとか

• 開発者(経験者)が多い

– (あとから)人を集められる

• 強力な IDE

– 誰が書いても同じコード。保守性が高い

• 冗長すぎる

– Java で書いてる人「Javaで書きたくない」

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

(R言語)

• 計量言語学やコーパス言語学の畑でよく

使われている印象

• エンジニアは……

– 文字列の扱いに癖がある

– 統計処理だけで完結しない場合に手間が多い

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

プログラミング言語の選び方を具体例で見てみる

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

具体例:言語判定

• テキストが何語で書かれたものか推定

– 今日はいい天気ですね → 日本語

– It’s a fine day → 英語

– Een hele mooie dag → オランダ語

• 言語処理の前提タスク

– 何語の言語モデルを使えばいいか

– 検索、翻訳、分類、etc

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

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

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

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

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

なんかよくわからなかった?

• 言語判定が2種類ある

– langdetect (きれいな長文用)

– ldig (きたない短文用)

• ことだけ押さえておいてください

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

実装の変遷

• langdetect

– プロトタイプ : Ruby

– プロダクト : Java

• ldig

– プロトタイプ : Python

– プロトタイプ2 : C++

• 「なぜその言語で実装したの?」

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

理由には実装に至るストーリーが

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

製品の検索機能に言語の絞り込みを付けたい

• 既存の言語判定器を調査

– 対応言語が少ない&精度が低い

• 「3-gram+ベイジアンフィルタ」で十分

精度が出せそうな気がするから試そう

– 簡単なモデル(カウントさえできればいい)

– どの程度の精度が見込めるか手早く知りたい

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

langdetect プロトタイプ

• Ruby で実装

– 速度は遅く、行列ライブラリもない(当時)

– テキスト処理が得意な、慣れた言語

• ものが動くまでの時間が短い

• テスト

– 16言語の判定に92%

• 特徴設計、クリーニング等を全くしていない

– 望む精度が出せる見込みが立った

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

langdetect プロダクト

• Java で実装

– Apache Solr に組み込みたい(環境要件!)

• オープンソースの Java 製検索エンジン

– 53言語 99.8% の精度

• ライブラリをオープンソースで公開

– Solr の言語判定器として同梱

– Hadoop への組み込みで普及

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

twitter でやってみた!

• 精度 92% まで落ちる

– 3-gram では素性が足りなかった?

• ∞-gram ロジスティック回帰[岡野原+ 08]

– 任意の長さの部分文字列を素性に

• これを使えばできるかもしれない?

– プロトタイプで確認してみよう

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

ldig プロトタイプ

• Python で実装

– 高次元ベクトルの計算

• Ruby ではツライ

– 予想:クリーニングで激しく試行錯誤するだろう

• (予想通り)

– 一部分だけ C++

• 素性(極大部分文字列)の抽出は重すぎる

• 岡野原さんの C++ ライブラリを使う

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

Trie / DoubleArray

• 前方一致する文字列を探索するアルゴリズム

– 膨大かつ長さ不定の素性の探索に利用

• 当初、dict で素朴に Trie を実装

– 10MB のコーパス食わせたらメモリオーバー

• 「高速」かつ省メモリな DoubleArray に

– メモリはギリギリ足りたが、速度は劇遅に

• pure Python コードが増えた

– 学習にまる1日かかる

• DoubleArray が処理全体の3~7割を占める

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

ldig プロトタイプ2

• C++ で実装

– より大規模なコーパスを食わせたい

– メモリをきちんと使えばもっといける

• 問題:C++の文字列は言語処理に適さない

– 1「キャラクタ」=1バイト≠1文字

– wchar ってのもあるが、いろいろ面倒

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

cybozu::String (cybozulib)

• https://github.com/herumi/cybozulib

– 3-Clause BSD License

• C++ で文字列を扱う

– std::string インターフェース互換

– 1「キャラクタ」=1文字

– 正規表現で .(dot) が1文字にマッチ

– Python, Java などと同じ感覚で文字列を扱える※

※内部表現の違い等に起因する細かい仕様の違いは存在する

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

おまけ:Cython

• Python コードを静的にコンパイル

– うまくいけば、少ない労力で高速化

– ldig の場合、DoubleArray が 3~9倍速、全体では学習が2割up、推定が倍速に

• Python コードの時点で最適化したものはあまり速くならない

– class メンバの型に制限があったり

– 中途半端に型指定すると逆に遅くなることも

• 試してみるのはアリ

– メモリ管理事情は変わらないので、問題がそっちにあるなら C/C++ に行かないと解決しない

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

まとめ

• 複数のプログラミング言語を学ぶ余裕があれ

ば Better だけど……

– Python / C++ / Java ができればまず困らない

• 1つしかできないなら、やりたいこと・規模

にあわせて選択したいけど……

– 自分に合わない言語は身につかない!

– 「実装できて なんぼ」

• 安心して Python を選ぼう