Python练习册 第 0006 题:你有一个目录,放了你一个月的日记,都是 txt,为了避免分词的问题,假设内容都是英文,请统计出你认为每篇日记最重要的词。

笔者最近初接触Python语言,在做一些简单的刷题练习。本题是来自Show me the code的习题。

第 0006 题:你有一个目录,放了你一个月的日记,都是 txt,为了避免分词的问题,假设内容都是英文,请统计出你认为每篇日记最重要的词。

题目如上,鉴于目前网上的答案难找且质量参差不齐,在本文中,笔者尝试着从一个Python新手的角度给出具体的分析思路、实现方法细节及实现代码。

简单分析题目可知,可以把整个程序设计分为以下两个部分来完成:

函数1:遍历目标目录下的所有文件,对于每个txt文件调用函数2统计单词,输出结果。

函数2:对传入的txt文件进行单词计数统计,返回最高频使用的词及其出现次数。

可以看出本题的重点在于函数2的实现。

下面重点分析一下函数2的实现:

1.从txt文件中读出文章内容后,因文章中单词大小写不一,不方便后续处理,使用 string.lower() 方法,将文章内容统一小写化

2.使用 re.findall() 方法进行正则表达式匹配,值得注意的是 re.findall() 方法匹配后会返回一个由文章所有词组成的列表,且重复出现的单词不会被去重

3.使用 list.Counter() 方法对列表中单词出现次数进行排序,会返回一个单词—出现次数一一键值对应的字典

4.排除一些代词、冠词的干扰,即代码中使用stop_word进行的过滤词

5.使用 Counter.most_common() 方法对字典中的词按值排降序,会返回一个由许多元组所组成的列表,按值的大小依次降序排列


大概使用的一些方法就分析到这儿,下面贴上我的代码:

# -*- coding: utf-8 -*-
'''
第 0006 题:你有一个目录,放了你一个月的日记,都是 txt,为了避免分词的问题,
假设内容都是英文,请统计出你认为每篇日记最重要的词。
'''

'''
思路分析:可以把整个程序设计分为以下两个部分来完成:
函数1:遍历目标目录下的所有文件,对于每个txt文件调用函数2统计单词,输出结果
函数2:对传入的txt文件进行单词计数统计,返回最高频使用的词及其出现次数
	本题的重点在于函数2的实现。
'''

from collections import Counter
import re
import string
import os

def get_word(txtFile):
	'''
	从一个txt文件中找出出现次数最高的词及其对应次数,以元组形式返回
	'''
	#过滤词
	stop_word = ['the', 'in', 'of', 'and', 'to', 'has', 'that', 'this','s', 'is', 'are', 'a', 'with', 'as', 'an']
	
	f = open(txtFile, 'r')
	content = f.read().lower()
	
	pat = '[a-z0-9\']+'
	words = re.findall(pat, content)
	wordList = Counter(words)
	for i in stop_word:
		wordList[i] = 0

	f.close()
	return wordList.most_common()[0]


def traverseFile (path):
	'''
	遍历路径文件夹中的所有文件,并调用get_word函数,输出统计结果
	'''
	for txtName in os.listdir(path):
		txtFile = os.path.join(path, txtName)
		#调用get_word函数
		most_important = get_word(txtFile)
		print most_important[0] + ' is the most important word in the essay:' + txtName
		print 'the using times of ' + most_important[0] + "is:" + repr(most_important[1])
		print ""


if __name__ == "__main__":
	traverseFile (r'D:\notes\python26Q\06test')


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值