0

テキストドキュメントの最も頻度の高い10個の単語(各単語は2文字以上)を印刷する小さなPythonスクリプトがあり、ドキュメント内の最も頻度の低い10個の単語も印刷するようにスクリプトを続行する必要があります。私は比較的機能しているスクリプトを持っていますが、それが出力する最もまれな10の単語は、単語であるはずの数字(整数とフローター)です。単語のみを繰り返し、数字を除外するにはどうすればよいですか?これが私の完全なスクリプトです:

# Most Frequent Words:
from string import punctuation
from collections import defaultdict

number = 10
words = {}

with open("charactermask.txt") as txt_file:
    words = [x.strip(punctuation).lower() for x in txt_file.read().split()]

counter = defaultdict(int)

for word in words:
  if len(word) >= 2:
    counter[word] += 1

top_words = sorted(counter.iteritems(),
                    key=lambda(word, count): (-count, word))[:number] 

for word, frequency in top_words:
    print "%s: %d" % (word, frequency)


# Least Frequent Words:
least_words = sorted(counter.iteritems(),
                    key=lambda (word, count): (count, word))[:number]

for word, frequency in least_words:
    print "%s: %d" % (word, frequency)

編集:ドキュメントの終わり(# Least Frequent Wordsコメントの下の部分)は、修正が必要な部分です。

4

2 に答える 2

1

letters_only()正規表現の一致を実行し、[0-9]一致するものが見つかった場合はFalseを返す関数、が必要です。このようなもの::

def letters_only(word):
    return re.search(r'[0-9]', word) is None

次に、あなたが言うところfor word in words、代わりにfor word in filter(letters_only, words)

于 2012-09-17T02:01:55.300 に答える
1

フィルタが必要になります-「単語」を定義したい場合は、一致するように正規表現を変更します。

import re
alphaonly = re.compile(r"^[a-z]{2,}$")

さて、そもそも単語頻度表に数字を含めないようにしますか?

counter = defaultdict(int)

with open("charactermask.txt") as txt_file:
    for line in txt_file:
        for word in line.strip().split():
          word = word.strip(punctuation).lower()
          if alphaonly.match(word):
              counter[word] += 1

または、テーブルから最も頻度の低い単語を抽出するときに、数字をスキップしたいだけですか?

words_by_freq = sorted(counter.iteritems(),
                       key=lambda(word, count): (count, word))

i = 0
for word, frequency in words_by_freq:
    if alphaonly.match(word):
        i += 1
        sys.stdout.write("{}: {}\n".format(word, frequency))
    if i == number: break
于 2012-09-17T02:08:32.397 に答える