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中給出的對映來進行對映 。