2013-02-17 18 views
11

Próbuję przyspieszyć mój projekt, aby policzyć częstotliwości słów. Mam 360 + plików tekstowych i potrzebuję uzyskać całkowitą liczbę słów i liczbę razy, gdy każde słowo z innej listy słów pojawi się. Wiem, jak to zrobić z pojedynczym plikiem tekstowym.Python - Znajdowanie częstotliwości słów listy słów w pliku tekstowym

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

Jest zbyt żmudny, aby uzyskać częstotliwości "inflacji", "zleceń", "produkcji" indywidualnych. Czy mogę umieścić te słowa na liście i znaleźć częstotliwość wszystkich słów na liście w tym samym czasie? Zasadniczo this z Python.

Przykład: Zamiast tego:

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

chcę to zrobić (wiem, że to nie jest prawdziwy kod, to co ja z prośbą o pomoc w sprawie):

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

Moja lista słów będzie miała 10-20 terminów, więc potrzebuję być w stanie wskazać Pythonowi w kierunku listy słów, aby uzyskać liczby. Byłoby również miło, jeśli wyjście mogła być kopia + wklej do arkusza kalkulacyjnego Excel ze słowami jak kolumny i częstotliwości wierszy

Przykład:

inflation, jobs, output 
3, 5, 1 

I wreszcie, może ktoś pomoże zautomatyzować to dla wszystkie pliki tekstowe? Myślę, że po prostu wskazuję Pythona w kierunku tego folderu i można to zrobić, licząc z nowej listy dla każdego z plików tekstowych 360+. Wydaje się dość łatwe, ale trochę utknąłem. Jakaś pomoc?

Wyjście jak to byłoby fantastyczne: nazwa_pliku1 inflacja, zatrudnienie, produkcja 3, 5, 1

Filename2 
inflation, jobs, output 
7, 2, 4 

Filename3 
inflation, jobs, output 
9, 3, 5 

Dzięki!

Odpowiedz

14

collections.Counter() ma to pokrycie, jeśli rozumiem Twój problem.

Przykład z dokumentacji wydaje się pasować do twojego problemu.

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

Z powyższego przykładu was powinien być w stanie to zrobić:

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

EDIT naiwne podejście, aby pokazać jeden sposób.

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

Byłem oszukiwanie z licznika przez kilka godzin teraz, i nadal nie mogę dostać. – CoS

+0

Powyższy przykład da mi listę wszystkich unikalnych słów w moim pliku tekstowym (ponad 3000 unikalnych słów w moim przypadku). Potrzebuję tylko liczby 10-20 konkretnych słów w pliku tekstowym. – CoS

+0

Myślę, że to zadziała na listę, wielkie dzięki! Wpatrywałem się w tę stronę Licznika godzinami haha ​​ – CoS

4

Jednym z możliwych rozwiązań (stosując licznik) ...

Zamiast drukować wyjście, myślę, że byłoby prościej napisać do pliku csv i import, że do programu Excel. Spójrz na http://docs.python.org/2/library/csv.html i zastąp 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

Które zmienne powyżej muszę wymienić? Gdzie muszę umieścić mój katalog? – CoS

+0

Rob, czy możesz mi powiedzieć, gdzie w powyższym kodzie powinienem umieścić folder, w którym pracuję i listę słów, którymi jestem zainteresowany? Nie jestem pewien, co muszę wprowadzić w 3 zdefiniowanych funkcjach. – CoS

+1

Ścieżka do katalogu, który chcesz przetworzyć, jest pierwszym argumentem funkcji 'count_words_in_dir()'. Zobacz ostatni wiersz kodu. Twój zestaw słów docelowych jest drugim argumentem tej samej funkcji. Zobacz przedostatnią linię. –

0

Prosty kod funkcjonalny liczyć częstotliwości słowo w pliku tekstowym:

{ 
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 
} 
Powiązane problemy