軟工作業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.其他
合作開發是一個有趣的過程,尤其是合作的產物包含了大家的努力,一起解決問題的體驗也很不錯。