So-net無料ブログ作成

Python で文字列の数字部分と数字じゃない部分の集まりで分割したい [Python]

会社の Slack で質問して、いい回答が出たけど、忘れちゃうのでメモっておく

"ab123d45fgh67" -> ["ab","123","d","45","fgh","67"]

みたいに、文字列を分割して文字列の配列にしたい
itertools を使う例と re を使う例が出た
>>> import itertools
>>> [''.join(it) for _, it in itertools.groupby("ab123d45fgh67", str.isdigit)]
['ab', '123', 'd', '45', 'fgh', '67']
>>>

>>> import re
>>> re.findall(r'(\d+|\D+)', "ab123d45fgh67")
['ab', '123', 'd', '45', 'fgh', '67']
>>> 


やっていることはなんとなくわかるが、次にやりたくなったときにメモ残しておかないと再現できない自信がある

python2.7 でも python3.5 でも動いた。 ちょっとびっくり。
str.isdigit って渡しかた 3.5 でもできるんだな

リクルートテクノロジーの自動要約API [Python]

@shinyorke さん経由で Python の自動要約API の存在を知る
http://blog.recruit-tech.co.jp/2015/10/30/summpy-released/

GitHub のリポジトリは https://github.com/recruit-tech/summpy
python2.7 で、以下のパッケージが必要とのこと

- numpy
- networkx
- scikit-learn
- pulp
- cherrypy
- MeCab

自分の Ubuntu14.04 の環境で、できるだけ pip install でインストールした。
古いバージョンのものもあったので、それは pip install --upgrade で最新にした
(自分の環境では、 --upgrade する前は "scipy distance metrics do not support sparse matrices." と出てた。さっぱりわかってない)

MeCab(python-mecab)は、pip でインストールするのを早々に挫折して apt-get でインストールしたのだが、辞書を EUC-JP から UTF-8 にする必要があったため、 mecab コマンドも apt-get でインストールした。
そこらへん、まとめて http://mglab.blogspot.jp/2008/06/mecabpython.html あたりが参考になった。
結局、 Mecab 関係のインストールと設定は

$ sudo apt-get install mecab mecab-ipadic mecab-utils libmecab-dev
$ sudo /usr/lib/mecab/mecab-dict-index -d /usr/share/mecab/dic/ipadic \
-o /var/lib/mecab/dic/ipadic -f euc-jp -t utf-8 -p
$ sudo apt-get install python-mecab

こんな感じ。

とりあえず動くのだけ確認したけど、みんな、 WebAPI よりは、ライブラリ(pypi からインストールできるパッケージ)になっているほうがうれしいんじゃないかなと思う。
もちろん、使用例として WebAPI の実装があるのはうれしいんだけど。


残念ながらライセンスの表記がないので使いづらいなぁ

(2015-11-05 追記)
MITライセンスになってた。すばらしい
https://github.com/recruit-tech/summpy/commit/cec00ace472ba8a35279de0195ee96bab54a701a

PyCon JP 2015 に参加した [Python]

PyCon JP 2015 にどういうセッションがあったかはこれを見るとよい。
http://togetter.com/li/885210
(メディアスポンサーとしてまとめてくれた toggetter さん、すばらしい)

僕自身は、年々セッションを聞く時間が減って、今年は基調講演を含めて(必ず入れる)メインカンファレンスフォールの幾つかのトークしか聞いてない。
2日間、会場にはオープニングからクロージングまでいたのに。

まあ、ビデオがあるのでいつでも見られるし(実際には見ないけど)
「誰か、知り合いはいないかな・・・」
と会場内をうろうろするので、セッションを聞くよりも疲れる。

自分の聞きたいトークの会場に我先にと集まるひともいれば、ただ知り合いと世間話をするためにそこらへんをうろうろするひともいる。
本当は、もっと知らない人と話したいんだけど、そういう勇気があまりないので、来年は全員の名札に twitter のアイコンが入ってるといいな。

別にプログラム担当の方が狙っているわけではないのに、毎年すこしずつ集まる人たちの毛色がちがって面白い。
Web フレームワークの時もあるし、統計解析の人たちが多い時もあった。
今年は、女性コミュニティーの人たちと、(数値解析の中でも)pandas 関連のトークや LT が多かったように思う。

ボランティアスタッフの皆さんも、いつもの人も入れば、新しい人もいて、新陳代謝があって、このままどんどん入れ替わって行って、イベントが長く続くといいなぁ、と思っている。

