韩昊20190912-3 词频统计
此作业的要求参见[https://edu.cnblogs.com/campus/nenu/2019fall/homework/6583]
词频统计 SPEC 20180918
一、代码以及版本控制
代码地址:https://e.coding.net/hanhao/count_words.git
使用语言:python
使用git的客户端为: git push
二、重点/难点以及效果截图
功能1 小文件输入。 为表明程序能跑,结果真实而不是迫害老五,请他亲自键
盘在控制台下输入命令。
重点/难点 :
(1)如何将py文件转化为exe文件
附上教程:https://www.cnblogs.com/hanhao970620/p/11537088.html
(2)英文字符的冗余校验和删除,解决办法是将字符等替换成空格
重要代码展示:
删除冗余字符:
def deal_Redundantwords(string):
string = string.replace('\n', ' ').replace(',', ' ')
s1 = list(string)
num = len(s1)
s1.append(' ')
for i in range(num):
if s1[i] in '."?\')-(;#$%&*!':
#isalnum检测字符串是否有数组组成
if str(s1[i - 1].isalnum()) == 'True' and (str(s1[i + 1].isalnum()) == 'True'):
pass
else:
s1[i] = ' '
for i in range(num):
if s1[i] in ':':
if s1[i + 1] == '/':
pass
else:
s1[i] = ' '
#join连接字符数组
s = ''.join(s1)
# print(s)
return s
实现功能一:
list1 = text.replace('\n', ' ').lower().split() # 保存原始数据
list2 = list(set(list1)) # 去重之后的数据
if (flag == 0):
print("total " + str(len(list2))) # 小文本统计词汇量(功能1不输出words)
else:
print("total " + str(len(list2)) + " words") # 统计词汇量
print("\n")
dir_a = {} # 计算频数
for str1 in list1:
if str1 != ' ':
if str1 in dir_a.keys():
dir_a[str1] = dir_a[str1] + 1
else:
dir_a[str1] = 1
dir_b = sorted((dir_a).items(), key=lambda x: x[1], reverse=True) # 按照频数排序
执行效果截图:
得意、突破、困难的地方 ;
函数的了解程度:对isalnum(),jion()函数没有认知,导致在检测字符串和连接字符串过程中进行的十分困难。
冗余函数的定义:在项目中,我将去除冗余字符单独定义成一个函数,可以项目中四个功能反复调用,大大简化了程序。
功能2 支持命令行输入英文作品的文件名,请老五亲自录入。
重点/难点 :读文件,使用open函数(open(filename,mode,buffering,encoding)方法),将单词存入字典根据空格数计算词频
重要代码展示:
try:
with open(filename, 'r', encoding='UTF-8') as f_obj:
content = f_obj.read()
countNumber(content, flag)
except FileNotFoundError:
msg = "sorry,the file " + filename + " does not exist."
print(msg)
执行效果截图:
得意、突破、困难的地方 :
大文件:对大文件的筛选难度要明显高于功能一的小文件,不过python中read,open函数起了很大作用。
功能3 支持命令行输入存储有英文作品文件的目录名,批量统计。
重点/难点 :
(1)由于没有接触过批量读取文件中所在文档,所以导致耗时巨大。
(2)提取文件夹中类型为.txt文件,输入文件名,并存入列表。
重要代码展示:
找文件:
path = os.listdir(os.getcwd()) # 获取当前目录下所有文件
folderList = []
for p in path:
if os.path.isdir(p): # 找到所有文件夹
读文件:
for folder in folderList:
if textFolder == folder:
path1 = os.listdir(folder) # 该文件夹下所有文件建成列表
for i in path1:
if os.path.splitext(i)[1] == '.txt':
fileNameList.append(os.path.splitext(i)[0])
执行效果截图:
得意、突破、困难的地方 :
函数的调用:对os.path函数和splitext()的理解和调用解决的获取文件路径和分离文件后缀的问题,而这些函数在本项目前我并不了解。
功能4 :从控制台读入英文单篇作品,这不是为了打脸老五,而是为了向你女朋
友炫酷,表明你能提供更适合嵌入脚本中的作品(或者如她所说,不过是更灵活
的接口)。
重点/难点 :
(1)对于重定向的理解和实践(这里对老师所提出的四大概念:命令行参数、重定向、标准输入、控制台进行了重新理解)
详细内容求参考:https://www.cnblogs.com/hanhao970620/p/11536985.html
(2)用户输入文件名或者文本内容 捕获问题。
重要代码展示:
elif sys.argv[1] == "-s":
if (len(sys.argv) == 3):
# print(sys.argv)
flag = 0
countFileWords(sys.argv[2], flag)
else:
# print(sys.argv) #重定向获取文件名
redirect_words = sys.stdin.read() # 存储文件名调用方法即可
flag = 0
countNumber(redirect_words, flag)
执行效果截图:
得意、突破、困难的地方 :
对重定向的的实践,'<'在重定向中的意义是标准输入,而使用input()方法可以获取输入内容。
三、PSP表格
总结:
初见作业时,我在很长一段时间内是崩溃的,因为完全无从下手。出于想要了解和尝试python的目的,决定首次使用python完成项目,进行过程中基本一直是处于一个边学边做的状态。本次项目不仅让我在一定意义上认识到了自我,同时也是对自己的一个很大提高。在不停的焦躁和崩溃同时,我算是想python走出了一小步。该项目完成要感谢很多人,老师,室友,包括大学本科同学等等。在完成项目的过程中,我了解并应用了isalnum()replace()os.listdir()等等等一系列python函数用法,并了解了重定向,命令行参数等相关概念。