So-net無料ブログ作成
検索選択

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コミュニケーションズの寺田さんに感謝します。

コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

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 の最後の文字が入る位置が記録してあって、どちらも必要なようだ。


コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

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 で動くバージョンのブランチが作成され、パッケージがリリースされてた

コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

Python を使う人が増えて [Python]

この前、
「古くから Python をやってる人にとって、最近 Python を使い始めた人のことはどう思ってるんですか?」
という質問を受けた。要するに、古参が「この新参者め!」と思ってないかってことかと。
他の人は知らないが、僕にとっては新しい人が増えて Python が普通のものになるのはとても嬉しい。
昔は、
「nakagami さんに Python とかいうマイナーが言語でスクリプト書かれたけど他の人には保守できない。Perl のがいいのに」
みたいなことを言われたりしたが、今なら Python で書くことに文句を言われないだろう。

数値解析・統計をやっているような自分とは違う分野の人と知り合いになるのも楽しい。
書籍も、良い内容のものが増えてくる。
「PyConJP のチケットさばけるだろうか?いつまで続けられるんだろうか?(参加するだけだけど)」
と心配していたが、今の状況だとチケットはすぐさばけそうだし、セッションのクオリティも維持できる気がしている。

国内のことだけじゃなくて、パッケージングが整理され便利なパッケージが PyPI に登録されたり、PyPy が CPython より速くなったり Cython(旧 Pyrex)が進化したり。
人が増えるということは、単純に色々な取り組みが増えて、新しい発見もあるし便利にもなる。
何か困ったことがありましょうか。

ただ心配なこともある。例えば

- メシを食うためにだけ Python を使っている人が増える
- COBOL 世界の業務のやり方が無理矢理導入される

みたいなことだ。

上は、ループをかけない Java プログラマーや Ruby を知らない Rails プログラマーみたいな人が増えるってこと
下は、「アルファベット2ケタと数値○ケタで機能を表す。番号を採番する担当者がいる」みたいな世界

実際、僕は見てないが
「あー、頑張って Django で書いちゃったのねー」
みたいなのもあるらしいので、その時は近い・・・かも。

コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

Jython の開発版をビルドして実行する [Python]

これは、「第5回 Pythonもくもく会 @アライドアーキテクツ」の記録です
http://mokupy.connpass.com/event/11807/

Jython 2.7 Beta4 が最近出ました
http://fwierzbicki.blogspot.fi/2015/02/jython-27-beta4-released.html

次は RC だそうですが、Beta3 が出たのが去年の8月なので、今年中に final がリリースできるかどうか予断を許しません。(Jython の開発は非常にゆっくり進んでいる)
ただ、そろそろプロダクションに使ってもいいレベルだと思っています。コミッターの皆さんは開発版を使っているに違いありません・・・と思うくらいに。

リリース時には、2.5.3 と同じようなインストーラーが用意されるようです。
また、最近のbeta も含むリリースでは Maven Central にも jar ファイルが上がっているので、そこからインストールしても良いと思います(←よくわかってない)

私は開発リポジトリの最新をビルドしています。以下、ビルド手順

【用意するもの】
- mercurial(ソースを取得するため)
- JDK1.7 以降(私は Ubuntu 上の Oracle JDK1.8 を使ってます)
- Apatche Ant

【手順】
$ cd $SOMEWHERE
$ hg clone http://hg.python.org/jython
$ cd jython
$ ant
(これで $SOMEWHERE/jython/dist/jython-dev.jar ができる)
$ export PATH=$PATH:$SOMEWHERE/jython/dist/bin


【実行例】
jython とだけ打つと、インタラクティブシェルが立ち上がります。
java のクラスが import できる以外は、使い方はほぼ CPython 2.7 と同じ。
$ jython
Jython 2.7b3+ (default:301e2a08b0c9, Feb 25 2015, 03:48:16)
[Java HotSpot(TM) 64-Bit Server VM (Oracle Corporation)] on java1.8.0_31
Type "help", "copyright", "credits" or "license" for more information.
>>>


【pip install】(追記)
今日知ったが
$ jython -m ensurepip
を実行すると
$SOMEWHERE/jython/bin/pip ができて pure python 2.7 のパッケージなら
$ $SOMEWHERE/jython/dist/bin/pip hogehoge

もしくは
$ jython -m pip install hogehoge
で package hogehoge が jython の環境にインストールできる

