2012-03-29 3 views
7

Я разбираю длинную строку текста и вычисляю количество раз, когда каждое слово происходит в Python. У меня есть функция, которая работает, но я ищу советы о том, есть ли способы сделать ее более эффективной (с точки зрения скорости) и есть ли даже функции библиотеки python, которые могли бы сделать это для меня, поэтому я не изобретаю колесо ?Эффективно вычислять частоту слов в строке

Можете ли вы предложить более эффективный способ вычисления наиболее распространенных слов, которые встречаются в длинной строке (обычно более 1000 слов в строке)?

Также как лучше всего отсортировать словарь в списке, где 1-й элемент является самым распространенным словом, второй элемент является вторым наиболее распространенным словом и т. Д.?

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' осуждается. Вместо этого используйте 'key in d'. Кроме того, ваша функция сортировки довольно неправильная. 'return sorted (d, key = d .__ getitem__, reverse = True)' будет делать нисходящую сортировку по частоте и возвращать ключи. – agf

ответ

24

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

Вы можете также использовать NLTK (Natural Language ToolKit). Он предоставляет очень хорошие библиотеки для изучения обработки текстов. для этого примера вы можете использовать:

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) 

результат будет:

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