Python – Búsqueda de frecuencias de palabras de la lista de palabras en un archivo de texto

Estoy tratando de acelerar mi proyecto para contar las frecuencias de palabras. Tengo más de 360 ​​archivos de texto y necesito obtener el número total de palabras y el número de veces que aparece cada palabra de otra lista de palabras. Sé cómo hacer esto con un solo archivo de texto.

>>> import nltk >>> import os >>> os.chdir("C:\Users\Cameron\Desktop\PDF-to-txt") >>> filename="1976.03.txt" >>> textfile=open(filename,"r") >>> inputString=textfile.read() >>> word_list=re.split('\s+',file(filename).read().lower()) >>> print 'Words in text:', len(word_list) #spits out number of words in the textfile >>> word_list.count('inflation') #spits out number of times 'inflation' occurs in the textfile >>>word_list.count('jobs') >>>word_list.count('output') 

Es demasiado tedioso obtener las frecuencias de ‘inflación’, ’empleos’, ‘producción’ individual. ¿Puedo poner estas palabras en una lista y encontrar la frecuencia de todas las palabras en la lista al mismo tiempo? Básicamente esto con Python.

Ejemplo: En lugar de esto:

 >>> word_list.count('inflation') 3 >>> word_list.count('jobs') 5 >>> word_list.count('output') 1 

Quiero hacer esto (sé que esto no es un código real, esto es en lo que estoy pidiendo ayuda):

 >>> list1='inflation', 'jobs', 'output' >>>word_list.count(list1) 'inflation', 'jobs', 'output' 3, 5, 1 

Mi lista de palabras tendrá 10-20 términos, por lo que debo ser capaz de apuntar a Python hacia una lista de palabras para obtener los conteos de. También sería bueno si la salida se pudiera copiar y pegar en una hoja de cálculo de Excel con las palabras como columnas y las frecuencias como filas

Ejemplo:

 inflation, jobs, output 3, 5, 1 

Y finalmente, ¿alguien puede ayudar a automatizar esto para todos los archivos de texto? Me imagino que solo apunto Python hacia la carpeta y puede hacer el recuento de palabras de la nueva lista para cada uno de los más de 360 ​​archivos de texto. Parece bastante fácil, pero estoy un poco atascado. ¿Alguna ayuda?

Una salida como esta sería fantástica: inflación de Filename1, empleos, salida 3, 5, 1

 Filename2 inflation, jobs, output 7, 2, 4 Filename3 inflation, jobs, output 9, 3, 5 

¡Gracias!

Related of "Python – Búsqueda de frecuencias de palabras de la lista de palabras en un archivo de texto"

colecciones.Counter () tiene esto cubierto si entiendo su problema.

El ejemplo de los documentos parece coincidir con su problema.

 # Tally occurrences of words in a list cnt = Counter() for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']: cnt[word] += 1 print cnt # Find the ten most common words in Hamlet import re words = re.findall('\w+', open('hamlet.txt').read().lower()) Counter(words).most_common(10) 

A partir del ejemplo anterior, debería poder hacer:

 import re import collections words = re.findall('\w+', open('1976.03.txt').read().lower()) print collections.Counter(words) 

EDITAR enfoque ingenuo para mostrar de una manera.

 wanted = "fish chips steak" cnt = Counter() words = re.findall('\w+', open('1976.03.txt').read().lower()) for word in words: if word in wanted: cnt[word] += 1 print cnt 

Una posible implementación (usando Contador) …

En lugar de imprimir la salida, creo que sería más sencillo escribir en un archivo csv e importarlo a Excel. Consulte http://docs.python.org/2/library/csv.html y reemplace print_summary .

 import os from collections import Counter import glob def word_frequency(fileobj, words): """Build a Counter of specified words in fileobj""" # initialise the counter to 0 for each word ct = Counter(dict((w, 0) for w in words)) file_words = (word for line in fileobj for word in line.split()) filtered_words = (word for word in file_words if word in words) return Counter(filtered_words) def count_words_in_dir(dirpath, words, action=None): """For each .txt file in a dir, count the specified words""" for filepath in glob.iglob(os.path.join(dirpath, '*.txt')): with open(filepath) as f: ct = word_frequency(f, words) if action: action(filepath, ct) def print_summary(filepath, ct): words = sorted(ct.keys()) counts = [str(ct[k]) for k in words] print('{0}\n{1}\n{2}\n\n'.format( filepath, ', '.join(words), ', '.join(counts))) words = set(['inflation', 'jobs', 'output']) count_words_in_dir('./', words, action=print_summary) 

Un código funcional simple para contar las frecuencias de palabras en un archivo de texto:

 { import string def process_file(filename): hist = dict() f = open(filename,'rb') for line in f: process_line(line,hist) return hist def process_line(line,hist): line = line.replace('-','.') for word in line.split(): word = word.strip(string.punctuation + string.whitespace) word.lower() hist[word] = hist.get(word,0)+1 hist = process_file(filename) print hist }