Contents
スポンサードリンク
自然言語処理100本ノックがだんだんと難しくなり、やる気が失せてきたので復習がてらグラムニュービッグさんのチュートリアルに手を出してみることにしました。
全部で14問あるみたいで、今日はその第一問目です。
「ファイルの中身の文章中に現れる単語の出現頻度をカウントせよ」
ファイル形式(text.txt)は
1 2 |
this is a pen this pen is my pen |
です。
解法
- ファイルを一行ずつ読み込み、split()で単語にわける
- Counter()関数でカウント
- counter.most_common()で辞書型にプリント
って感じでしょうか。
とりあえず作ってみた(間違っている)
1 2 3 4 5 6 7 8 9 |
#!/usr/bin/env python # -*- coding: utf-8 -*- from collections import Counter fp = open("text.txt") for line in fp: sentence = line.split(" ") counter = Counter(sentence) for word, cnt in counter.most_common(): print(word,cnt) |
実行すると
1 2 3 4 5 6 7 8 9 10 11 |
this 1 is 1 a 1 pen 1 pen 2 this 1 is 1 my 1 1 |
なぜかthisが別々にカウントされている。他にも色々おかしい。
1 2 3 4 5 |
a1 is 2 my 1 pen 3 this 2 |
本当は上のようになるはず。
スポンサードリンク
原因
これだと、同じ単語が来てもそれを同じと判断することができずに別々にカウントしてしまう。
同じ行内ならば同じ単語は追加のものとして加算してくれるみたいだが、行が違うと同じ単語でもダメみたいです。
だから、2行目に読み込んだpenは2回にカウントされている。
正解
1 2 3 4 5 6 7 8 9 10 11 |
#!/usr/bin/env python # -*- coding: utf-8 -*- from collections import Counter data = [] fp = open("text.txt") for line in fp: sentence = line.rstrip().split(" ") data.extend(sentence) counter = Counter(data) for word, cnt in counter.most_common(): print(word,cnt) |
実行結果
1 2 3 4 5 |
pen 3 this 2 is 2 a 1 my 1 |
counter.most_common()はご丁寧に回数の多い順に出力してくれるみたいです。
やはりCounter()関数はかなり使いどころが多いのと、extendの使い方についても知ることができました。appendにして何回も詰まりました笑。
そんなに難しくない問題なのにこの程度で詰まるなんて、まだまだですね。精進します。
以上Graham Neubigさんのチュートリアル第一回目を終わりにします。
スポンサードリンク