1. 程式人生 > >軟工作業4:詞頻統計——基本功能

軟工作業4:詞頻統計——基本功能

一、基本資訊

編譯環境:Python3.7

專案名稱:詞頻統計——基本功能(結對程式設計)

作者:1613072036:譚琪

           1613072037:張銘銳

專案Git地址:https://gitee.com/zmryy/PairProg/tree/SE036_037

 

二、專案分析

1.程式執行模組(方法、函式)介紹

Task1:基本任務

統計檔案的有效行數並輸出:

    count = len(open(path, 'r').readlines())
    print("行數:"+str(count))

統計檔案的單詞總數並輸出:

def process_buffer(bvffer,stopwords):  # 處理緩衝區,返回存放每個單詞頻率的字典word_freq
    if bvffer:
        # 下面新增處理緩衝區bvffer程式碼,統計每個單詞的頻率,存放在字典word_freq
        word_freq = {}
        words = []
        wordmatch = "^[a-z]{4}(\w)*"  #正則表示式至少以4個英文字母開頭,跟上字母數字符號,單詞以分隔符分割,不區分大小寫
         # 將文字內容都改為小寫且去除文字中的中英文標點符號
for ch in '“‘!;:,.?”': bvffer = bvffer.lower().replace(ch, " ") for i in range(len(bvffer)): word = re.match(wordmatch, bvffer[i]) # 將正則表示式與列表中單詞匹配 若匹配失敗則返回NULL if word: # 匹配成功,加入words words.append(word.group()) #將匹配成功的單詞放入words列表中
# strip()刪除空白符(包括'/n', '/r','/t');split()以空格分割字串 words = bvffer.strip().split() for word in words: if word not in stopwords: #判斷列表中的單詞是否出現在停詞表中 將非停詞表中的單詞加入到字典word_freq中作為key word_freq[word]=word_freq.get(word,0)+1 print("總詞數:"+str(len(words))) return word_freq

統計檔案中各單詞的出現次數,最終只輸出頻率最高的10個。頻率相同的單詞,優先輸出字典序靠前的單詞:

def output_result(word_freq,path):
    resultpath="D:\桌面\python_work\result.txt"
    count = len(open(path, 'r').readlines())
    print("行數:"+str(count))
    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("單詞:%s 頻數:%d " % (item[0], item[1]))
            
            
            
def result(resultpath,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 的單詞
            with open(resultpath,'a')as f:
              f.write("單詞:"+item[0]+""+"頻數:"+str(item[1])+'\n')

 

Task2:任務進階

建一個存放停詞庫的文字“stopwords.txt”:

建立一個list存放文本里的停詞:

def stopwordslist(filepath):  #建立停用詞列表
    f = open(filepath, encoding='utf-8').readlines()  # 文字讀取 
    stopwords = []  # 存放停詞列表
    for i in range(len(f)):  
        f[i] = f[i].replace('\n', '')#由於文字是逐行讀取,所以要去除換行符
        stopwords.append(f[i]) 
    return stopwords

我們通過建立停詞表來優化統計結果,得到想要的高頻片語:

def main():#封裝main
    path = "D:\桌面\python_work\Gone_with_the_wind.txt"  # 《飄》檔案的路徑
    filepath="D:\桌面\python_work\stopwords.txt"      #停詞表路徑
    resultpath="D:\桌面\python_work\Result.txt"   #結果路徑
    bvffer = process_file(path)     #讀取文字
    stopwords=stopwordslist(filepath)  #建立停詞表
    word_freq = process_buffer(bvffer,stopwords)
    output_result(word_freq,path)
    result(resultpath,word_freq)  #輸出結果到Result.txt檔案
    match='[a-z]+'
    n=input('請輸入片語長度:')
    for i in range(1,int(n)):
       match+='\s[a-z]+'   #n個單詞片語的正則表示式
    print("匹配"+n+"個單詞片語:")
    word_freq=process_buffer1(path,stopwords,match)
    output_result(word_freq,path)

 

2.程式演算法的時間、空間複雜度分析

 以如下程式碼為例:

def process_buffer(bvffer,stopwords):  # 處理緩衝區,返回存放每個單詞頻率的字典word_freq
    if bvffer:
        # 下面新增處理緩衝區bvffer程式碼,統計每個單詞的頻率,存放在字典word_freq
        word_freq = {}
        words = []
        wordmatch = "^[a-z]{4}(\w)*"  #正則表示式至少以4個英文字母開頭,跟上字母數字符號,單詞以分隔符分割,不區分大小寫
         # 將文字內容都改為小寫且去除文字中的中英文標點符號
        for ch in '“‘!;:,.?”':  
            bvffer = bvffer.lower().replace(ch, " ")
        for i in range(len(bvffer)):
            word = re.match(wordmatch, bvffer[i])  # 將正則表示式與列表中單詞匹配 若匹配失敗則返回NULL
            if word:  # 匹配成功,加入words
                words.append(word.group())  #將匹配成功的單詞放入words列表中    
        # strip()刪除空白符(包括'/n', '/r','/t');split()以空格分割字串
        words = bvffer.strip().split()
        for word in words:
         if word not in stopwords:  #判斷列表中的單詞是否出現在停詞表中 將非停詞表中的單詞加入到字典word_freq中作為key
               word_freq[word]=word_freq.get(word,0)+1
        print("總詞數:"+str(len(words)))
        return word_freq

時間複雜度:程式碼以3個for迴圈為主,前兩個for迴圈巢狀執行,設停詞表有N個單詞,result中待分析的有n個單詞(N>n),則時間複雜度為O(N*2+n)。

空間複雜度:本部分的空間複雜度取決於定義的list容量,即停詞表加上待分析文字,所以該空間複雜度為O(N+n)。

 

3.程式執行案例截圖

 Task:基本任務

其中測試檔案:Gone_with_the_wind.txt

wordcount.py的執行結果:

 

 Task2.1:停詞表支援停詞

       

 Task2.2:檢視常用短語片語

  檢視兩個單片語成的短語

 

  檢視三個單片語成的短語

 

三、效能分析

1、按呼叫次數

2、按執行時間

3、效能圖表

四、其他

1.結對程式設計時間開銷:每天大約花了一個小時,前後共花了5、6個小時時間。時間主要花在程式優化上,還進行了查閱資料、討論交流、除錯優化等必要步驟。

2.結對程式設計照片:

 

五、事後分析與總結

1.討論決策

我們在統計常用短語的方法上產生過一些問題,起初我打算用建立想要短語的字串來檢索的方法,事實證明有些繁瑣;後來張銘銳同學提出用正則表示式來進行匹配檢索,實行後發現要便捷很多,節省時間,於是最終我們打算採用張銘銳的方法。

2.評價對方

譚琪評價張銘銳:張銘銳同學在編寫程式碼方面基礎很好,並且經常有高效的方法來解決演算法問題,在合作過程中積極配合,期待下一次合作。

張銘銳評價譚琪:譚琪同學對於編寫程式很積極,他這兩天經常和我討論作業4的問題,有了他的協助,我解決了程式碼方面的許多問題。

3.評價整個過程

結對程式設計需要雙方不斷提出自己的想法並加以結合,耐心理解對方的思路。每人負責相應的模組,但也要融會對方的程序,相互補充和學習。在解決問題的過程中,我們相互啟發和糾正,對於有爭議的問題也是通過實踐來印證。通過此次的結對程式設計,我們體會到合作的重要性以及不理解對方時的艱難,使我們對合作開發有了一定的理解和基礎。

4.其他

合作開發是一個有趣的過程,尤其是合作的產物包含了大家的努力,一起解決問題的體驗也很不錯。