這篇文章主要介紹python寫程序統(tǒng)計詞頻的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
在改則等地區(qū),都構建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供成都網(wǎng)站建設、成都做網(wǎng)站 網(wǎng)站設計制作專業(yè)公司,公司網(wǎng)站建設,企業(yè)網(wǎng)站建設,品牌網(wǎng)站設計,網(wǎng)絡營銷推廣,外貿(mào)營銷網(wǎng)站建設,改則網(wǎng)站建設費用合理。從需求來看,“統(tǒng)計詞頻的腳本”是一個泛泛的需求。——我并不是想要統(tǒng)計特定內(nèi)容的詞頻,我希望生成的腳本可以處理各式內(nèi)容。這對腳本的最終交付成果提出了高要求。
如果請你用 python 寫個統(tǒng)計詞頻的腳本,你會如何寫呢?當我正襟危坐,正視這道題目時,第一秒鐘感知到了為難與膽怯。有個小人兒在腦袋里說:“好難,我做不到吧?”
面對新事物、新挑戰(zhàn),人們善于用想象力把困難放的很大。而我已經(jīng)有了多次迎難而上的經(jīng)驗,于是我喝了一口苦咖啡,問自己:
從哪兒下手呢?不如進一步拆解來看看吧。
需求拆解如下:
“統(tǒng)計詞頻的腳本”,可以拆分為2個部分,a) 有哪些詞?b) 統(tǒng)計這些詞出現(xiàn)的次數(shù)。 b是簡單的。 a分為2種情況:i) 給定詞庫;ii) 自己從內(nèi)容中找詞。 i是簡單的,ii則可能復雜。
此時你可能問,你是如何判斷簡單還是復雜?簡單吖,根據(jù)自己的編程能力與經(jīng)驗,預判自己能否寫出代碼。
需求經(jīng)過拆解后,當前的重點聚焦于:
如何從內(nèi)容中抓取詞?
其中,內(nèi)容是一個寬泛的概念。在程序中,它可能是:string 常量,文件,網(wǎng)頁,api 返回的數(shù)據(jù)如此等等。關鍵是什么呢?關鍵是腳本的一線代碼們處理的是 string,列表或字典。其余的文件、網(wǎng)頁、api 返回數(shù)據(jù)等,無非是數(shù)據(jù)的載體更為復雜,我已經(jīng)掌握了把從它們那里獲取數(shù)據(jù),生成 string、列表或字典的能力。而這個能力你也能很簡單獲得,即通過“python 如何讀取文件數(shù)據(jù)”之類句式,從搜索引擎中找到答案。
一篇文章可以直接定義或讀取為一個 string 常量。而 for i in stringcontent
句式能夠幫我們遍歷 string 統(tǒng)計單個字的詞頻。然后雙字詞、三字詞、N字詞等等,都可以由單字詞拼接而成。
難點既然這么快想清楚,那么寫代碼實現(xiàn)吧!
從上帝視角調控成長體驗
第一個版本代碼如下圖所示,還是非常簡便的。我在同個目錄下,另起一個 poem.py
文件用來把內(nèi)容定義為常量,供該腳本調用。
首次測試的string 常量 poem 是一首中文小詩,從常理來說,中文詞匯包括漢字1、2、3、4個,超過 4 個的雖有但很少。順著上面的思路,我繼續(xù)把 3字詞、4字詞的代碼也寫出來了。運算結果正常。
我想試試復雜的。比如讀取pdf文件。這涉及到一個我尚未掌握的新知識點:python如何讀取pdf文件?獲取答案也很容易,搜索然后嘗試。
如果把“統(tǒng)計詞頻的python腳本”當作主線任務,那么“python如何讀取pdf文件”就是分支任務啦。在這個分支任務上我立即遇到困難:使用 anaconda powshell prompt 安裝第三方庫時, pip install pdfminer
命令行執(zhí)行了小段就報錯。
此時要么在支線任務中深究下去,要么回歸主線任務。我選擇回歸主線任務,但順手在 trello 上給自己建卡“python如何讀取pdf文件”等以后專門來研究它。
現(xiàn)在,我繼續(xù)專注于詞頻腳本。
除了內(nèi)容載體的復雜,還可以有內(nèi)容量的冗長。我拷貝了一篇幾千字的中文文章,定義為 string 常量,然后用剛才調試通過的腳本統(tǒng)計詞頻。
在處理數(shù)百字的小詩時,腳本運行迅速,結果幾乎立即被終端打印出來。而處理這篇長文時,終端打印完單字詞、雙字詞的統(tǒng)計結果后,就一直沒有輸出,好似“卡”在那里。于是我強制結束腳本,在代碼中添加了幾條打印來檢查程序是否正常運行中。由此發(fā)現(xiàn)了一個“性能”上的問題:電腦或編輯器,都沒有卡住,程序運算持續(xù)在進行中,只是沒有運算完成。
這篇長文,單字詞幾百條;按照我的上述代碼邏輯,雙字詞運算 幾百*幾百 次,三字詞運算 幾百*幾百 *幾百 次,四字詞運算 幾百*幾百 *幾百 次。演算一下,具體是多少呢?
4字詞運算次數(shù):467758877041 次
四千六百多億次!難怪遲遲沒有結果輸出!看來代碼本身需要被修改優(yōu)化,以降低計算量。第二個版本除了修改算法外,也調整了代碼結構,使之更易于調試和增刪。
在這個版本中,詞頻統(tǒng)計僅可用于中文,處理幾千字的文章,大概需要1分鐘左右。此時,一個下午已經(jīng)過去了。再次久坐忘動的我,決定暫停休息一下,扭扭脖子甩甩胳膊。而且,很重要的一件事是, 把實踐過程中的思考與第二個版本的腳本做一個階段交付 。
不得不提的是, 寫文章是一個提升階段交付成就感的小策略 。這也是此文的由來。當然啦,我還要順手在 trello 上給自己添加2張新卡片,等有精力時繼續(xù)實踐:
python如何統(tǒng)計英文文章詞頻? python統(tǒng)計中文詞頻的腳本處理十幾萬字的書籍時,性能如何?
在群里談及我在寫的詞頻腳本時,有位網(wǎng)友提出一個觀點,“不是程序員,學編程沒用”。我想,他肯定是沒有讀過李笑來的書,或者干脆讀過,只是讀成了另外一個版本吧!
如果你也在學習 python 或想要提高自學能力,歡迎來xue.cn 聊天室找我 @liujuanjuan1984 ~
def write_rlt(content,dic1,dic2): rlt = {}#有該結果但并沒有用上 rlts = {} for i in dic1.keys(): for j in dic2.keys(): cix = i + j if cix in content: num = content.count(cix) if cix not in rlt.keys(): rlt[cix]=num if num > 1: rlts[cix]=num return rlts def cipin_1(content): rlt1 = {} rlt1s = {} for ci in content: #r"[^\u4e00-\u9fa5^a-z^A-Z^0-9]" atext =""" \ \\\\n ,.,。/一()()<>《》 """ if ci not in atext: num = content.count(ci) if ci not in rlt1.keys(): rlt1[ci]=num if num > 1: rlt1s[ci]=num return rlt1s def merge_dic(dic1,dic2): rlt = dic1.copy() rlt.update(dic2) return rlt def cipin_x(content,dic1,dic2): rltsx = write_rlt(content,dic1,dic2) rltsy = write_rlt(content,dic2,dic1) rlts = merge_dic(rltsx,rltsy) return rlts def sorted_dic(dic1,txt=None): rlt = sorted(dic1.items(),key=lambda x:x[1],reverse=True) print("\n--------------------\n") if txt==None: atxt = "結果共" else: atxt = txt + "字詞共" print(atxt,len(rlt),"條,具體為:\n",rlt) return rlt def main(): from txt import zixue_x as content #加載想要統(tǒng)計的內(nèi)容,string type import datetime print("---begin---",datetime.datetime.now()) rlt1s = cipin_1(content) rlt2s = cipin_x(content,rlt1s,rlt1s) rlt3s = cipin_x(content,rlt1s,rlt2s) rlt4s = cipin_x(content,rlt1s,rlt3s) rlt5s = cipin_x(content,rlt1s,rlt4s) rlt6s = cipin_x(content,rlt1s,rlt5s) rlt7s = cipin_x(content,rlt1s,rlt6s) sorted_dic(rlt1s,"單") sorted_dic(rlt2s,"雙") sorted_dic(rlt3s,"3") sorted_dic(rlt4s,"4") sorted_dic(rlt5s,"5") sorted_dic(rlt6s,"6") sorted_dic(rlt7s,"7") print("---end---",datetime.datetime.now()) if __name__ == "__main__": main()
以上是“python寫程序統(tǒng)計詞頻的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關知識,歡迎關注創(chuàng)新互聯(lián)成都網(wǎng)站設計公司行業(yè)資訊頻道!
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。