1. 题目:任一个英文的纯文本文件,统计其中的单词出现的个数。
2. 对于编程问题,解决思路即IPO,确定输入(Input)、处理(Process)、输出(Output)
3. 按照该思路,这题目解决流程如下:
4. 按照以上思路
(1)对数据进行处理,主要包括清除非字符内容、统一大小写、确定分隔符
这部分编程内容就应该包括**文件操作**、**字符替换**、**单词分隔**;
涉及到的方法包括f.open()、f.close()、string.split()、string.replace()等
(2)对清理后的数据进行词频统计
对文本中单词统计,即记录下每个单词在文本中出现的词数。对单词统计,首先想到了for循环和列表。这样可以实现,但当时考虑到第n个单词进来时,要与前面n-1个单词进行对比,效率低下。因此考虑用字典。
(3)输出统计结果。这个没什么难度。
5. 上代码
def getText():
#定义getText函数,对文件清洗并获取文件
txt=open("Test_text.txt",'r').read()
txt=txt.lower()
for ch in ',:-"':
txt=txt.replace(ch," ")
return txt
test=getText()
words=test.split()
counts={}
#用字典及for循环统考每个单词个数,并保存到字典的value中。
for word in words:
counts[word]=counts.get(word,0)+1
#根据字典中value进行排序
seq=sorted(counts.items(),key=lambda x:x[1],reverse=True)
#打印出频率最高的前五个
for i in range(5):
print(seq[i])
6.代码知识解读
(1)首先解读单词统计
counts={}
for word in words:
counts[word]=counts.get(word,0)+1
这段代码运用了字典去统计每个单词在文本中出现的次数,用到了字典两个特性:
- 字典中键的唯一性。用单词作键,用次数作值。则完成了统计。
- 字典的get方法。dict.get(key, default=None),返回指定键的值,并且能够给值提供默认值。
(2)单词次数的排序
#根据字典中value进行排序
seq=sorted(counts.items(),key=lambda x:x[1],reverse=True)
#打印出频率最高的前五个
for i in range(5):
print(seq[i])
排序中用到了3个知识点
- 字典的items方法,
dict.items(),以列表返回可遍历的(键, 值) 元组数组。通过items方法,可以对字典的值进行排序,并返回键值对元组。
- sorted方法
sorted(iterable,key,reverse)
iterable 待排序的可迭代对象,由于该参数要求为可迭代对象,因此用了items方法
key 对应的是个函数, 该函数用来决定选取用哪些值来进行排序,此处运用了lambda函数
reverse 反转排序
- lambda函数,即匿名函数
lambda的语法形式如下:
lambda arg1, arg2, …, argN : expression
在上面的代码中,用x即字典作参数,用值作表达式,返回值。
(“心心在一艺,其艺必工;心心在一职,其职必举”)