詞頻統計(python)


一、程序分析

  1.讀文件到緩沖區

 

 1 def process_file(dst):     # 讀文件到緩沖區
 2     try:     # 打開文件
 3         file1 = open(dst, "r")
 4     except IOError as s:
 5         print(s)
 6         return None
 7     try:     # 讀文件到緩沖區
 8         bvffer = file1.read()
 9     except:
10         print("Read File Error!")
11         return None
12     file1.close()
13     return bvffer

 


2.處理緩沖區 bvffer的文件,統計每個單詞的頻率,存放在字典word_freq
 1 def process_buffer(bvffer):
 2     if bvffer:
 3         word_freq = {}
 4         # 下面添加處理緩沖區 bvffer代碼,統計每個單詞的頻率,存放在字典word_freq
 5         for i in '!"#$%&()*+-,-./:;<=>?@“”[\\]^_{|}~':
 6             bvffer = bvffer.replace(i, " ")  # 替換特殊字符
 7         bvffer = bvffer.lower()  # 把大寫字母轉換為小寫
 8         words = bvffer.split()  # 分割字符串
 9         for word in words:
10             word_freq[word] = word_freq.get(word, 0)+1
11         return word_freq
 
        
3.用輸出函數將處理好的單詞按詞頻排序,輸出詞頻Top10 的單詞
1 def output_result(word_freq):
2     if word_freq:
3         sorted_word_freq = sorted(word_freq.items(), key=lambda v: v[1], reverse=True)
4         for item in sorted_word_freq[:10]:  # 輸出 Top 10 的單詞
5             print("%-5s %d " % (item[0], item[1]))
 
        
4.設立主函數,用於測試
 
        
1 def main():
2     parser = argparse.ArgumentParser()
3     parser.add_argument('dst')
4     args = parser.parse_args()
5     dst = args.dst
6     bvffer = process_file(dst)
7     word_freq = process_buffer(bvffer)
8     output_result(word_freq)

5.cProfile對代碼性能進行測試
 
        
 1 if __name__ == "__main__":
 2     import cProfile
 3     import pstats
 4     import argparse
 5     cProfile.run("main()", "result")
 6     # 直接把分析結果打印到控制台
 7     p = pstats.Stats("result")  # 創建Stats對象
 8     p.sort_stats('calls').print_stats(10)
 9     # 按照調用次數排序,打印前10函數的信息
10     p.strip_dirs().sort_stats("cumulative", "name").print_stats(10)
11     p.strip_dirs().sort_stats("cumulative").print_stats()  # 按執行時間次數排序
12     p.print_callers(0.5, "process_file")  # 得知哪些函數調用了process_file
13     p.print_callers(0.5, "process_buffer")  
14     p.print_callers(0.5, "output_result")  
 
        

 



二、代碼風格

縮進

使用 4 個空格進行縮進

1 def process_buffer(bvffer):
2     if bvffer:
3         word_freq = {}

 

空格

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

 1 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代碼入手,

           將原來的代碼:            

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

             變為:           

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

 

 
        

             結果如下:

               

            運行時間:

               

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

 四、性能分析結果及改進

               

 

 

              

 

 

 

 

 

 

 

 

 

 

 

 
       


免責聲明!

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



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