Pythonでn-gramの頻度計算

1年以上前のエントリにTrackback打つのもアレだけどまあいいや。最近 Python にはまっているので練習がてら。
とりあえず意味もなく徹底的に generator 式を多用してみた。おかげでほとんどループがない。あと、コメントアウトを解除すると文字bigramから単語bigramに変わる。単語の分割が超適当だけど。

import locale
import fileinput
import itertools
import sys
import re

def iterngrams(s, n=2):
    return (s[i:i+n] for i in xrange(len(s) - n + 1))

def counts(seq):
    res = {}
    for s in seq:
	res[s] = res.get(s, 0) + 1
    return res

sep = re.compile(ur'\s+')
enc = locale.getpreferredencoding()
inputs = (line.rstrip().decode(enc) for line in fileinput.input())
#inputs = (tuple(sep.split(line)) for line in inputs)
ngrams = itertools.chain(*(iterngrams(line, 2) for line in inputs))
items = counts(ngrams).items()
items.sort(lambda x, y: cmp((y[1], x[0]), (x[1], y[0])))
for key, val in items:
    sys.stdout.write(("%s\t%s\n" % (key, val)).encode(enc))