0

各ファイル内の特定の単語の出現をカウントする 360 以上の txt ファイルをループ処理しています。コードは以下のとおりです。

>>> cnt=Counter()
>>> def process(filename):
words=re.findall('\w+',open(filename).read().lower())
for word in words:
    if word in words_fra:
        cnt[word]+=1
    if word in words_1:
        cnt[word]+=1
print cnt
    cnt.clear()

>>> for filename in os.listdir("C:\Users\Cameron\Desktop\Project"):
process(filename)

words_fra と words_1 の 2 つのリストがあり、それぞれに約 10 ~ 15 の単語が含まれています。これは一致する単語をカウントとともに出力しますが、カウントがゼロの単語は出力せず、頻度順に単語をリストします。

出力例:

Counter({'prices': 140, 'inflation': 107, 'labor': 46, 'price': 34, 'wage': 27,     'productivity': 26, 'capital': 21, 'workers': 20, 'wages': 19, 'employment': 18, 'investment': 14, 'unemployment': 13, 'construction': 13, 'production': 11, 'inflationary': 10, 'housing': 8, 'credit': 8, 'job': 7, 'industry': 7, 'jobs': 6, 'worker': 4, 'tax': 2, 'income': 2, 'aggregates': 1, 'payments': 1})
Counter({'inflation': 193, 'prices': 118, 'price': 97, 'labor': 58, 'unemployment': 42, 'wage': 32, 'productivity': 32, 'construction': 22, 'employment': 18, 'wages': 17, 'industry': 17, 'investment': 16, 'income': 16, 'housing': 15, 'production': 13, 'job': 13, 'inflationary': 12, 'workers': 9, 'aggregates': 9, 'capital': 5, 'jobs': 5, 'tax': 4, 'credit': 3, 'worker': 2})

たとえゼロであっても、すべての単語数を表示する必要があり、単語数が頻度ではなくアルファベット順に返される必要があることを除いて、書式設定は問題ありません。

それを達成するために、コードに何を追加できますか? また、単語を列ヘッダー、カウントを行値として、適切な csv 形式にすることもできます。

ありがとう!

編集: 上は、現在の出力がどのように見えるかです。一番下は、私が彼らに見せたいものです。

Wordlist="a b c d"
Counter({'c': 4, 'a': 3, 'b':1})
Counter({'a': 3, 'b': 1, 'c': 4, 'd': 0})
4

3 に答える 3

0

結果が必要な場合は、受け入れるメソッドCounterをオーバーライドする必要があります。例えば ​​..__add__Counter0

In [8]: from collections import  Counter

In [9]: Counter({'red': 4, 'blue': 2,'white':0})+Counter({'red': 4, 'blue': 2,'white':0})
Out[9]: Counter({'red': 8, 'blue': 4})

In [10]: 
    ...: class Counter(Counter):
    ...:     def __add__(self, other):
    ...:         if not isinstance(other, Counter):
    ...:             return NotImplemented
    ...:         result = Counter()
    ...:         for elem, count in self.items():
    ...:             newcount = count + other[elem]
    ...:             result[elem] = newcount
    ...:         for elem, count in other.items():
    ...:             if elem not in self:
    ...:                 result[elem] = count
    ...:         return result
    ...:     

In [11]: Counter({'red': 4, 'blue': 2,'white':0})+Counter({'red': 4, 'blue': 2,'white':0})
Out[11]: Counter({'red': 8, 'blue': 4, 'white': 0}) #<-- now you see that `0` has been added to the resultant Counter
于 2013-02-18T04:12:45.087 に答える
0

単語リスト内のすべての単語を出力するには、ファイル内の単語の検索を開始する前に単語リスト内の単語をループ処理し、結果の辞書にそれらの単語を 0 として追加します。

それらを正しい順序で印刷するには、組み込みのsorted()を使用します。

このようなもの:

import re

wordlist = words_fra + words_1
cnt = {}
for word in wordlist:
    cnt[word] = 0

words=re.findall('\w+',open('foo.html').read().lower())
for word in words:
    if word in wordlist:
        cnt[word]+=1

for result in sorted(cnt.items()):
    print("{0} appeared {1} times".format(*result))

最も一般的な単語が最初になるように並べ替える場合は、次のようにします。

for result in sorted(cnt.items(), key=lambda x:x[1]):
     print("{0} appeared {1} times".format(*result))
于 2013-02-18T04:00:17.800 に答える
0
for word in sorted(words_fra + words_1):
    print word, cnt[word]
于 2013-02-18T04:15:24.723 に答える