今年は去年と同じ会場だったので、道間違えたりしなかったけど、そろそろ広さ的に厳しいかな、と思った。メインホール以外は、僕のような出遅れ気味の人間が入れないくらい人いっぱいのセッションが多かったし。
ランチが屋台だったり、コーヒーが無限になったりして、運営上の新しいチャレンジがあってよかった。
食べ物だけじゃなくて、チュートリアルや子供向けワークショップとか。
子供向けワークショップは、形を変えてもよいので来年も続いて欲しい。
ロジ的に厳しいものもあるが、そのなかから良いものだけ取り入れて来年に繋がるといいなぁ。

販売チケット数を増やさなければいいんだけど、もっとたくさんの人と会えると楽しいと思うし、いい会場があるといいなぁ、と思う。

PyPy をコンパイルしてみる [Python]

OS を Yosemite にして Xcode の新しいのをインストールしたので、ふと思い立って pypy.org のソースをリポジトリから取得して、コンパイルしてみた

やり方は、これ↓
http://doc.pypy.org/en/latest/build.html
Linux ディストリビューションによって、違うけど、事前にいろいろライブラリーをインストールしとけと書いてある。

Mac OS X の場合
xcode-select --install
だけしとけばよさげ。

んでもって、以下の手順でソースを取ってきてコンパイル。
(pypy3 のリリースされたバージョンをコンパイルしてみる)

$ hg clone http://hg@bitbucket.org/pypy/pypy
cd pypy
hg up pypy3-release-2.4.0
python2.7 rpython/bin/rpython --opt=jit pypy/goal/targetpypystandalone.py

半日くらいかかってpypy-c っていうのができる。
パスが通っているところに pypy-c っていうやつへのシンボリックリンクを貼る

ln -s pypy-c $SOMEWHERE/pypy

