Hatena::Grouppython

Pythonで遊ぶよ

 | 

2010-11-17

collections.Counter

10:05

SQLite で300万行ぐらいのテキストの転置インデックスを作っているのだが、そもそも大量に出てくるトークンを保存してもあまり意味が無いので、それらは省きたい。

そこで、

{
  "this": 100,
  "is": 200,
  "a": 500,
  "pen": 10
}

のように各トークンを数えて、一番カウントが多かったものから順に取り出したい。

まさにそういう目的のために用意されてるのが collections.Counter 。

collections は大量のデータを扱うための dict のようなものらしい。Counter は Python 3.1以上と 2.7 にある。(3.0 にはない)

SQLite ファイルを開いて、転置インデックスのテーブルを全部見ていき、トークンを Counter に格納する。最後は most_common で取り出す。

#!/usr/bin/python
import sqlite3
import collections

path = "C:\\Users\\atsushi\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\databases\\chrome-extension_igchbgllbcppipoalfnjoepildadhkll_0\\4"

conn = sqlite3.connect(path)
tokens = collections.Counter()

c = conn.cursor()
c.execute('SELECT token FROM invindex ;')
for row in c:
  token = row[0]
  tokens[token] += 1

f = open('output.txt', 'w', encoding='utf-8')
for token, times in tokens.most_common(10000):
  f.write(token + '\t' + str(times) + '\n')

f.close()

簡単ですな。

トラックバック - http://python.g.hatena.ne.jp/edvakf/20101117
 |