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