2013-02-17 5 views
11

Ich versuche mein Projekt zu beschleunigen, um Worthäufigkeiten zu zählen. Ich habe 360 ​​+ Textdateien, und ich muss die Gesamtzahl der Wörter und die Anzahl der Male jedes Wort aus einer anderen Liste von Wörtern erhalten. Ich weiß, wie man das mit einer einzigen Textdatei macht.Python - Suche nach Worthäufigkeiten der Wörterliste in der Textdatei

>>> 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 ist zu langweilig, um die Frequenzen von "Inflation", "Arbeitsplätze", "Ausgabe" individuell zu bekommen. Kann ich diese Wörter in eine Liste aufnehmen und die Häufigkeit aller Wörter in der Liste gleichzeitig finden? Grundsätzlich this mit Python.

Beispiel: Statt dessen:

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

Ich möchte, dies zu tun (ich weiß, das ist nicht wirklich Code ist, ist es das, was ich um Hilfe bin gefragt auf):

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

Meine Wörterliste wird 10-20 Begriffe haben, daher muss ich Python nur auf eine Liste von Wörtern hinweisen können, um die Anzahl der Wörter zu erhalten. Es wäre auch schön, wenn der Ausgang der Lage ist, Kopie sein + Einfügen in eine Excel-Tabelle mit den Worten als Spalten und Frequenzen als Zeilen

Beispiel:

inflation, jobs, output 
3, 5, 1 

Und schließlich kann jemand helfen automatisiert dies für alle Textdateien? Ich denke, ich zeige Python einfach auf den Ordner und es kann das obige Wort aus der neuen Liste für jede der über 360 Textdateien zählen. Scheint einfach, aber ich bin ein bisschen fest. Irgendeine Hilfe?

Ein Ausgang wie das wäre fantastisch: Filename1 Inflation, Jobs, Ausgabe 3, 5, 1

Filename2 
inflation, jobs, output 
7, 2, 4 

Filename3 
inflation, jobs, output 
9, 3, 5 

Dank!

Antwort

14

collections.Counter() hat dies abgedeckt, wenn ich Ihr Problem verstehe.

Das Beispiel aus der Dokumentation scheint zu Ihrem Problem zu passen.

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

EDIT naiver Ansatz einen Weg zu zeigen:

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

aus dem obigen Beispiel sollten Sie tun kann.

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

ich jetzt mehr Stunden mit Zähler täuscht habe, und es immer noch nicht bekommen kann. – CoS

+0

Das obige Beispiel wird mir alle eindeutigen Wörter in meiner Textdatei anzeigen (in meinem Fall über 3000 eindeutige Wörter). Ich brauche nur die Tally für 10-20 spezifische Wörter in der Textdatei. – CoS

+0

Ich denke, das wird für die Liste funktionieren, großes Dankeschön! Ich starrte stundenlang auf diese Counter-Seite haha ​​ – CoS

4

Eine mögliche Implementierung (mit Zähler) ...

Statt die Ausgabe von Druck, ich glaube, es einfacher wäre, in eine CSV-Datei zu schreiben, und das in Excel importieren. Sehen Sie sich http://docs.python.org/2/library/csv.html an und ersetzen Sie 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

Welche Variablen muss ich ersetzen? Wo muss ich mein spezifisches Verzeichnis eintragen? – CoS

+0

Rob, Kannst du mir bitte sagen, wo im obigen Code ich den Verzeichnisordner, in dem ich arbeite, und die Liste der Wörter, an denen ich interessiert bin, setzen sollte? Ich bin mir nicht sicher, was ich in die 3 Funktionen, die du definiert hast, setzen musst. – CoS

+1

Der Pfad zu dem Verzeichnis, das Sie bearbeiten möchten, ist das erste Argument für die Funktion 'count_words_in_dir()'. Siehe die letzte Zeile des Codes. Ihre Gruppe von Zielwörtern ist das zweite Argument für die gleiche Funktion. Siehe die vorletzte Zeile. –

0

Eine einfache Funktionscodewort Frequenzen in einer Textdatei zählen:

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