python中最最基础的两个实例——第二弹

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+打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
模式rr+ww+aa+
****
*****
创建****
覆盖**
指针在开头****
指针在结尾**

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之类,还有更加广阔的空间可以探索!

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值