一、基本信息
编译环境:Python3.7
项目名称:词频统计——基本功能(结对编程)
作者:1613072036:谭琪
1613072037:张铭锐
项目Git地址:https://gitee.com/zmryy/PairProg/tree/SE036_037
二、项目分析
1.程序运行模块(方法、函数)介绍
Task1:基本任务
统计文件的有效行数并输出:
count = len(open(path, 'r').readlines()) print("行数:"+str(count))
统计文件的单词总数并输出:
def process_buffer(bvffer,stopwords): # 处理缓冲区,返回存放每个单词频率的字典word_freq if bvffer: # 下面添加处理缓冲区bvffer代码,统计每个单词的频率,存放在字典word_freq word_freq = {} words = [] wordmatch = "^[a-z]{4}(\w)*" #正则表达式至少以4个英文字母开头,跟上字母数字符号,单词以分隔符分割,不区分大小写 # 将文本内容都改为小写且去除文本中的中英文标点符号 for ch in '“‘!;:,.?”': bvffer = bvffer.lower().replace(ch, " ") for i in range(len(bvffer)): word = re.match(wordmatch, bvffer[i]) # 将正则表达式与列表中单词匹配 若匹配失败则返回NULL if word: # 匹配成功,加入words words.append(word.group()) #将匹配成功的单词放入words列表中 # strip()删除空白符(包括'/n', '/r','/t');split()以空格分割字符串 words = bvffer.strip().split() for word in words: if word not in stopwords: #判断列表中的单词是否出现在停词表中 将非停词表中的单词加入到字典word_freq中作为key word_freq[word]=word_freq.get(word,0)+1 print("总词数:"+str(len(words))) return word_freq
统计文件中各单词的出现次数,最终只输出频率最高的10个。频率相同的单词,优先输出字典序靠前的单词:
def output_result(word_freq,path): resultpath="D:\桌面\python_work\result.txt" count = len(open(path, 'r').readlines()) print("行数:"+str(count)) if word_freq: sorted_word_freq = sorted(word_freq.items(), key=lambda v: v[1], reverse=True) for item in sorted_word_freq[:10]: # 输出 Top 10 的单词 print("单词:%s 频数:%d " % (item[0], item[1])) def result(resultpath,word_freq): if word_freq: sorted_word_freq = sorted(word_freq.items(), key=lambda v: v[1], reverse=True) for item in sorted_word_freq[:10]: # 输出 Top 10 的单词 with open(resultpath,'a')as f: f.write("单词:"+item[0]+""+"频数:"+str(item[1])+'\n')
Task2:任务进阶
建一个存放停词库的文本“stopwords.txt”:
创建一个list存放文本里的停词:
def stopwordslist(filepath): #创建停用词列表 f = open(filepath, encoding='utf-8').readlines() # 文本读取 stopwords = [] # 存放停词列表 for i in range(len(f)): f[i] = f[i].replace('\n', '')#由于文本是逐行读取,所以要去除换行符 stopwords.append(f[i]) return stopwords
我们通过创建停词表来优化统计结果,得到想要的高频词组:
def main():#封装main path = "D:\桌面\python_work\Gone_with_the_wind.txt" # 《飘》文件的路径 filepath="D:\桌面\python_work\stopwords.txt" #停词表路径 resultpath="D:\桌面\python_work\Result.txt" #结果路径 bvffer = process_file(path) #读取文本 stopwords=stopwordslist(filepath) #创建停词表 word_freq = process_buffer(bvffer,stopwords) output_result(word_freq,path) result(resultpath,word_freq) #输出结果到Result.txt文件 match='[a-z]+' n=input('请输入词组长度:') for i in range(1,int(n)): match+='\s[a-z]+' #n个单词词组的正则表达式 print("匹配"+n+"个单词词组:") word_freq=process_buffer1(path,stopwords,match) output_result(word_freq,path)
2.程序算法的时间、空间复杂度分析
以如下代码为例:
def process_buffer(bvffer,stopwords): # 处理缓冲区,返回存放每个单词频率的字典word_freq if bvffer: # 下面添加处理缓冲区bvffer代码,统计每个单词的频率,存放在字典word_freq word_freq = {} words = [] wordmatch = "^[a-z]{4}(\w)*" #正则表达式至少以4个英文字母开头,跟上字母数字符号,单词以分隔符分割,不区分大小写 # 将文本内容都改为小写且去除文本中的中英文标点符号 for ch in '“‘!;:,.?”': bvffer = bvffer.lower().replace(ch, " ") for i in range(len(bvffer)): word = re.match(wordmatch, bvffer[i]) # 将正则表达式与列表中单词匹配 若匹配失败则返回NULL if word: # 匹配成功,加入words words.append(word.group()) #将匹配成功的单词放入words列表中 # strip()删除空白符(包括'/n', '/r','/t');split()以空格分割字符串 words = bvffer.strip().split() for word in words: if word not in stopwords: #判断列表中的单词是否出现在停词表中 将非停词表中的单词加入到字典word_freq中作为key word_freq[word]=word_freq.get(word,0)+1 print("总词数:"+str(len(words))) return word_freq
时间复杂度:代码以3个for循环为主,前两个for循环嵌套运行,设停词表有N个单词,result中待分析的有n个单词(N>n),则时间复杂度为O(N*2+n)。
空间复杂度:本部分的空间复杂度取决于定义的list容量,即停词表加上待分析文本,所以该空间复杂度为O(N+n)。
3.程序运行案例截图
Task:基本任务
其中测试文件:Gone_with_the_wind.txt
wordcount.py的运行结果:
Task2.1:停词表支持停词
。
Task2.2:查看常用短语词组
查看两个单词组成的短语
查看三个单词组成的短语
三、性能分析
1、按调用次数
2、按执行时间
3、性能图表
四、其他
1.结对编程时间开销:每天大约花了一个小时,前后共花了5、6个小时时间。时间主要花在程序优化上,还进行了查阅资料、讨论交流、调试优化等必要步骤。
2.结对编程照片:
五、事后分析与总结
1.讨论决策
我们在统计常用短语的方法上产生过一些问题,起初我打算用创建想要短语的字符串来检索的方法,事实证明有些繁琐;后来张铭锐同学提出用正则表达式来进行匹配检索,实行后发现要便捷很多,节省时间,于是最终我们打算采用张铭锐的方法。
2.评价对方
谭琪评价张铭锐:张铭锐同学在编写代码方面基础很好,并且经常有高效的方法来解决算法问题,在合作过程中积极配合,期待下一次合作。
张铭锐评价谭琪:谭琪同学对于编写程序很积极,他这两天经常和我讨论作业4的问题,有了他的协助,我解决了代码方面的许多问题。
3.评价整个过程
结对编程需要双方不断提出自己的想法并加以结合,耐心理解对方的思路。每人负责相应的模块,但也要融会对方的进程,相互补充和学习。在解决问题的过程中,我们相互启发和纠正,对于有争议的问题也是通过实践来印证。通过此次的结对编程,我们体会到合作的重要性以及不理解对方时的艰难,使我们对合作开发有了一定的理解和基础。
4.其他
合作开发是一个有趣的过程,尤其是合作的产物包含了大家的努力,一起解决问题的体验也很不错。