在文本處理中,我們經(jīng)常需要對(duì)文本中的單詞出現(xiàn)頻率做一個(gè)統(tǒng)計(jì),本文以英文小說《瓦爾登湖》為例,統(tǒng)計(jì)一下作者最喜歡用什么單詞,他們各自的出現(xiàn)頻率如何。
首先需要《瓦爾登湖》的文本:點(diǎn)擊下載《瓦爾登湖》(https://pan.baidu.com/s/1o75GKZ4)
思路分析:
- 首先,要打開文件,把里面的內(nèi)容寫到字符串里面。
- 接著,要對(duì)字符串進(jìn)行分詞,分割成獨(dú)立的單詞。
- 最后,根據(jù)每個(gè)單詞進(jìn)行詞頻統(tǒng)計(jì)。
把下載好的“Walden.txt”放到桌面,復(fù)制一下完整的路徑名,特別注意:
Windows系統(tǒng)下,默認(rèn)的文件名路徑子級(jí)和父級(jí)之間可能是用反斜杠“ \?”表示的,而在Python中,子級(jí)和父級(jí)之間用正斜杠“ / ”表示。
文件打開的時(shí)候,如果出現(xiàn)以下錯(cuò)誤:
UnicodeDecodeError: 'gbk' codec can't decode byte 0xbf in position 2: illegal multibyte sequence
說明文件編碼格式異常,解決辦法:在文件打開的語句中添加 encoding = '?utf-8 ',注意添加在open( )函數(shù)的最后。
with open(path,'r') as text:
# 添加utf-8編碼支持,原語句改為:
with open(path,'r',encoding='utf-8') as text:
使用stringlist.split()函數(shù)進(jìn)行分詞,使用stringlist.count()函數(shù)進(jìn)行統(tǒng)計(jì)詞頻
代碼如下:
path = 'C:/Users/xiaokai/Desktop/Walden.txt'
with open(path,'r',encoding='utf-8') as text: # 讀入文本
words = text.read().split() # 開始分詞
print(words)
for word in words:
print('{}--{} times'.format(word,words.count(word))) # 把單詞和詞頻分別打印出來
?運(yùn)行結(jié)果
tried.--1 times
Whatever--4 times
have--660 times
been--167 times
thy--23 times
failures--3 times
hitherto,--1 times
"be--1 times
分析問題:
發(fā)現(xiàn)輸出有點(diǎn)怪異,出現(xiàn)了 “tried. ”,“hitherto,” 這樣的單詞,還有更多的問題:
- 單詞前后跟了“,”,“.”,“?”等各種各樣的符號(hào)。
- 有許多單詞被重復(fù)統(tǒng)計(jì)了。
- 有一些單詞,例如‘“Some”和“some”是同一個(gè)單詞,但是因?yàn)椤癝ome”首字母大寫也被認(rèn)為是兩個(gè)單詞。
因此作出更多的改進(jìn):
- 去掉首尾連在一起的字符串,并且全部轉(zhuǎn)換成小寫字母。
- 創(chuàng)建一個(gè)單詞集合,集合的性質(zhì)保證了不會(huì)出現(xiàn)重復(fù)的單詞,確保不會(huì)出現(xiàn)重復(fù)統(tǒng)計(jì)單詞的現(xiàn)象。
- 創(chuàng)建一個(gè)字典,key為文本里出現(xiàn)的單詞,value為單詞在文本中出現(xiàn)的頻率。
- 在字典中,根據(jù)詞頻順序打印鍵值對(duì)。
改進(jìn)之后的代碼如下:
import string
with open(path,'r',encoding='utf-8') as text:
# 1. 首先進(jìn)行分詞
raw_words = text.read().split()
# 2. 把每個(gè)單詞首尾連在一起的符號(hào)去掉,大寫字母統(tǒng)一成小寫
words_list = [word.strip(string.punctuation).lower() for word in raw_words]
# 3. 數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換成集合,這里重復(fù)的單詞會(huì)被自動(dòng)丟棄
words_set = set(words_list)
# 4. 創(chuàng)建字典鍵值對(duì):key為單詞,value為單詞出現(xiàn)的頻率
# 冒號(hào)左邊為單詞,冒號(hào)右邊為詞頻
words_dict = {keyword:words_list.count(keyword) for keyword in words_set}
# 5. 根據(jù)words_dict中value的值對(duì)字典進(jìn)行排序輸出
# 這里采用了lambda表達(dá)式,lambda word: word[1]表示輸入一個(gè)word詞條,返回word[1](詞頻)
# word是一個(gè)詞條,word[0]是單詞,word[1]是單詞出現(xiàn)的頻率
for word in sorted(words_dict.items(), key = lambda word: word[1], reverse = True):
print('{}--{} times'.format(word[0],word[1]))
代碼解釋:
- strip()函數(shù)的作用是去除單詞首尾的符號(hào),其中string.punctuation就是一個(gè)字符集,包含!@#¥%&*等符號(hào),使用strip(string.punctuation)可以去除首尾的這些符號(hào)。
- word.lower()函數(shù)把字母全部轉(zhuǎn)換成小寫。
- sorted()函數(shù)對(duì)字典進(jìn)行排序,默認(rèn)對(duì)key進(jìn)行排序,但這里對(duì)value進(jìn)行排序,所以這里使用lambda表達(dá)式,在key = lambda word: word[1]中,返回值是word[1],也就是words_dict中的value。
參考博客:
Python strip()方法 | 菜鳥教程
http://www.runoob.com/python/att-string-strip.html
python字典按照value進(jìn)行排序 - ketchup_醬 - 博客園
https://www.cnblogs.com/timtike/p/6562402.html
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
