Make組ブログ

Python、Webアプリや製品・サービス開発についてhirokikyが書きます。

Python3 でドキュメントフィルタリング - Python Advent Calendar 2011

これは 2011 Pythonアドベントカレンダー(Python3) - connpass の記事です。
@ryoaita さんの指名を受けました、22日目の @hirokiky です。
このアドベントカレンダーはPython3に関することをみんなで書きましょうというものです。そこでこの記事では Python3 を触ったことすら無かった私が、とあるプログラムを Python3 で動かしてみるor動くようにするまでを書きたいと思います。

『とあるプログラム』について

こいつの動作は「気に入った文章を覚えさせると、次に与えた文章が気に入られるものかどうかを推定できる」というもの、つまりはドキュメントフィルタです。応用例としてはメーラのスパムフィルタなどがあります(かなり限定的な例を出してます)。
このプログラムは『集合知プログラミング』という本の6章に載っていて、オライリーのサイトからもダウンロードできます。
Index of /9780596529321

さてさてこいつをPython3で動くようにしていきます。Python3の導入からいきましょう。

Python3 導入

Ubuntuを使ってるので導入は apt-get におまかせです。

% sudo apt-get update
% sudo apt-get install python3.2 python3.2-dev python3-setuptools

apt-get yeah!これでPython3.2、2to3、easy_install3 なんかが導入できました。

参考:2011-12-17 - Hack like a rolling stone

2to3で楽する

実際にコードをPython3に対応させましょう。
でも手で書くのはめんどくさいので2to3で楽をします。Python2 のコードを3系で動くように自動で変換してくるそうです。

% 2to3 -w py2code.py

これで書き換えれます。注意点としては-w オプションを付けないと差分が表示されるだけでファイルに変更は加えられないことです。

で、あとは必要なパッケージを easy_install3 でインストールしていきます。もちろんPython3に対応しているものを入れる必要があるので、Browse : Python Package Indexを見ながら入れていくだけです。

BeautifulSoupがない?!

pysqlite2 と BeautifulSoup のPython3版がPyPIにありません。pysqlite2 は sqlite3 を使うのでいいのですが、 BeautifulSoup がないのは困った。オチを先に言うとBeutifulSoup本家のサイトにいけばあるのですが、そんなことを知らない私は lxml で書き換えました。

% sudo apt-get install python3-lxml

で導入して

>>> query = 'http://...'
>>> #before
>>> from BeautifulSoup import BeautifulSoup
>>> soup = BeautifulSoup(urlopen(query))
>>> return [l.surface.string for l in soup.ma_result.word_list]
>>> #after
>>> from lxml import entree
>>> return [element.text for event, element in etree.iterparse(urlopen(query)) if element.tag == '{urn:yahoo:jp:jlp}surface' and element.text]

これでタグ {urn:yahoo:jp:jlp}surface のテキストを取得してます。

参考:Pythonでスクレイピングに最適なライブラリはlxmlな気がした。時間的な意味で - When it’s ready.

うまく動作したし良かった良かった。Python3 倒した気になった

Python3でBeautifulSoupあるよ!

ということなので。
Beautiful Soup: We called him Tortoise because he taught us.からダウンロードしてインストール。

>>> from bs4 import BeautifulSoup

という名前になったらしい。コードは以前のままで実行できました。

2to3動かすだけで良かったのか…いや、楽なのは素晴らしいことです(:D)rz
いちおうbitbucket においてます。
https://bitbucket.org/hirokiky/pci_chap6/overview

おわりに

もっとガリガリコード書かなきゃだめかと思いましたがアッサリいきました。
ちょっと物足りないかんじなので、この感情は別のコードにぶつけてやろうと思います。

私のPython3デビュー物語は以上です。次は @hinaclegear さんにお願いします