web-dev-qa-db-fra.com

Python - Recherche de fréquences de mots dans une liste de mots dans un fichier texte

J'essaie d'accélérer mon projet pour compter les fréquences Word. J'ai plus de 360 ​​fichiers texte et j'ai besoin d'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 faire cela avec un seul fichier texte. 

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

Il est trop fastidieux d’obtenir les fréquences «individuelles» d’inflation, «d’emplois», de «production». Puis-je mettre ces mots dans une liste et trouver la fréquence de tous les mots de la liste en même temps? Fondamentalement this avec Python.

Exemple: au lieu de ceci:

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

Je veux faire ceci (je sais que ce n'est pas du vrai code, c'est ce sur quoi je demande de l'aide):

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

Ma liste de mots doit comporter 10 à 20 termes. Je dois donc être en mesure d'indiquer à Python une liste de mots pour obtenir le décompte. Ce serait aussi bien si la sortie pouvait être copier/coller dans une feuille de calcul Excel avec les mots en colonnes et les fréquences en lignes

Exemple:

inflation, jobs, output
3, 5, 1

Et enfin, est-ce que quelqu'un peut aider à automatiser cela pour tous les fichiers texte? Je pense que je pointe juste vers Python vers le dossier et il peut faire le décompte de Word ci-dessus à partir de la nouvelle liste pour chacun des 360 fichiers texte. Cela semble assez facile, mais je suis un peu coincé. De l'aide? 

Une sortie comme celle-ci serait fantastique: Nom de fichier1 inflation, emplois, production 3, 5, 1

Filename2
inflation, jobs, output
7, 2, 4

Filename3
inflation, jobs, output
9, 3, 5

Merci!

12
CoS

collections.Counter () a couvert cela si je comprends votre problème.

L'exemple de la documentation semblerait 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)

De l'exemple ci-dessus, vous devriez pouvoir 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 sens.

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
sotapme

Une implémentation possible (en utilisant Counter) ...

Au lieu d'imprimer la sortie, je pense qu'il serait plus simple d'écrire dans un fichier csv et de l'importer dans Excel. Regardez 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
Rob Cowie

Un code fonctionnel simple pour compter les fréquences de Word 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
Ansup Babu