Эффективно рассчитать частоту слов в строке - PullRequest
9 голосов
/ 29 марта 2012

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

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

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

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)

Ответы [ 3 ]

26 голосов
/ 29 марта 2012

Использование 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 голосов
/ 29 марта 2012
>>>> 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 голосов
/ 06 октября 2014

Вы также можете использовать 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)]
...