2012-03-29 11 views
7

Estoy analizando una larga cadena de texto y calculando el número de veces que aparece cada palabra en Python. Tengo una función que funciona pero estoy buscando consejos sobre si hay formas en que puedo 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 ?Calcular de manera eficiente la frecuencia de las palabras en una cadena

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

¿Cuál es la mejor manera de ordenar 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 así sucesivamente?

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) 
+0

'has_key' está en desuso. Use 'key in d' en su lugar. Además, su función de clasificación es bastante incorrecta. 'return sorted (d, key = d .__ getitem__, reverse = True)' haría la ordenación descendente por frecuencia y devolvería las claves. – agf

Respuesta

24

Uso collections.Counter:

>>> from collections import Counter 
>>> test = 'abc def abc def zzz zzz' 
>>> Counter(test.split()).most_common() 
[('abc', 2), ('zzz', 2), ('def', 2)] 
4
>>>> 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)] 
2

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

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)] 
Cuestiones relacionadas