1. 程式人生 > >軟工作業3:Python詞頻統計

軟工作業3:Python詞頻統計

alt stat 小寫 代碼 strong pla 創建 處理 inf

一、程序分析

1.讀文件到緩沖區

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

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

def process_buffer(bvffer):
    if bvffer:
        word_freq = {}
        # 下面添加處理緩沖區 bvffer代碼,統計每個單詞的頻率,存放在字典word_freq
        for i in !"#$%&()*+-,-./:;<=>?@“”[\\]^_{|}~:
            bvffer = bvffer.replace(i, " ")  # 替換特殊字符
bvffer = bvffer.lower() # 把大寫字母轉換為小寫 words = bvffer.split() # 分割字符串 for word in words: word_freq[word] = word_freq.get(word, 0)+1 return word_freq

3.輸出函數將處理好的單詞按詞頻排序,輸出詞頻Top10 的單詞

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函數

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument(dst)
    args = parser.parse_args()
    dst = args.dstdst = "Gone_with_the_wind.txt"
    bvffer = process_file(dst)
    word_freq = process_buffer(bvffer)
    output_result(word_freq)

5.cProfile的性能評估

if __name__ == "__main__":
    import cProfile
    import pstats
    import argparse
    cProfile.run("main()", "result")
    # 直接把分析結果打印到控制臺
    p = pstats.Stats("result")  # 創建Stats對象
    p.sort_stats(calls).print_stats(10)
    # 按照調用次數排序,打印前10函數的信息
    p.strip_dirs().sort_stats("cumulative", "name").print_stats(10)
    p.print_callers(0.5, "process_file")  # 得知哪些函數調用了process_file
    p.print_callers(0.5, "process_buffer")  
    p.print_callers(0.5, "output_result")

二、代碼格說明

縮進

if bvffer:
        word_freq = {}

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

對Gone_with_the_wind.txt進行詞頻統計:

運行截圖:

技術分享圖片

按執行次數

技術分享圖片

按執行時間:

技術分享圖片

四、性能分析結果及改進

執行次數最多:

技術分享圖片

執行時間最多:

技術分享圖片

改進代碼:

分析:可以去掉其中的部分不可能出現的符號

原來代碼:

for i in !"#$%&()*+-,-./:;<=>?@“”[\\]^_{|}~:
            bvffer = bvffer.replace(i, " ")  # 替換特殊字符

技術分享圖片

改進之後:

for i in !"()+-,-./:;<=>?“”^~:
            bvffer = bvffer.replace(i, " ")  # 替換特殊字符

技術分享圖片

軟工作業3:Python詞頻統計