我正在运行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,每个列表大约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})
答案 0 :(得分: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))
答案 1 :(得分:0)
如果您希望结果为Counter
,则必须覆盖__add__
Counter
方法以接受0
。例如..
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
答案 2 :(得分:0)
for word in sorted(words_fra + words_1):
print word, cnt[word]