Calcular de manera eficiente la frecuencia de palabras en una cadena

Estoy analizando una larga cadena de texto y calculando el número de veces que cada palabra aparece en Python. Tengo una función que funciona, pero estoy buscando consejos sobre si hay formas de hacerlo más eficiente (en términos de velocidad) y si hay incluso funciones de biblioteca de Python que podrían hacer esto por mí, así que no estoy reinventando la rueda. ?

¿Puede sugerir una forma más eficiente de calcular las palabras más comunes que aparecen en una cadena larga (generalmente más de 1000 palabras en la cadena)?

Además, ¿cuál es la mejor manera de clasificar el diccionario en una lista donde el primer elemento es la palabra más común, el segundo elemento es la segunda palabra más común y etc.?

test = """abc def-ghi jkl abc abc""" def calculate_word_frequency(s): # Post: return a list of words ordered from the most # frequent to the least frequent words = s.split() freq = {} for word in words: if freq.has_key(word): freq[word] += 1 else: freq[word] = 1 return sort(freq) def sort(d): # Post: sort dictionary d into list of words ordered # from highest freq to lowest freq # eg: For {"the": 3, "a": 9, "abc": 2} should be # sorted into the following list ["a","the","abc"] #I have never used lambda's so I'm not sure this is correct return d.sort(cmp = lambda x,y: cmp(d[x],d[y])) print calculate_word_frequency(test) 

    Utilizar collections.Counter .

     >>> from collections import Counter >>> test = 'abc def abc def zzz zzz' >>> Counter(test.split()).most_common() [('abc', 2), ('zzz', 2), ('def', 2)] 
     >>>> test = """abc def-ghi jkl abc abc""" >>> from collections import Counter >>> words = Counter() >>> words.update(test.split()) # Update counter with words >>> words.most_common() # Print list with most common to least common [('abc', 3), ('jkl', 1), ('def-ghi', 1)] 

    También puedes usar NLTK (Natural Language Toolkit). Proporciona muy buenas bibliotecas para estudiar el procesamiento de los textos. para este ejemplo puedes usar:

     from nltk import FreqDist text = "aa bb cc aa bb" fdist1 = FreqDist(text) # show most 10 frequent word in the text print fdist1.most_common(10) 

    El resultado será:

     [('aa', 2), ('bb', 2), ('cc', 1)]