Contando la frecuencia de frases en Python 3.3.2

He estado examinando diferentes fonts en la web y he probado varios métodos, pero solo pude encontrar la forma de contar la frecuencia de palabras únicas pero no frases únicas. El código que tengo hasta ahora es el siguiente:

import collections import re wanted = set(['inflation', 'gold', 'bank']) cnt = collections.Counter() words = re.findall('\w+', open('02.2003.BenBernanke.txt').read().lower()) for word in words: if word in wanted: cnt [word] += 1 print (cnt) 

Si es posible, también me gustaría contar el número de veces que se usan las frases “banco central” y “alta inflación” en este texto. Agradezco cualquier sugerencia u orientación que pueda dar.

En primer lugar, así es como generaría el cnt que haces (para reducir la sobrecarga de memoria)

 def findWords(filepath): with open(filepath) as infile: for line in infile: words = re.findall('\w+', line.lower()) yield from words cnt = collections.Counter(findWords('02.2003.BenBernanke.txt')) 

Ahora, a tu pregunta sobre frases:

 from itertools import tee phrases = {'central bank', 'high inflation'} fw1, fw2 = tee(findWords('02.2003.BenBernanke.txt')) next(fw2) for w1,w2 in zip(fw1, fw2)): phrase = ' '.join([w1, w2]) if phrase in phrases: cnt[phrase] += 1 

Espero que esto ayude

Suponiendo que el archivo no es enorme, esta es la forma más fácil

 for w1, w2 in zip(words, words[1:]): phrase = w1 + " " + w2 if phrase in wanted: cnt[phrase] += 1 print(cnt) 

Para contar las ocurrencias literales de un par de frases en un archivo pequeño:

 with open("input_text.txt") as file: text = file.read() n = text.count("high inflation rate") 

Hay nltk.collocations módulo nltk.collocations que proporciona herramientas para identificar palabras que a menudo aparecen consecutivamente:

 import nltk from nltk.tokenize import word_tokenize, sent_tokenize from nltk.collocations import BigramCollocationFinder, TrigramCollocationFinder # run nltk.download() if there are files missing words = [word.casefold() for sentence in sent_tokenize(text) for word in word_tokenize(sentence)] words_fd = nltk.FreqDist(words) bigram_fd = nltk.FreqDist(nltk.bigrams(words)) finder = BigramCollocationFinder(word_fd, bigram_fd) bigram_measures = nltk.collocations.BigramAssocMeasures() print(finder.nbest(bigram_measures.pmi, 5)) print(finder.score_ngrams(bigram_measures.raw_freq)) # finder can be constructed from words directly finder = TrigramCollocationFinder.from_words(words) # filter words finder.apply_word_filter(lambda w: w not in wanted) # top n results trigram_measures = nltk.collocations.TrigramAssocMeasures() print(sorted(finder.nbest(trigram_measures.raw_freq, 2)))