python之统计句子中的词频

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39579290/article/details/83957218

一:题目要求

对于一个已分词的句子(可方便地扩展到统计文件中的词频):

我/是/一个/测试/句子/,/大家/赶快/来/统计/我/吧/,/大家/赶快/来/统计/我/吧/,/大家/赶快/来/统计/我/吧/,/重要/事情/说/三遍/!

可以用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

猜你喜欢

转载自blog.csdn.net/qq_39579290/article/details/83957218