python中最最基礎的兩個實例——第二彈

1. 問題背景

日常生活中,我們總能碰到一些需要我們統計詞數或者文本類型的情況,今天我們我們要看看python中的對文本詞頻的統計。

2. 問題前準備

採用字典解決問題,該問題的IPO如下:
輸入:從文件中讀取一篇文章
處理:採用字典結構進行統計
輸出:文章中最常見的詞語及次數

本篇以英語爲例,如果涉及到中文詞語的統計,可以使用第三方jieba庫,對中文詞語的統計有着很大的效果。

3. 函數準備

本題通過一個函數用來打開文本,另一個函數用來處理文本,最後進行輸出,整個程序完成。

4. 編寫步驟

4.1 打開文本

本文以python之禪爲例,在IDLE中輸入import this即可獲得全文。

def gettxt():
    txt = open("The Zen of Python.txt",'r').read()		#注意:因爲py文件和txt放在同一目錄,故文件名前不加地址,若py文件和txt放在不同文件夾,則需要地址前綴
    txt = txt.lower()			#將全文字母小寫
    for s in '!"#$%^&*()[]{},./;<>:"|\_*-+':		#去掉特殊符號
        txt = txt.replace(s," ")		#將特殊符號替換爲空格
    return txt

下面介紹一下open()函數,open函數的語法規則如下:

file object = open(文件名 [, 打開方式][, 是否寄存])

打開方式的幾個常見模式

模式 描述
r 以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認模式。
r+ 打開一個文件用於讀寫。文件指針將會放在文件的開頭。
a 打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該文件不存在,創建新文件進行寫入。
a+ 打開一個文件用於讀寫。如果該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。如果該文件不存在,創建新文件用於讀寫。
w 打開一個文件只用於寫入。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。
w+ 打開一個文件用於讀寫。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。
模式 r r+ w w+ a a+
* * * *
* * * * *
創建 * * * *
覆蓋 * *
指針在開頭 * * * *
指針在結尾 * *

4.2 處理文本

ztxt = gettxt()
words = ztxt.split()	#文本以默認方式分開,大多是以空格隔開,如果以特定方式,可以對split(sep='')中sep進行定義
counts = {}				#創建counts的字典
for word in words:
    counts[word] = counts.get(word,0) + 1	#對words進行遍歷,get函數的意義是鍵存在返回相應值,否則返回默認值0,所以在遍歷過程中,原先有過的再次出現會加1,而第一次出現的則是默認值,而後再加1 
items = list(counts.items())		#將counts中所有的鍵值對以列表的形式返回到items中
items.sort(key = lambda x:x[1], reverse = True)		#這是sort函數和lambda函數的一次配合
for i in range (10):
    word,count = items[i]
    print('{0:<10}{1:>5}'.format(word,count))	#格式化輸出

下面對於sort()函數進行介紹:
sort() 函數用於對原列表進行排序,語法格式如下:

list.sort(key=None, reverse=False)

key — 主要是用來進行比較的元素,只有一個參數,具體的函數的參數就是取自於可迭代對象中,指定可迭代對象中的一個元素來進行排序。

reverse — 排序規則,reverse = True 降序, reverse = False 升序(默認)

在上例中,就是sort()函數與lambda函數的一次配合,sort()函數進行排列,lambda函數就行對排列方式的解釋,所謂x:x[1],就是取items列表中元素的第二位,也就是出現次數進行排序,從而做到一種將單詞的出現次數按倒序排列後選擇的目的。

5. 整體代碼

def gettxt():
    txt = open("The Zen of Python.txt",'r').read()
    txt = txt.lower()
    for s in '!"#$%^&*()[]{},./;<>:"|\_*-+':
        txt = txt.replace(s," ")
    return txt
ztxt = gettxt()
words = ztxt.split()
counts = {}
for word in words:
    counts[word] = counts.get(word,0) + 1
items = list(counts.items())
items.sort(key = lambda x:x[1], reverse = True)
for i in range (10):
    word,count = items[i]
    print('{0:<10}{1:>5}'.format(word,count))

6. 運算結果

is           10
better        8
than          8
the           6
to            5
of            3
although      3
never         3
be            3
one           3

7. 小結

這纔是只是第一步,還可以根據需要對有些詞經行取捨,另外在英語中’m,'re,‘s之類出現比較多,還可以通過替換將它們歸結於am,are,is之類,還有更加廣闊的空間可以探索!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章