Hatena::ブログ(Diary)

podhmoの日記

 | 

2010-11-13

pythonで単語の出現頻度で降順に表示(wordhist.py)

| 02:12

Pythonプログラミング25: 英単語の頻度順

をみてちょっとやってみようと思ったのだけれど、単語のファイルを探すのが面倒なのでplanet pythonの記事の出現頻度を集めることにした。

今回は少し大きくなりそうなので、色々細かくわけて考える。

振る舞いを分割すると以下の通り

  1. planet pythonからhtmlを撮ってくる
  2. htmlをparseして記事の部分だけをとってくる
  3. 単語を出現頻度順に並べる
  4. 表示する。

まだ、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は全部探す。
  • クラス定義の仕方
    • __init__はコンストラクタ。利用時はKlass()
  • generatorの使い方
    • yieldを利用すればよい。
  • 型の調べ型
    • isinstance(obj, class)
    • (関係ないけれどNoneかどうか調べるにはisを使えば良いらしい)
  • inはlispのmemqと考えると良さげ。
  • encodeを指定しているところでasciiをそのまま表示しようとするとエラーを吐くっぽい。
    • encode("utf-8")でエンコードしてあげる必要があったり。これ面倒だ。
  • from <module> import <class> ...という書き方
    • 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
  ...
これを書いて学んだこと
  • ファイルの存在確認
    • os.accessにos.F_OKなどを渡す。
  • 文字列操作
    • 文字列の分割:strにもsplitがあるけれど、re.split()を使う。
    • 文字列の置換:re.subを使う。引数の関係が他の言語と逆
  • 三項演算子の書き方
    • pythonは独特 <success> if <pred> else <fail> という感じ
  • 辞書を値にでソートした結果を取得。
    • sortedを使う。
    • reverse=Trueを渡すことで逆順にしてくれる。
    • keyに比較関数を渡せる。
code

本当はこれらをsphinxを使ってまとめたい。

日記はupdateできないし。

トラックバック - http://d.hatena.ne.jp/podhmo/20101113/1289668325
リンク元
 |