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))