此作业的要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2126
一、代码以及版本控制
项目代码:https://git.coding.net/qiaojingyu/count_words.git
使用git的客户端为: git push
二、重点/难点以及效果截图
1.功能一——小文件输入
(1)难点:将标点符号替换成空格
#对文本的每一行计算词频的函数 def processLine(line,wordCounts): #将标点符号替换成空格 line = replaceLine(line) words = line.split() for word in words: if word in wordCounts: wordCounts[word]+=1 else: wordCounts[word]=1 def replaceLine(line): for ch in ' .,"' : line = line.replace(ch,' ') return line
(2)重点:读文件,并计算词频。我在这个功能的实现上采用了将单词存入字典,根据空格数计算词频。sort()排序之后,从序列末尾开始输出。
wordCounts={} for line in infile: processLine(line.lower(), wordCounts) pairs = list(wordCounts.items()) #记录总数 print("total : %d "% len(pairs)) #列表中的数据对交换位置,数据对排序 items = [[a,b]for (b,a)in pairs] items.sort() #因为sort()函数是从小到大排列,所以range是从最后一项开始取 for i in range(len(items) - 1, -1 , -1): print(items[i][1] + " " + str(items[i][0])) data.append(items[i][0]) words.append(items[i][1]) infile.close()
(3)执行效果
2.功能二——大文件词频统计
(1)重点:相对于功能一,功能二对于筛选单词的条件更多,通过观察对比,需要将以下符号转化为空格进行单词量的计算:“, . ! ? ; " —— ”
...
if lastchar in [",", ".", "!", "?", ";", '"',"——"]: word2 = word1.rstrip(lastchar) word1 = word2 else: word2 = word1 break
...
(2)难点:由于文件过大,我采用的是分块计算,建立两个字典分别计算,最后累加。
#定义文件读取函数,并且输出元素为词频的字典 def readFile(file_name): y = [] with open(file_name, 'r',encoding="utf-8") as f: x=f.readlines() for line in x: y.extend(line.split()) word_list2 = [] # 单词格式化:去掉分词之后部分英文前后附带的标点符号 for word in y: # last character of each word word1 = word # use a list of punctuation marks while True: lastchar = word1[-1:] if lastchar in [",", ".", "!", "?", ";", '"',"-","*"]: word2 = word1.rstrip(lastchar) word1 = word2 else: word2 = word1 break while True: firstchar = word2[0:] if firstchar in [",", ".", "!", "?", ";", '"',"-","*"]: word3 = word2.lstrip(firstchar) word2 = word3 else: word3 = word2 break # build a wordList of lower case modified words word_list2.append(word3) #统计词频 tf = {} for word in word_list2: word = word.lower() # print(word) word = ''.join(word.split()) if word in tf: tf[word] += 1 else: tf[word] = 1 return tf def get_counts(words): tf = {} for word in words: word = word.lower() # print(word) word = ''.join(word.split()) if word in tf: tf[word] += 1 else: tf[word] = 1 #合并两个字典 def merge2(dic1, dic2): from collections import Counter counts = Counter(dic1) + Counter(dic2) return counts
(3)代码效果
3.功能三——实现文件夹下文件词频统计
(1)重点&难点:提取文件夹中文件类型为.txt的文件。输出文件名,并存入列表。之后循环调用功能二中的函数。
lists = [] for i in os.listdir("..\count_words"): if os.path.splitext(i)[1] == ".txt": print(i) lists.append(i)
(2)执行效果
4.功能四——重定向输入输出(未实现)
Windows命令提示符中执行Python脚本时,命令行无需以"python"开头,系统会根据脚本后缀自动调用Python解释器。已经能理解重定向的意思,但是实践起来还是有一定难度的。
三、PSP表格
预计花费时间 |
实际花费时间 |
花费时间差距 |
原因 |
|
功能一 |
60min |
96min |
36min |
对replace()方法运用不熟练,一直在修正”.”也被读成单词的问题;对题目理解有误,加入了写文件的功能,通过老师与其他同学的对话了解题目后删除了该功能。 |
功能二 |
180min |
339min |
159min |
读大文件的时候,经常是数据不准确,有很多标点字符没有考虑到,不断的从word中查找各种标点字符造成数据不准确的可能性。 |
功能三 |
120min |
232min |
112min |
在网上搜索如何读取文件夹中的文件,以及如何循环对文件进行词频统计。 |
功能四 |
60min |
107min |
47min |
对于重定向还是不了解,花了很多时间去理解概念以及去完成相应的功能。但是前期进度太慢导致没有完成。 |