20200917-2 词频统计
此作业要求参见: [https://edu.cnblogs.com/campus/nenu/2020Fall/homework/11206]
一、功能实现
老五在寝室吹牛他熟读过《鲁滨逊漂流记》,在女生面前吹牛热爱《呼啸山庄》《简爱》和《飘》,在你面前说通读了《战争与和平》。但是,他的四级至今没过。你们几个私下商量,这几本大作的单词量怎么可能低于四级,大家听说你学习《构建之法》,一致推举你写个程序名字叫wf,统计英文作品的单词量并给出每个单词出现的次数,准备用于打脸老五。
希望实现以下效果。以下效果中数字纯属编造。
功能1 小文件输入
重难点:
(1) 考查文件读取模块open()函数的使用;
(2) 计算单词个数的时候,将读入的单词用split()函数将单词与符号分隔开;
(3) Python文件转换为可执行文件流程不熟悉,花费了较长时间。
核心代码:
#!/usr/bin/env python3
#-*- coding:utf-8 -*-
import sys
import re
import collections
import operator
import glob
file_name='F:\\研究生\\研究生作业\\构建之法作业\\第二次\\text.txt'
total=0
file=open(file_name,"r") #open函数打开文件,str为文件名,'r'代表只读
for line in file.readlines():#读取行
w = line.split(' ') #空格为分隔符分割每行的单词,并返回字符串列表
total=total + len(w) #计算单词总数
print ("total ",total) #总数结果打印
print('\n')
#相同单词出现次数
patt = re.compile("\w+") #正则表达式
counter = collections.Counter(patt.findall(
open(file_name,'rt').read()
))
for word, show in counter.most_common(): #用word变量记录单词,用show变量记录单词出现的频数,返回一个topn列表,其中不对counter.most_common(n)的n指定参数,返回所有元素
print (word, show)
运行截图:
功能2 支持命令行输入英文作品的文件名,请老五亲自录入。
重难点:
(1) 命令行参数发生变化,需要从控制台读入文件参数,进行运算;
(2) 数据量比较大,最初用C语言进行尝试,库函数较少,且遇到数据量较大的文件,就会导致程序崩溃,根据同学建议,换用python语言进行尝试实现了功能。
核心代码:
#!/usr/bin/env python3
#-*- coding:utf-8 -*-
import sys
import re
import collections
import operator
import glob
def funtion_2(file_name):
#file_name='F:\\研究生\\研究生作业\\构建之法作业\\第二次\\text.txt'
total=0
file=open(file_name,"r") #open函数打开文件,str为文件名,'r'代表只读
for line in file.readlines():#读取行
w = line.split(' ') #空格为分隔符分割每行的单词,并返回字符串列表
total=total + len(w) #计算单词总数
print ("total ",total) #总数结果打印
print('\n')
#相同单词出现次数
patt = re.compile("\w+") #正则表达式
counter = collections.Counter(patt.findall(
open(file_name,'rt').read()
))
for word, show in counter.most_common(): #用word变量记录单词,用show变量记录单词出现的频数,返回一个topn列表,其中不对counter.most_common(n)的n指定参数,返回所有元素
print (word, show)
a=input("输入文件路径:\n")
funtion_2(a)
m=input("输入回车结束")
运行截图:
功能3 支持命令行输入存储有英文作品文件的目录名,批量统计。
重难点:
(1) 和功能二命令行区别在于,输入命令行参数的时候,输入的是文件夹,而不是文件处理和功能二命令行参数之间的区别;
(2) 需要根据文件夹的名字找到文件,并且进行词频统计。
核心代码:
#!/usr/bin/env python3
#-*- coding:utf-8 -*-
import sys
import re
import collections
import operator
import glob
def file_read(str):
#str=str+ '.txt' #用于读取文件并返回分词之后的单词列表
f = open(str,'r',-1,'utf-8','ignore',None,True,None)
tet = f.read().lower()
text = tet.replace('\n',' ').replace('.',' ').replace(',',' ').\
replace('!',' ').replace('\\',' ').replace('#',' ').\
replace('[',' ').replace(']',' ').replace(':',' ').\
replace('?',' ').replace('-',' ').replace('\'',' ').\
replace('\"',' ').replace('(',' ').replace(')',' ').\
replace('—',' ').replace(';',' ').split()
count_dict = {}
for str in text:
if str in count_dict.keys():
count_dict[str] = count_dict[str] + 1
else:
count_dict[str] = 1
count_list=sorted(count_dict.items(),key=lambda x:x[1],reverse=True)
f.close()
return count_list #返回的分词列表
#对分完词之后的列表进行计算total、词频、输出等操作
def get_words(argv,flag):
if len(argv) == 2: #如果有两个命令行参数
try:
list = file_read(argv[-1])
opts, args = getopt.getopt(argv,"sh",["ifile","ofile"])
except getopt.GetoptError:
print("test.py -i <inputfile> -o <outputfile>")
sys.exit(2)
for opt,arg in opts:
if opt == "-s": #如果第一个参数是-s
num = len(list)
print('total',num)
print('\n')
for word in list:
print('{:20s}{:>5d}{}'.format(word[0],word[1],'\n'))
elif opt == "-h":
print("please input the parameter")
elif len(argv) == 1: #如果有一个命令行参数
pattern = re.compile('.+\.txt')
folder_name = argv[-1]
m = re.findall(pattern,folder_name)
if len(m) != 0: #参数以.txt结尾,为文件名,直接执行词频操作
list = file_read(argv[-1])
if flag == 0: #标志位为0,把所有单词都列出来
print('total',len(list))
print('\n')
for item in list:
print('{:20s}{:>5d}{}'.format(item[0],item[1],'\n'))
else: #标志位不为0,只列出前十
print('total',len(list), 'words')
print('\n')
if len(list) > 10:
for i in range(10):
print('{:20s}{:>5d}'.format(list[i][0],list[i][1]))
else: #如果本身不超过10个单词量,则列出所有单词即可
for item in list:
print('{:20s}{:>5d}'.format(item[0],item[1]))
else:
os.chdir(folder_name) #文件夹操作
filename_list = os.listdir()
for file_name in filename_list:
print(file_name[:-4] + '\n')
file_list = [file_name]
get_words(file_list,1) #得到文件名,进行递归操作,标志位置1,说明要取前10
print('----\n')
def main(argv):
get_words(argv,0)
if __name__ == "__main__":
main(sys.argv[1:])
运行截图:
功能4 从控制台读入英文单篇作品,这不是为了打脸老五,而是为了向你女朋
友炫酷,表明你能提供更适合嵌入脚本中的作品(或者如她所说,不过是更灵活
的接口)。如果读不懂需求,请教师兄师姐,或者 bing: linux 重定向,尽管
这个功能在windows下也有,搜索关键词中加入linux有利于迅速找到。
重难点:
功能就没有成功实现。难点在于,对于Linux中重定向相关的的内容一无所知,经过查找资料,只是浅层了解了相关知识,比如:在linux重定向中,”<”符号的作用是标准输入,”>” 符号的作用是标准输出。
二、PSP表格