2012-03-29 40 views
7

Tôi đang phân tích cú pháp chuỗi văn bản dài và tính số lần mỗi từ xuất hiện trong Python. Tôi có một chức năng hoạt động nhưng tôi đang tìm lời khuyên về việc liệu có cách nào tôi có thể làm cho nó hiệu quả hơn (về mặt tốc độ) và liệu có chức năng thư viện trăn có thể làm điều này cho tôi không, vì vậy tôi không phát minh lại bánh xe ?Tính toán hiệu quả tần số từ trong chuỗi

Bạn có thể đề xuất cách hiệu quả hơn để tính các từ phổ biến nhất xảy ra trong chuỗi dài (thường có hơn 1000 từ trong chuỗi) không?

Còn cách tốt nhất để sắp xếp từ điển thành danh sách trong đó phần tử thứ nhất là từ phổ biến nhất, phần tử thứ 2 là từ phổ biến thứ 2 và v.v.

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' bị phản đối. Thay vào đó, hãy sử dụng 'khóa trong d'. Ngoài ra, chức năng sắp xếp của bạn là khá sai. 'return sort (d, key = d .__ getitem__, reverse = True)' sẽ thực hiện sắp xếp giảm dần theo tần số và trả về các khóa. – agf

Trả lời

24

Sử dụng 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

Bạn cũng có thể sử dụng NLTK (ngôn ngữ tự nhiên ToolKit). Nó cung cấp các thư viện rất tốt đẹp để nghiên cứu xử lý các văn bản. ví dụ này, bạn có thể sử dụng:

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) 

kết quả sẽ là:

[('aa', 2), ('bb', 2), ('cc', 1)] 
Các vấn đề liên quan