$ pypy
Python 3.2.5 (b2091e973da6, Aug 24 2015, 14:34:46)
[PyPy 2.4.0 with GCC 4.2.1 Compatible Apple LLVM 6.1.0 (clang-602.0.53)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>>

となる。これでできたっぽい

ちなみに、この pypy でコンパイルしようとすると
pypy rpython/bin/rpython --opt=jit pypy/goal/targetpypystandalone.py
File "rpython/bin/rpython", line 17
print __doc__
^
SyntaxError: invalid syntax

となって、コンパイルに失敗する。
Python2 互換のバージョンの pypy じゃないとブートストラップ作れないようだ
じゃあ、default ブランチはどうなってんの?って思って

$ hg up default
$ python2.7 rpython/bin/rpython --opt=jit pypy/goal/targetpypystandalone.py

ってしてコンパイルしてできたバイナリを実行してみると

$ pypy
Python 2.7.10 (f5e65d929e0e, Aug 24 2015, 23:49:08)
[PyPy 2.7.0-alpha0 with GCC 4.2.1 Compatible Apple LLVM 6.1.0 (clang-602.0.53)] on darwin

と、いまのところ python2.7 互換バージョンが開発のメインになっているっぽい。
コンパイルのツールが 2.7ベースだと PyPy3 ベースに変更するの大変そうだな。
きっと、PyPy の開発の人たちには Python3 互換にすることにモチベーションあんまないんだろうなぁ

Python3 系互換の開発版の最新は py3k か py3.3 というブランチを update して使うのがよさげな感じ

Plone Symposium Tokyo 2015 [Python]

参加した。
http://plone.jp/plone-symposium-tokyo-2015
http://togetter.com/li/835036

参加者 60名程の規模のイベントだったので、せっかくの国際イベントなのに盛り上がるかどうかちょっと心配だったが、 人数が少ないぶん当事者意識の高い参加者でなかなか良かった。

普段の Plone シンポジウムは 150名ほど集まるそうだけれども、アジア極東の国で行われたイベントとしてはまずまずじゃなかろうか。
ボランタリーに集まった運営の人の妹さんが写真をとったり、別の運営の人の奥さんがクッキーを焼いたり、takanory さんや hirokiky がタリーズにコーヒーを買いに行ったりする手作り感あるイベントで、その点でも良かった。

基調講演は Plone5 の新機能の話。
今年の9月頃に出るっぽいが、もう随分前にリリース間近と聞いていたせいか、話としては、どっかで聞いてた気がする。(多分、寺田さん)

僕は Plone 使ってないし見かけることもあまりなくなったけど、コンテンツマネージメントシステムの機能とOSS のエコシステムによる利活用ができるという点で、安定した人気があるんだなぁと思った。
特に、大学の教育に Plone を使っている方々のパネルディスカッションを見て。

Plone の拡張性、カスタマイズ性というのは、引き続き比類ないもののようで、今足りないのは採用事例だけなのかな。

運営としては用意してなかったイベント後の飲み会は25名ほど集まって、なかなかの参加率だった。
(会場近くに急遽大人数で入れるはなの舞があってよかった)
「OSS のイベントに行くと、ロックスターが気軽に声かけてきてくれるんだよー」
みたいな話をアレキサンダーレイチェルさんがしてて、
(んー、でもあなたも僕からしたら OSS のロックスターでないの?)
と思ったりした。
そういえば Mr. Terada も Plone Foundation のメンバーなので OSS のロックスターだった。

はじめての GitHub を観察して [Python]

昨日の
第8回 Pythonもくもく会 @アライドアーキテクツ(恵比寿)
http://mokupy.connpass.com/event/14343/
で、nobolis さんが、はじめての Git で、はじめての Github で英語ドキュメントを和訳して Pull Request を投げようとしていた。

参考にしていた書籍は「GitHub 実践入門」
http://gihyo.jp/book/2014/978-4-7741-6366-6
この書籍の選択は良かったと思う。
(頭のいいひとは、参考書の選択を間違えないなぁ)

「きれいな Patch にしてから Pull Request を出すという流儀もありますが、それは大変なのでとりあえず今日は歴史を修正しないで Pull Request を出せばいいんじゃないですか」
という話をした。
最終的に、とりあえず一回ドキュメントの Pull Request を出していた。
途中で色々試行錯誤していたようだったので、そこまでたどり着いたのはすばらしい。

横で観察していて

- Upstream からの fork
- Fork した自分のリポジトリからの clone
- ローカルリポジトリでのブランチ作成、修正、add、 commit、 push
- 自分のリポジトリから Upstream への Pull Request
- その他、適宜 pull

と、ひとつひとつはコラボレーション(他人の足を踏まずに作業する)のためには意味があることなのだけれども、初めての人のは手順が多くて大変だなあ、ということを再認識した。
GitHub のfork が、Git 的には clone と同じというあたりがややこしい。

いままでは Subversion はおろか、RCS までさかのぼったどんな VCS も使ったことないところからだったから、さぞかし大変だったろう。
(・・・ひょっとして、過去の歴史を知らないほうがわかりやすいのかな?)

最初に EUC-JP で修正したテキストをコミット& push して文字化けしてた。
僕にとっては馴染みのある失敗なのだが、ああいうのを IT業界でないひとが、周囲にいる人に聞かずに一人で解決するのは大変だろうなぁ。

最近、仕事では GitHub にリポジトリがあるという話をよく聞く。
使い方を教えなくても、皆が知っているということはやりやすいことだろう。
気がつくと、GitHub は使えてあたりまえという時代になっていた。
OSS もGitHub にホスティングするものが特に最近急激に増えてきた。
オープンデータやオープンなドキュメントをGitHub に公開している
例もちらほらあって、もうソースコード開発のためだけのものじゃない。

最初に GitHub というサービスを知ったときには、OSS開発者の中の尖った人だけが使うものという印象だったが随分と広がりを持つようになって、僕は全く見る目がないということを思い知る今日この頃

PostgreSQL の driver minipg を -m オプション付きで実行できるようにする [Python]

python を起動するときのオプションに -m というのがあって、

$ python -m foo

とすると foo モジュールをスクリプトとして実行します。
・・・とのことですが、もうちょい正確にいうと、 foo がモジュールだったらfoo.py を実行、foo がパッケージだったら foo/__main__.py を実行ということのようです

このオプションを使うことは、僕自身はあまりなくて
python -m SimpleHTTPServer で、HTTP Server が立ち上がるというのと
python -m profile foo.py で foo.py を実行してプロファイル情報を表示する
というのを実行したことがある、程度でした。

・・・が、データーベースのドライバーで、データーベースにクエリを投げた結果が表示できるようになったら、ひょっとしたら便利かな、と思ってやってみました。
こいつ↓を pip install minipg でインストールして
https://pypi.python.org/pypi/minipg/0.5.1

$ echo 'select * from foo' | python -m minipg -U user -W password -D db_name

とすると、クエリーが実行されて結果が標準出力に出力されます

psql コマンドを使えば同じ(以上の)ことはできると思うので、この機能があってどれくらいうれしいかわからないけど、 argparse の使い方と -m オプションで実行される機能のサンプルとして機能を追加しておきます。

Plone の日本語 Splitter c2.splitter.janome の公開 [Python]

Plone の日本語 Splitter c2.splitter.janome を公開しました。
Plone へのインストールは、ここ↓を参照してください
https://github.com/nakagami/c2.splitter.janome
(・・・といっても eggs に1行追加して buildout の実行だけです)

インストール後の設定については↓ここを参照してください。
http://takanory.net/plone/basic/splitter/
(「日本語での検索設定」の ejSplitter を c2.splitter.janome に読み替えてください)

【Plone を知らない人向けの解説】
Plone は Zope という python 製 Web Application Framework 上に構築された Contents Management System です。
http://plone.jp/
https://plone.org/

来る 6/13, 6/14 に、 Plone Symposium Tokyo 2015 という Plone の国際イベントが日本で開催されます。
興味のある方は参加してみてはいかがでしょう。

【janome を知らない人向けの解説】
janome は、 pure python で書かれた形態素解析器です
http://mocobeta-backup.tumblr.com/post/115843098157/pure-python-janome
python から使う形態素解析器には MeCab を使ったパッケージ mecab-python があるのですが、インストールの難易度が高く障壁になっていました。 janome は

pip install janome

でインストールできます。

【謝辞】
bigram の Splitter である c2.splitter.twocharactersをパクリベースにしました
c2 の namespace のままパッケージを公開することに快諾いただいた CMSコミュニケーションズの寺田さんに感謝します。

janome のソースコードを読む(つづき) [Python]

これは「第7回 Pythonもくもく会 @アライドアーキテクツ(恵比寿)」
http://mokupy.connpass.com/event/13840/ の記録で、かつ http://nakagami.blog.so-net.ne.jp/2015-04-11 の続きです。

前回のこれ↑の直後に、python2.7 と python3.4 の両方で動くような修正の pull request を送ったのだが、今日、それが動いていないことを発見。超恥ずかしい。
言いわけをさせてもらうと python setup.py test でエラーメッセージが出ていなかったので大丈夫だと思っていた。

そのことは @moco_beta さんは(当然ながら)気づいていたようなので、お任せして、もっと真剣にソースコードを読むことにした。

前回のソースコードリーディングのあとで、 http://mocobeta.github.io/janome/ ここに紹介されている「自然言語処理の基礎」の第3章を読んだので、さっぱりわからないから、クラス名が何を意味してるか多少わかる状態からのソースコードリーディングとなった。

fst.py は、何をしているかわからないけど、まあそういうもんだから知らなくてもいいな、と理解した。そんなわけで、今日は一日かけて lattice.py と tokenizer.py の300行弱のコードを読んだ。
・・・が、ほぼ一日にらんでいたが完全に理解するまでには至らない。うーん、難しい。
結局のところ経路探索の問題で、Lattice.backward() で逆順にたどって最小コストのものだけを取得していることはわかった。
しかし、Lattice の、すべての経路をたどる方法がよくわからない。そんなことできないのかも知れないけど、できないのかどうかもよくわからない。
Lattice の内部に snodes と enodes の2つメンバーを持たなければいけない意味もわからない。
どっちかひとつにまとめることはできないんだろうか?

インデックスの始まりが 1〜になっている部分があったり、 Lattice.conn_costs のようにメンバーは宣言されているけど使ってない変数とかあって、参考にしたソースコードの影響とか、試行錯誤した名残があるのかな、と思った。

(2015-04-20追記)
snodes には node の先頭文字の位置が、 enodes には node の最後の文字が入る位置が記録してあって、どちらも必要なようだ。


janome のソースコードを読む(まだ途中) [Python]

これは「(第53回)Python mini Hack-a-thon」の記録です
http://pyhack.connpass.com/event/13504/

前回は mecab をインストールしてソースを読んでました。
http://nakagami.blog.so-net.ne.jp/2015-03-28
・・・が、まあ自然言語解析の素養がないのでさっぱりわかりません。

その後、たまたま Janome という Pure Python の形態素解析器がリリースされました
http://mocobeta.github.io/janome/
今日は、これをインストールしてソースを読みました(まだ途中)

何が書いてあるかさっぱりわからないことには変わりないですが、だいぶ読みやすく分量も少なく、
解析器全体で 1000行以内なので、
「ふーん、この程度でできるんだー」
という感じはしました。
(まだ、mecab のごく一部の機能しかないのですが)
せっかくなので、もうちょっと勉強したいと思います。

Python3.4 でしか動かなくて、これはこれで良いと思っているのですが、 Python2.7 でも動くようにしたらうれしいかな・・・

(追記)
これを書いた直後に python2.7 で動くバージョンのブランチが作成され、パッケージがリリースされてた