単語数カウント

まじめにやろうとすると、sentence split して tokenize しないといけないんだけど、まぁ、さすがにその辺は手抜き。なので、U.S.A. だとか Mr. だとかはうまく処理できない。
しかし、fileinput を使っている人が案外少ない。

import sys, re, fileinput
import itertools

WORD_PATTERN = re.compile(r'[\w][\w\']*')
def words(s):
    return WORD_PATTERN.findall(s)

def normalized_words(s):
    return (word.lower() for word in words(s))

def main(args):
    fp = fileinput.input(args)
    counts = dict()
    for word in itertools.chain(*(normalized_words(line) for line in fp)):
        counts[word] = counts.get(word, 0) + 1
    items = counts.items()
    items.sort(lambda x, y: cmp(y[1], x[1]))
    for word, count in items:
        print '%-5d %s' % (count, word)

if __name__ == '__main__':
    main(sys.argv[1:])