$SOMEWHERE/jython/dist/Lib/site-packages にインストールされている

ひえー、すごい
コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

PostgreSQL のSQL:2006 統計関数((第51回)Python mini Hack-a-thon の記録) [Python]

SQL:2006 で、分散、標準偏差などの記述統計とか相関関数が定義されて Oracle, DB2, SQLServer では使えるっぽい。

個人で気軽に使える環境だと、最近の PostgreSQL は使えるらしい。
https://www.postgresql.jp/document/9.3/html/functions-aggregate.html#FUNCTIONS-AGGREGATE-STATISTICS-TABLE

ということで実行して結果を確認するテストコード書いた
https://gist.github.com/nakagami/755bc066c5e9ee8354dd

仕様を見ると計算方法はわかりそうなんだけど、意味が分からない。
高校の数学や学部の2年までに少しは勉強したはずだが忘れた。

次は、基礎的な統計の勉強をしなくてはいけない。
コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

Firebird3 の ネットワークプロトコルと pyfirebirdsql 0.9.6 リリース [Python]

このエントリーは
(第49回)Python mini Hack-a-thon の活動の記録
http://pyhack.connpass.com/event/10256/

Firebird Advent Calendar 2014 の20日目の記事です
http://qiita.com/advent-calendar/2014/firebird

ここでも少し触れましたが、
http://nakagami.blog.so-net.ne.jp/2014-02-15-2

Firebird のネットワークプロトコルの機能については、以下のような変遷があります
(今回 Firebird のソースを調べ直しました)

PROTOCOL_VERSION10:
- Interbase6.0 と同じ。Firebird1.0 から Firebird2.0 まで

PROTOCOL_VERSION11:
- Firebird2.1。
- ptype_lazy_send という、リクエストに対するレスポンスを後でまとめて返すことによって性能向上をはかる
- WIN_SSPI という Windows の認証対応

PROTOCOL_VERSION12:
isc_dpb_utf8_filename という utf8 でファイル名を渡すパラメータの追加
op_cancel オペレーションの追加
(プロトコル上の変更はほとんどなし)

PROTOCOL_VERSION13:
- SRP プロトコルによる認証、鍵交換 (FB3 Alpha1)
- 通信データのの RC4 暗号化 (FB3 Alpha1)
- NULL のとき余分なデータを転送しない (FB3 Beta1)
- 通信データの圧縮 (FB3 Beta2)

pyfirebirdsql 0.9.5 では、PROTOCOL_VERSION13 の FB3 Alpha1 までの
機能を実装していました
https://pypi.python.org/pypi/firebirdsql/0.9.5

しかし、その後 NULL データを転送しない修正により Beta1 で動かなくなっていました
http://tracker.firebirdsql.org/browse/CORE-2897
https://github.com/asfernandes/firebird/commit/c41493c756cdd6c7118e396aeec814f1b14bed3a
がーん。
C++ のソースを見ただけではどこでどうしていいかわからなかったので、やり取りされるデータを観察しながら修正しました。
・・・というわけで、 0.9.6 をリリースしました
https://pypi.python.org/pypi/firebirdsql/0.9.6

Beta2 でリリースされるという通信データの圧縮はオプションなようなので、
今後プロトコル仕様に変更がなければFirebird3.0 のリリース版でも使えると思います

コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

Python の Database driver の非同期 I/O サポートって何やればいいの? [Python]

https://github.com/nakagami/minipg/issues/1 の issue で
「gevent コンパチブルなの?」
と聞かれた。
非同期 I/O の機能のことを聞かれているのはわかったが、どういうAPI を実装すればよいのかわからない。

調べてみて、ひとつわかったことは、
「defacto なインターフェースはないからドライバー毎に好きにすればいい」
らしいこと。
pure python で書いた Database driver だったら、何らかの非同期 I/O のサポートを入れることはできそうなんだけど。
Python3.4 に asyncio モジュールが入ったことだし、どうせなら、そこらへんも加味した長いこと使われる形にしておきたい気がするのだが・・・

というあたりで止まってしまった

以下調べてヒットしたことをメモって後で読み直す(かも)

greenletを使う場合にはPostgreSQLを使う方がいいという話
http://d.hatena.ne.jp/mopemope/20100909/p1

[翻訳] geventのeventletとの比較
http://blog.liris.org/2010/04/geventeventlet.html

