2013-06-16 2 views
1

Я пишу код, чтобы подсчитать частоту появления слов в документе, содержащем около 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 для его наступления или не вхождения в файл в документе. напр: слово «мало», происходит 3 раза в file1 и 8 раз в file45, таким образом, значение счетчика должно быть 2 не 11 , но мой нынешний код показывает 11.

ответ

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})