1. 问题背景
日常生活中,我们总能碰到一些需要我们统计词数或者文本类型的情况,今天我们我们要看看python中的对文本词频的统计。
2. 问题前准备
采用字典解决问题,该问题的IPO如下:
输入:从文件中读取一篇文章
处理:采用字典结构进行统计
输出:文章中最常见的词语及次数
本篇以英语为例,如果涉及到中文词语的统计,可以使用第三方jieba库,对中文词语的统计有着很大的效果。
3. 函数准备
本题通过一个函数用来打开文本,另一个函数用来处理文本,最后进行输出,整个程序完成。
4. 编写步骤
4.1 打开文本
本文以python之禅为例,在IDLE中输入import this
即可获得全文。
def gettxt():
txt = open("The Zen of Python.txt",'r').read() #注意:因为py文件和txt放在同一目录,故文件名前不加地址,若py文件和txt放在不同文件夹,则需要地址前缀
txt = txt.lower() #将全文字母小写
for s in '!"#$%^&*()[]{},./;<>:"|\_*-+': #去掉特殊符号
txt = txt.replace(s," ") #将特殊符号替换为空格
return txt
下面介绍一下open()
函数,open函数的语法规则如下:
file object = open(文件名 [, 打开方式][, 是否寄存])
打开方式的几个常见模式
模式 | 描述 |
---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
模式 | r | r+ | w | w+ | a | a+ |
---|---|---|---|---|---|---|
读 | * | * | * | * | ||
写 | * | * | * | * | * | |
创建 | * | * | * | * | ||
覆盖 | * | * | ||||
指针在开头 | * | * | * | * | ||
指针在结尾 | * | * |
4.2 处理文本
ztxt = gettxt()
words = ztxt.split() #文本以默认方式分开,大多是以空格隔开,如果以特定方式,可以对split(sep='')中sep进行定义
counts = {} #创建counts的字典
for word in words:
counts[word] = counts.get(word,0) + 1 #对words进行遍历,get函数的意义是键存在返回相应值,否则返回默认值0,所以在遍历过程中,原先有过的再次出现会加1,而第一次出现的则是默认值,而后再加1
items = list(counts.items()) #将counts中所有的键值对以列表的形式返回到items中
items.sort(key = lambda x:x[1], reverse = True) #这是sort函数和lambda函数的一次配合
for i in range (10):
word,count = items[i]
print('{0:<10}{1:>5}'.format(word,count)) #格式化输出
下面对于sort()
函数进行介绍:
sort() 函数用于对原列表进行排序,语法格式如下:
list.sort(key=None, reverse=False)
key — 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse — 排序规则,reverse = True 降序, reverse = False 升序(默认)
在上例中,就是sort()函数与lambda函数的一次配合,sort()函数进行排列,lambda函数就行对排列方式的解释,所谓x:x[1],就是取items列表中元素的第二位,也就是出现次数进行排序,从而做到一种将单词的出现次数按倒序排列后选择的目的。
5. 整体代码
def gettxt():
txt = open("The Zen of Python.txt",'r').read()
txt = txt.lower()
for s in '!"#$%^&*()[]{},./;<>:"|\_*-+':
txt = txt.replace(s," ")
return txt
ztxt = gettxt()
words = ztxt.split()
counts = {}
for word in words:
counts[word] = counts.get(word,0) + 1
items = list(counts.items())
items.sort(key = lambda x:x[1], reverse = True)
for i in range (10):
word,count = items[i]
print('{0:<10}{1:>5}'.format(word,count))
6. 运算结果
is 10
better 8
than 8
the 6
to 5
of 3
although 3
never 3
be 3
one 3
7. 小结
这才是只是第一步,还可以根据需要对有些词经行取舍,另外在英语中’m,'re,‘s之类出现比较多,还可以通过替换将它们归结于am,are,is之类,还有更加广阔的空间可以探索!