2013-02-17 51 views
11

Sto provando ad accelerare il mio progetto per contare le frequenze delle parole. Ho più di 360 file di testo e ho bisogno di ottenere il numero totale di parole e il numero di volte in cui ogni parola da un altro elenco di parole appare. So come farlo con un singolo file di testo.Python - Trovare le frequenze delle parole dell'elenco di parole nel file di testo

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

La sua troppo noioso per ottenere le frequenze di 'inflazione', 'lavoro', 'uscita' individuale. Posso mettere queste parole in una lista e trovare la frequenza di tutte le parole nella lista allo stesso tempo? Fondamentalmente this con Python.

Esempio: Invece di questo:

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

io voglio fare questo (so che questo non è il codice vero e proprio, questo è quello che sto chiedendo aiuto su):

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

Il mio elenco di parole avrà 10-20 termini, quindi devo essere in grado di puntare semplicemente Python verso un elenco di parole per ottenere il conteggio di. Sarebbe anche bello se l'uscita è stata in grado di essere la copia + incolla in un foglio Excel con le parole come colonne e le frequenze come righe

Esempio:

inflation, jobs, output 
3, 5, 1 

E, infine, qualcuno può aiutare ad automatizzare questo per tutti i file di testo? Immagino che indichi Python solo verso la cartella e che possa eseguire il conteggio delle parole sopra dal nuovo elenco per ciascuno dei file di testo 360+. Sembra abbastanza facile, ma sono un po 'bloccato. Qualsiasi aiuto?

un output come questo sarebbe fantastico: Nomefile1 inflazione, posti di lavoro, in uscita 3, 5, 1

Filename2 
inflation, jobs, output 
7, 2, 4 

Filename3 
inflation, jobs, output 
9, 3, 5 

Grazie!

risposta

14

collections.Counter() ha questo coperto se ho capito il tuo problema.

L'esempio dei documenti sembra corrispondere al 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) 

Dal esempio di cui sopra si dovrebbe essere in grado di fare:

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

EDIT approccio ingenuo per mostrare un modo.

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 
+0

sto prendendo in giro con contatore per diverse ore ormai, e ancora non è possibile farlo. – CoS

+0

L'esempio sopra riportato mi darà il conto di tutte le parole uniche nel mio file di testo (oltre 3000 parole uniche nel mio caso). Ho solo bisogno del conteggio per 10-20 parole specifiche nel file di testo. – CoS

+0

Penso che funzionerà per la lista, grazie mille! Ho guardato quella pagina Counter per ore haha ​​ – CoS

4

Una possibile implementazione (utilizzando Counter) ...

Invece di stampare l'output, penso che sarebbe più semplice per scrivere in un file CSV e importare che in Excel. Guardare http://docs.python.org/2/library/csv.html e sostituire 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) 
+0

Quali variabili sopra devo sostituire? Dove devo inserire la mia directory specifica? – CoS

+0

Rob, per favore, dimmi dove nel codice di cui sopra dovrei mettere la cartella di directory in cui sto lavorando e l'elenco di parole che mi interessa? Non sono sicuro di cosa devo inserire nelle 3 funzioni che hai definito. – CoS

+1

Il percorso della directory che si desidera elaborare è il primo argomento della funzione 'count_words_in_dir()'. Guarda l'ultima riga del codice. Il tuo set di parole target è il secondo argomento della stessa funzione. Vedi la penultima riga. –

0

Un codice funzionale semplice per contare le frequenze di parole in un file di testo:

{ 
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 
} 
Problemi correlati