python統計詞頻


一、程序分析

(1)將文件讀入緩沖區(dst指文本文件存放路徑,設置成形參,也可以不設,具體到函數里設置)

def process_file(dst):     # 讀文件到緩沖區
    try:     # 打開文件
        txt=open(dst,"r")
    except IOError as s:
        print s
        return None
    try:     # 讀文件到緩沖區
        bvffer=txt.read()
    except:
        print "Read File Error!"
        return None
    txt.close()
    return bvffer

(2)設置緩沖區,將文本度數緩沖區,並對文本的特殊符號進行修改,使其更容易處理,並讀入字典。

def process_buffer(bvffer):
    if bvffer:
        word_freq = {}
        # 下面添加處理緩沖區 bvffer代碼,統計每個單詞的頻率,存放在字典word_freq
        bvffer=bvffer.lower()
        for x in '~!@#$%^&*()_+/*-+\][':
            bvffer=bvffer.replace(x, " ")
        words=bvffer.strip().split()
        for word in words:
            word_freq[word]=word_freq.get(word,0)+1
        return word_freq

(3)設置輸出函數,運用lambda函數對詞頻排序,並以“詞”——“頻”格式輸出

def output_result(word_freq):
    if word_freq:
        sorted_word_freq = sorted(word_freq.items(), key=lambda v: v[1], reverse=True)
        for item in sorted_word_freq[:10]:  # 輸出 Top 10 的單詞
            print item

(4)封裝main函數,以便接下來的cProfile的性能評估

def main():

    dst = "Gone_with_the_wind.txt"
    bvffer = process_file(dst)
    word_freq = process_buffer(bvffer)
    output_result(word_freq)

if __name__ == "__main__":
    import cProfile
    import pstats
    cProfile.run("main()", "result")
    # 直接把分析結果打印到控制台
    p = pstats.Stats("result")  # 創建Stats對象
    p.strip_dirs().sort_stats("call").print_stats()  # 按照調用的次數排序
    p.strip_dirs().sort_stats("cumulative").print_stats()  # 按執行時間次數排序
    p.print_callers(0.5, "process_file")  # 如果想知道有哪些函數調用了process_file,小數,表示前百分之幾的函數信息
    p.print_callers(0.5, "process_buffer")  # 如果想知道有哪些函數調用了process_buffer
    p.print_callers(0.5, "output_result")  # 如果想知道有哪些函數調用了output_res

二、代碼風格說明

縮進

使用4個空格進行縮進

def process_buffer(bvffer):
    if bvffer:
        word_freq = {}

行寬

每行代碼盡量不超過80個字符

本次編程最長一行代碼(算上下划線和空格):78個字符

sorted_word_freq = sorted(word_freq.items(), key=lambda v: v[1], reverse=True)

import語句

分行書寫import語句

import cProfile
import pstats

三、程序運行命令、運行結果截圖

詞頻統計結果截圖

四、性能分析結果及改進 

執行次數最多:

執行時間最多:

四、性能分析結果及改進

綜合執行次數最多和時間最長,我們可以發現,字典中的get方法是所有話數里用的最多的,要想減少時間,我們可以從替換的符號入手,因為名著《飄》不是一個數學學術性的報告之類的,所以想@#¥%……&*這些之類的符號基本不可能在這本書里出現,所以在規范文本的過程中,我們可以減去對這些符號的替換修改。下面是兩次時間和調用次數的前后對比圖。

        for x in '!%()_/-\][':
            bvffer=bvffer.replace(x, " ")

 

前:

 

后:

 由此可見快樂大約0.016秒左右。

五、可視化操作

下載gprof2dot.py將此一個PY(無需將一整個文件夾放入)放到詞頻統計的相同目錄,在graphviz官網下載zip文件,解壓,並將其bin目錄添加到系統的環境變量里。

1. 性能分析:python -m cProfile -o result -s cumulative word_freq.py Gone_with_the_wind.txt;分析結果保存到 result 文件;

2. 轉換為圖形;gprof2dot 將 result 轉換為 dot 格式;再由 graphvix 轉換為 png 圖形格式。 

命令:python gprof2dot.py -f pstats result | dot -Tpng -o result.png

注意:要通過cmd進去詞頻的py程序的目錄
,在其中輸入代碼(必須保證已經有了result文件,不然無法找到目標文件)

最后結果分析如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM