0

クラス割り当て用に作成しているPythonスクリプトがあります。このスクリプトは、テキストドキュメントで最も頻繁に使用される上位10の単語を計算し、単語とその頻度を表示します。スクリプトのこの部分は問題なく機能するようにできましたが、割り当てでは、単語は2文字以上として定義されていると書かれています。なんらかの理由で単語を2文字以上と定義できないようですが、スクリプトを実行しても何も起こりません。

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

def sort_words(x, y):
    return cmp(x[1], y[1]) or cmp(y[0], x[0])

number = 10
words = {}

words_gen = (word.strip(punctuation).lower() for line in open("charactermask.txt")
                                             for word in line.split())
words = defaultdict(int)
for word in words_gen:
    words[word] +=1

letters = len(word)

while letters >= 2:
    top_words = sorted(words.iteritems(),
                        key=lambda(word, count): (-count, word))[:number] 

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

2 に答える 2

2

スクリプトの問題の 1 つはループです

while letters >= 2:
    top_words = sorted(words.iteritems(),
                        key=lambda(word, count): (-count, word))[:number] 

ここで単語をループしているわけではありません。このループは永久にループします。スクリプトのこの部分が実際にすべての単語を反復するように、スクリプトを変更する必要があります。(また、そのコードは単語ごとに 1 回だけ実行する必要があるため、おそらく に変更whileしたいと思うでしょう。)if

于 2012-09-17T00:14:29.650 に答える
1

私はあなたのコードをリファクタリングし、オブジェクトを使用しcollections.Counterます:

import collections
import string

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

counter = collections.defaultdict(int):
for word in words:
  if len(word) >= 2:
    counter[word] += 1
于 2012-09-17T00:26:42.187 に答える