pythonで単語の出現頻度で降順に表示(wordhist.py)
Pythonプログラミング25: 英単語の頻度順
をみてちょっとやってみようと思ったのだけれど、単語のファイルを探すのが面倒なのでplanet pythonの記事の出現頻度を集めることにした。
今回は少し大きくなりそうなので、色々細かくわけて考える。
振る舞いを分割すると以下の通り
- planet pythonからhtmlを撮ってくる
- htmlをparseして記事の部分だけをとってくる
- 単語を出現頻度順に並べる
- 表示する。
まだ、pythonでwebからhtmlをとってくる方法も分かっていないのでそれを調べる。
webページからとってくる。
どうやら、urllibとurllib2があるらしい。python3のことを考えるとurllib2を使った方が良いと書いてあったのでurllib2を使ってみる。
ここで学んだこと
- url -> Request -> responceという流れでhtmlを取得する(urllib2)
- urllibだともっと楽っぽかった。
- urllib.retrieve(url,path)でDLできるみたい。
- printの改行を除去するには文末に","を付ける
code
htmlをparseする
HTML parser in Python - Stack OverflowでBeautifulSoupが薦められていた。これを使う。ドキュメントがしっかりしているらしい(http://www.crummy.com/software/BeautifulSoup/documentation.html)
ついでにタグの除去についても調べる。http://python.g.hatena.ne.jp/y_yanbe/20081025/1224910392を参考にした。
これを書いて学んだこと
- BeautifulSoupの使い方
- soup.find(tag, {attribute, value})という感じで探索する
- findはひとつだけ、findAllは全部探す。
- soup.find(tag, {attribute, value})という感じで探索する
- クラス定義の仕方
- __init__はコンストラクタ。利用時はKlass()
- generatorの使い方
- yieldを利用すればよい。
- 型の調べ型
- isinstance(obj, class)
- (関係ないけれどNoneかどうか調べるにはisを使えば良いらしい)
- inはlispのmemqと考えると良さげ。
- encodeを指定しているところでasciiをそのまま表示しようとするとエラーを吐くっぽい。
- from
import ...という書き方 - namespaceを前置しなくてよくなる。
code
改めて単語の出現頻度
前置詞とかが多くなるのは当然か。htmlを毎回とりにいくと遅延がうざったいので一度取ってきたらキャッシュすることにした。
% python wordhist.py 424: the 319: to 248: a 220: gt 218: and 181: of 136: in 129: that 127: is ... 32: use 32: python 32: have 32: like 31: end 31: true 31: november ...
これを書いて学んだこと
code
本当はこれらをsphinxを使ってまとめたい。
日記はupdateできないし。