我正在编写代码,计算包含大约20000个文件的文档中出现单词的频率,我能够获得文档中单词的整体频率和 到目前为止我的代码是:
import os
import re
import sys
sys.stdout=open('f2.txt','w')
from collections import Counter
from glob import iglob
def removegarbage(text):
text=re.sub(r'\W+',' ',text)
text=text.lower()
return text
folderpath='d:/articles-words'
counter=Counter()
for filepath in iglob(os.path.join(folderpath,'*.txt')):
with open(filepath,'r') as filehandle:
counter.update(removegarbage(filehandle.read()).split())
for word,count in counter.most_common():
print('{} {}'.format(word,count))
但是,我想修改我的计数器,并且只为每个文件更新一次,即计数必须对应于0或1,因为它在文档中的文件中出现或不出现。 对于前: 单词“little”,在file1中出现3次,在file45中出现8次, 因此,计数值必须是2而不是11 但是我现在的代码显示了11。
答案 0 :(得分:3)
使用sets
:
for filepath in iglob(os.path.join(folderpath,'*.txt')):
with open(filepath,'r') as filehandle:
words = set(removegarbage(filehandle.read()).split())
counter.update(words)
set
仅包含唯一值:
>>> strs = "foo bat foo"
>>> set(strs.split())
set(['bat', 'foo'])
使用collections.Counter
的示例:
>>> c = Counter()
>>> strs = "foo bat foo"
>>> c.update(set(strs.split()))
>>> strs = "foo spam foo"
>>> c.update(set(strs.split()))
>>> c
Counter({'foo': 2, 'bat': 1, 'spam': 1})