笔者最近初接触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')