Python プログラマーのための gevent チュートリアル
http://methane.github.io/gevent-tutorial-ja/

Psycopg2 のドキュメント
http://initd.org/psycopg/docs/advanced.html#support-for-coroutine-libraries

Pinterest: geventでコードベースをマルチスレッドに
http://wazanova.jp/post/66168819162/pinterest-gevent


python3.4 の asyncio
https://docs.python.org/3/library/asyncio.html

コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

PyConJP 2014 で会った人たち [Python]

ほとんど1年に1度しか会わないような Python コミュニティの人と
「最近どうですか?」
と世間話をするのも楽しいものだけれども、 PyConJP くらいの大きなイベントになると、普段会わないような人が来てたりするのがよい。

今回、2人の人と印象的な話をすることができた。

ひとりは、京都で理学系の研究をしているマスター2年の学生。
ドクターに進もうと思っていたけど、まあいろいろ思うところあって
進学はやめてPython で 仕事がしたい、とのこと
PyConJP のジョブフェアの登壇者に相談していた。
みんな、フリースペースで、あーだこーだ言っていたがまとめると
- Web業界は拒まないけど誰でも安泰ってわけではないので手放しで勧めるものではない
- 工学系の方向に「ぐーーと舵をきるっていうのも方法じゃないかな。あいつは2流になったとか言われるけど、気にすることはない」
- 今、進路を変えると元の専門には戻れない
というあたり。
本人が納得して後悔しない進路を進めたらいいなあ。

もうひとりは、長いこと Tomcat+Seaser2 で開発していて、
それだと先に限界が見えてきているので Python での開発を始めました、と言う人。
受託とか派遣じゃなくて、自社(?)製品を長いこと開発しているんだけど、
そもそも Springs じゃなくて Seaser2 かっていうと
「日本語が通じる」
ただ、それだけだったんですよねー、とのこと。
(他にも書くこといっぱいあるのだがきりがないので)
Java8 では Seaser2 の DI が動かない(JVMが変わったので)とのことで、
まだ、当面 Java7 の VM を動かすオプションで動くそうなんだけれども
まったく先は見えてない、とのこと。
そこから、社内でのキャリアパスとか仕事の楽しみとか・・・

普段会わないような違う世界の人と話ができるので、都合が合えば来年も参加したい。
コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

PyConJP 2014 に参加した [Python]

もう一週間ほど経ってしまったが 9/13,14 のカンファレンスと 9/15 のスプリントに参加してきた。
昨年は Asia Pacific のイベントだったが、今年は Japan のイベントなので、参加人数も減ったりするかな、と思ったが、昨年と同規模で開催された。僕なんかは惰性で参加しているが、昨年やおととしに見かけた方で今回参加されてない方がいる一方で(人数は減ってないのだから)新しい方がたくさん参加されているようだった。
今回来られない人も、次回以降にまた参加してくれるといいなぁ、と思う一方で、新しい参加者の人が満足して来年も来ようと思ってくれるといいなぁ、と思う。

いろいろな考え方があるが、僕は、一年に一度のイベントなので、できるだけ大人数が参加できるイベントになるといいなぁ、と思っている。
お弁当やおやつはおいしかったが、人数が増えるためにはグレードが下がっても仕方ない。

今年は、駅からの道案内も、ボランティアスタッフの映像配信もなくて、ノベルティの袋詰めも業者に依頼できるようなので、ボランティアスタッフの方々の負荷が減ったのは、長く続けるためには良かったと思う。
去年は、ボランティアなのに凄く大変そうで、これを続けるのは大変だと思ったので。

あとは、お弁当とおやつの配給を、施設のビュッフェでできれば大分ボランティアの方々の負荷が減るのでは。

あと、スポンサーの人にメリットあったかな?というのは気になるところ。
スポンサーも社内で効果について説明しないといけないわけだし、
「メリットあり、来年もぜひスポンサーになりたい。(できれば、もうひとつ上のグレードを)」
と思ってもらえると、イベントも長続きするだろうし。

今年は一昨年以来の LT をした。
トークセッションについては、なんかもっと難しい、深い話をしないといけないと思ってたが、LT の反響をみたりして、僕にもできる入門的な話題も、参加者には必要とされているのかな、と思った。
来年はトークセッションにプロポーザルを出してみようかと思う。
コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感