Python-trouver des fréquences de mots de la liste des mots dans le fichier texte

j'essaie d'accélérer mon projet pour compter les fréquences de mots. J'ai 360+ fichiers texte, et j'ai besoin de pour obtenir le nombre total de mots et le nombre de fois que chaque mot d'une autre liste de mots apparaît. Je sais comment le faire avec un seul fichier texte.

>>> import nltk
>>> import os
>>> os.chdir("C:UsersCameronDesktopPDF-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')

c'est trop fastidieux à obtenir les fréquences de 'inflation', 'emploi', 'sortie' individu. Puis-je mettre ces mots dans une liste et de trouver la fréquence de tous les mots de la liste en même temps? Fondamentalement avec Python.

Exemple: au Lieu de:

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

je veux faire (je sais que ce n'est pas vraiment de code, c'est ce que je vais demander de l'aide sur):

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

Ma liste de mots va avoir 10-20 Termes, donc je dois être capable de pointer Python vers une liste de mots pour obtenir les comptes de. Ce serait aussi bien si la sortie était capable de copier + coller dans une feuille de calcul excel avec les mots comme les colonnes et les fréquences comme rangs

Exemple:

inflation, jobs, output
3, 5, 1

et enfin, est-ce que quelqu'un peut aider à automatiser cela pour tous les fichiers texte? Je me dis que je pointe juste Python vers le dossier et il peut faire le comptage de mots ci-dessus à partir de la nouvelle liste pour chacun des fichiers texte 360+. Ça semble facile, mais je suis un peu coincé. Toute aide?

Une sortie comme ce serait fantastique: Fichier1 l'inflation, l'emploi, la production 3, 5, 1

Filename2
inflation, jobs, output
7, 2, 4

Filename3
inflation, jobs, output
9, 3, 5

Merci!

12
demandé sur Community 2013-02-17 17:11:48

3 réponses

collections.Compteur() a ce couvert si je comprends votre problème.

l'exemple des docs semble correspondre à votre problème.

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

Dans l'exemple ci-dessus, vous devriez être en mesure de faire:

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

EDIT approche naïve pour montrer un chemin.

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
17
répondu sotapme 2013-02-17 13:20:24

une implémentation possible (en utilisant le compteur)...

http://docs.python.org/2/library/csv.html et remplacez 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)
4
répondu Rob Cowie 2013-02-17 14:12:24

un code fonctionnel simple pour compter les fréquences de mots dans un fichier texte:

{
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
}
0
répondu Ansup Babu 2016-02-19 20:59:28