天天看點

第一次個人程式設計作業

https://github.com/BTD892/python1

二、PSP表格

PSP2.1 Personal Software Process Stages 預估耗時(分鐘) 實際耗時(分鐘)
Planning 計劃
· Estimate · 估計這個任務需要多少時間 10
Development 開發
· Analysis · 需求分析 (包括學習新技術) 120 180
· Design Spec · 生成設計文檔 15
· Design Review · 設計複審
· Coding Standard · 代碼規範 (為目前的開發制定合适的規範)
· Design · 具體設計 240
· Coding · 具體編碼 300
· Code Review · 代碼複審 360 420
· Test · 測試(自我測試,修改代碼,送出修改)
Reporting 報告
· Test Repor · 測試報告 60 90
· Size Measurement · 計算工作量
· Postmortem & Process Improvement Plan · 事後總結, 并提出過程改進計劃
· 合計 1085 1405

三、計算機子產品接口

(3.1)計算子產品接口的設計與實作過程。設計包括代碼如何組織,比如會有幾個類,幾個函數,他們之間關系如何,關鍵函數是否需要畫出流程圖?說明你的算法的關鍵(不必列出源代碼),以及獨到之處。(18')

在查詢資料後得知了DFA過濾算法檢測敏感詞,其思想是基于狀态轉移來檢索敏感詞,隻需對文本進行一次掃描即可對所有敏感詞進行檢測。DFA形成的資料存儲結構如下圖

第一次個人程式設計作業

然而,最基礎的dfa算法依舊無法滿足題目需求。于是在此基礎上我又利用拼音的各個字母形成類似以上的結構來協助使用

第一次個人程式設計作業

對于這些結構使用了函數add_word(),結果如圖,然後本人因為懶惰,還寫了個字典來存儲漢字與其對應的拼音當個”字典“,友善諧音字轉化

第一次個人程式設計作業

整體的比對算法是以dfa為主,遇到拼音時在裡面對上述生成的字典用一個小循環進行掃描,縮寫也是類似

總的就一個DFA類,裡面有一些需要用到的字典及隊列,還有對應使用的函數add_word()和match_word()

(3.2)計算子產品接口部分的性能改進。記錄在改進計算子產品性能上所花費的時間,描述你改進的思路,并展示一張性能分析圖(由VS 2019、JProfiler或者Jetbrains系列IDE自帶的Profiler的性能分析工具自動生成),并展示你程式中消耗最大的函數。(12')

由下圖可見,最占據運作時間的是來自pinyin庫的函數,即漢字轉化成拼音,或許拆字的功能添加上去後可以奪得桂冠,但是我實在找不到python裡拆字功能的實作樣例,人是真麻了。是以隻能基于減少pinyin庫函數的使用作為思路進行優化,然而為了實作檢測到諧音字的功能,又不得不對整體的文本進行拼音轉化(或許有更好的方法,但是人菜實在想不出來TT-TT),這樣進一步限制了優化的思路。再思慮到後面有可能添加上的拆字功能,必将會占據運作時間的大頭,筆者不得已放棄了對他的優化。還不如提早花費時間去解決拆字功能的實作,然後再針對其進行優化。然而天不随人願,隻能後續看看大佬操作了

第一次個人程式設計作業
(3.3)計算子產品部分單元測試展示。展示出項目部分單元測試代碼,并說明測試的函數,構造測試資料的思路。并将單元測試得到的測試覆寫率截圖,發表在部落格中。(12')
def test_add(self):
        word = "test_word.txt"
        tmp_ans = {'N': '腦', 'S': '傻', 'is_end': False, '傻': {'B': '逼', 'is_end': False, '逼': {'is_end': True}}, '腦': {'C': '殘', 'is_end': False, '殘': {'is_end': True}}}
        self.dfa.add_word(word)
        self.assertEqual(self.dfa.s_word, tmp_ans)
           
def test_match(self):
        org = "test_org.txt"
        self.dfa.add_word("test_word.txt")
        self.dfa.match_word(org)
        self.assertEqual(self.dfa.answer, ['Line1: <傻逼> 傻逼', 'Line2: <腦殘> 腦殘'])
           

首先是最基礎的比對

第一次個人程式設計作業

然後是嘗試拼音,縮寫以及諧音字

第一次個人程式設計作業
第一次個人程式設計作業
第一次個人程式設計作業
第一次個人程式設計作業

關于測試資料的構造,主要針對于縮寫和拼音這兩個功能的是否會沖突和重疊

(3.4)計算子產品部分異常處理說明。在部落格中詳細介紹每種異常的設計目标。每種異常都要選擇一個單元測試樣例釋出在部落格中,并指明錯誤對應的場景。(6')
if len(sys.argv) != 4:
        print("error")
        exit(-1)
           

四、心得體會