Lista de diccionarios – seguimiento de la frecuencia de las palabras por archivo

He escrito algo de código para contar la frecuencia de palabras en varios archivos de texto y almacenarlos en un diccionario.

He estado tratando de encontrar un método para mantener un total acumulado por archivo de conteos para cada palabra en una forma como:

word1 [1] [20] [30] [22] word2 [5] [7] [0] [4]

He intentado usar contadores pero no he podido encontrar un método / estructura de datos apropiados para esto todavía.

 import string from collections import defaultdict from collections import Counter import glob import os # Words to remove noise_words_set = {'the','to','of','a','in','is',...etc...} # Find files path = r"C:\Users\Logs" os.chdir(path) print("Processing files...") for file in glob.glob("*.txt"): # Read file txt = open("{}\{}".format(path, file),'r', encoding="utf8").read() # Remove punctuation for punct in string.punctuation: txt = txt.replace(punct,"") # Split into words and make lower case words = [item.lower() for item in txt.split()] # Remove unintersting words words = [w for w in words if w not in noise_words_set] # Make a dictionary of words D = defaultdict(int) for word in words: D[word] += 1 # Add to some data structure (?) that keeps count per file #...word1 [1] [20] [30] [22] #...word2 [5] [7] [0] [4] 

Usando casi toda su estructura!

 from collections import Counter files = dict() # this may be better as a list, tbh table = str.maketrans('','',string.punctuation) for file in glob.glob("*.txt"): with open(file) as f: word_count = Counter() for line in f: word_count += Counter([word.lower() for word in line.translate(table) if word not in noise_words_set]) files[file] = word_count # if list: files.append(word_count) 

Si quieres traducirlos a algún diccionario, haz esto después.

 words_count = dict() for file in files: for word,value in file.items(): try: words_count[word].append(value) except KeyError: words_count[word] = [value] 

Definitivamente debes reconstruir esto en una clase. Eso le permitirá almacenar los elementos que desea como objetos globales (es decir, puede tener una función que se ejecuta en un solo archivo y la agrega).

Dicho esto, construiría un código predeterminado que contenga un dict.

defaultdict(dict)

Lo estructuraría con el siguiente protocolo (almacenando las cantidades de archivos individuales y totales en la misma estructura de datos):

{word1:{filename1:5, filename2:20, total:25}, word2:{filename1:10, filename2:13, total:23}, ...}

Para poder construir esto, necesitaría mover la llamada de defaultdict fuera del bucle for sobre archivos. Seguí adelante y reestructuré tu código para ti:

 import string from collections import defaultdict from collections import Counter import glob import os # Words to remove noise_words_set = {'the','to','of','a','in','is',...etc...} # Find files path = r"C:\Users\Logs" os.chdir(path) print("Processing files...") #global defaultdict D = defaultdict(lambda: defaultdict(int)) #global counter (for file #) counter = 1 for file in glob.glob("*.txt"): #create name for file number file_number = "file{number}".format(number=counter) # Read file txt = open("{}\{}".format(path, file),'r', encoding="utf8").read() # Remove punctuation for punct in string.punctuation: txt = txt.replace(punct,"") # Split into words and make lower case words = [item.lower() for item in txt.split()] # Remove unintersting words words = [w for w in words if w not in noise_words_set] # Make a dictionary of words for word in words: #add count to the file and the total D[word][file_number] += 1 D[word]["total"] += 1 counter += 1 

Espero que esto pueda ayudarte:

 wordRef = defaultdict(lambda : defaultdict(int)) ... some code ... for file in glob.glob("*.txt"): ... some code ... for word in words: wordRef[word][file] += 1 

D = defaultdict(lambda: defaultdict(int)) for file in glob.glob("*.txt"): ...your code... for word in words: D[word][file] +=1