1. 程式人生 > >python之統計句子中的詞頻

python之統計句子中的詞頻

一:題目要求

對於一個已分詞的句子(可方便地擴充套件到統計檔案中的詞頻):

我/是/一個/測試/句子/,/大家/趕快/來/統計/我/吧/,/大家/趕快/來/統計/我/吧/,/大家/趕快/來/統計/我/吧/,/重要/事情/說/三遍/!

可以用collections模組中的Counter()函式方便地統計詞頻,例如可用如下程式碼:

import collections
import copy
s = "我/是/一個/測試/句子/,/大家/趕快/來/統計/我/吧/,/大家/趕快/來/統計/我/吧/,/大家/趕快/來/統計/我/吧/,/重要/事情/說/三遍/!/"
s_list = s.split('/') 
# 為避免迭代時修改迭代物件本身,建立一個列表的深拷貝,也可用s_list_backup = s_list[:]
s_list_backup = copy.deepcopy(s_list)
[s_list.remove(item) for item in s_list_backup if item in ',。!”“']
collections.Counter(s_list)
這個問題也可以通過字典來解決,請編寫用字典解決本問題的程式,為便於OJ系統自動判斷,程式最後輸出某個單詞的詞頻。

程式參考框架

def countfeq(s):
   ... ...
   return a dict
    
if __name__ == "__main__":
   s = "Not clumsy person in this world, only lazy people, only people can not hold out until the last."
   s_dict = countfeq(s.lower())
   word = input()
   基於s_dict判斷word的詞頻並輸出(可能是0次)

輸入格式:字串
輸出格式:整數

輸入樣例(因為oj系統限制,測試用例設為判斷英文單詞個數(不區分大小寫,全部轉換成小寫字元處理),請注意英文標點,假設僅包含,和.):not
輸出樣例:2

二:程式碼實現

'''方法一:字典實現'''
import string
def countfeq(s):
   s=s.split()
   s_dict={}
   for i in s:
       if i in s_dict.keys():
           s_dict[i]+=1
       else:
           s_dict[i]=1
   return s_dict
    
if __name__ == "__main__":
   s = "Not clumsy person in this world, only lazy people, only people can not hold out until the last."
   table=s.maketrans(string.punctuation,' '*len(string.punctuation))
   s=s.translate(table)
   s_dict = countfeq(s.lower())
   word = input()
   if word in s_dict.keys():
       print(s_dict[word])
   else:
       print(0)
  
    
'''方法二:簡便運算'''   
import string
import collections
def countfeq(s):
   s=s.split()
   s_dict=collections.Counter(s)
   return s_dict
    
if __name__ == "__main__":
   s = "Not clumsy person in this world, only lazy people, only people can not hold out until the last."
   table=s.maketrans(string.punctuation,' '*len(string.punctuation))
   s=s.translate(table)
   s_dict = countfeq(s.lower())
   word = input()
   if word in s_dict.keys():
       print(s_dict[word])
   else:
       print(0)

三:總結

此題比較簡單,重點在於如何對字串的標點符號進行處理。

(1)在python中,想要對字串s進行分割,通常使用s.split(str)函式,str表示以str為界限進行分割。如果想要以一個或多個空格作為分割符,直接使用s.split()即可。

(2)處理標點符號的常用程式碼為:

import string
s = "Not clumsy person in this world, only lazy people, only people can not hold out until the last."
table=s.maketrans(string.punctuation,' '*len(string.punctuation))
s=s.translate(table)
print(s)

其中str.maketrans(str1,str2)是字串替換方法,和str.replace(str1,str2)方法的功能相同,都是用str2來替換字串str中的str1。區別在於replace方法不要求str1和str2的長度,而maketrans方法要求str1和str2的長度必須相同。

maketrans() 方法用於建立字元對映的轉換表,對於接受兩個引數的最簡單的呼叫方式,第一個引數是字串,表示需要轉換的字元,第二個引數也是字串表示轉換的目標。

maketrans()方法語法:

str.maketrans(intab, outtab)

引數

  • intab -- 字串中要替代的字元組成的字串。
  • outtab -- 相應的對映字元的字串。

返回值

返回字串轉換後生成的新字串。

str.translate(table)方法是根據引數table給出的表(包含 256 個字元)轉換字串的字元,要過濾掉的字元放到 deletechars 引數中。

translate()方法語法:

str.translate(table)
bytes.translate(table[, delete])    
bytearray.translate(table[, delete]) 

引數

  • table -- 翻譯表,翻譯表是通過 maketrans() 方法轉換而來。
  • deletechars -- 字串中要過濾的字元列表。

返回值

返回翻譯後的字串,若給出了 delete 引數,則將原來的bytes中的屬於delete的字元刪除,剩下的字元要按照table中給出的對映來進行對映 。

【注】對上述兩個方法的詳細解釋可參考 菜鳥教程 maketranstranslate