1. 程式人生 > >詞頻統計(python)

詞頻統計(python)

直接 如果 profile file 修改 one 說明 top 過程

一、程序分析

1.讀文件到緩沖區

def process_file(dst):     # 讀文件到緩沖區
try: # 打開文件
file1 = open(dst, "r")
except IOError as s:
print(s)
return None
try: # 讀文件到緩沖區
bvffer = file1.read()
except:
print("Read File Error!")
return None
file1.close()
return bvffer
2.處理緩沖區 bvffer的文件,統計每個單詞的頻率,存放在字典word_freq
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("%-5s %d " % (item[0], item[1]))

4.設立主函數,用於測試
def main():
parser = argparse.ArgumentParser()
parser.add_argument(‘dst‘)
args = parser.parse_args()
dst = args.dst
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.strip_dirs().sort_stats("cumulative").print_stats() # 按執行時間次數排序
p.print_callers(0.5, "process_file") # 得知哪些函數調用了process_file
p.print_callers(0.5, "process_buffer")
p.print_callers(0.5, "output_result")

二、代碼風格

縮進

使用 4 個空格進行縮進

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

空格

在二元運算符兩邊各空一格[=,-,+=,==,>,in,is not, and]

bvffer = file1.read()

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

1.對Gone_with_the_wind.txt進行詞頻統計

技術分享圖片

2.對A_Tale_of_Two_Cities.txt進行詞頻統計

技術分享圖片

四、性能分析結果及改進

為了更明顯的看出差異,選擇對Gone_with_the_wind.txt進行分析和改進

1.性能分析

(1)總運行時間

技術分享圖片

(2)執行時間、次數最多的部分代碼

技術分享圖片

技術分享圖片

根據數據可以看出,如果除去函數中調用子函數的運行時間,執行次數最多且執行時間最多的代碼是

         for word in words:
word_freq[word] = word_freq.get(word, 0)+1

2.代碼改進

根據測試結果,最耗時間和次數最多的代碼並不方便修改,我就從耗費時間第二多的replace 以及 split代碼入手,

將原來的代碼:

        for i in ‘!"#$%&()*+-,-./:;<=>?@“”[\\]^_{|}~‘:
bvffer = bvffer.replace(i, " ") # 替換特殊字符
bvffer = bvffer.lower() # 把大寫字母轉換為小寫
words = bvffer.split() # 分割字符串

變為:

         words = bvffer.lower().strip().split()

結果如下:

技術分享圖片

運行時間:

技術分享圖片

結果:比之前的0.669快了0.09秒,對於計算計而言已經算是非常漫長的時間了,在實驗過程中我發現當我的電腦處於“繁忙”狀態時,運行的總時間是0.97左右,有時候甚至高於1秒,當我把不用的軟件關掉時,時間就會縮短,可見電腦性能也會影響實驗結果

詞頻統計(python)