web-dev-qa-db-ja.com

文字列内の単語の頻度を効率的に計算する

長いテキスト文字列を解析し、Pythonで各Wordが出現する回数を計算しています。私は機能する関数を持っていますが、それをより効率的にする方法があるかどうか(速度の点で)、そしてこれを行うことができる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)
11
sazr

使用する - collections.Counter

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

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)]
2
Nima Soroush