一、基本信息
1、编译环境:Python3.8、Pycharm2018
项 目:结对项目之词频统计——增强功能
作 者: 1613072007 周 磊
1613072008 俞林森
2、本次作业地址:
https://edu.cnblogs.com/campus/ntu/Embedded_Application/homework/2088
二、项目分析
1、按照作业要求将函数封装成类,以便让使用不同环境的用户
import re class WordCount(): def __init__(self, dst, m, n, o): # dst:文件路径;m:每个词组长度;n:输出的单词数量;o:设定生成文件的存储路径 self.dst = dst self.m = m self.n = n self.o = o def process_file(self): # 读文件到缓冲区 try: # 打开文件 doc = open(self.dst, 'r') except IOError as s: print(s) return None try: # 读文件到缓冲区 bvffer = doc.read() except: print("Read File Error!") return None doc.close() return bvffer def process_line(self): # 统计行数 count = 0 for line in open(self.dst, 'r').readlines(): if line != '' and line != '\n': count += 1 return count def process_buffer(self,bvffer): if bvffer: word_freq = {} # 下面添加处理缓冲区 bvffer代码,统计每个单词的频率,存放在字典word_freq for ch in '“‘!;,.?”': # 将文本内容都改为小写且除去文本中的中英文标点符号 bvffer = bvffer.lower().replace(ch, " ") bvffer = bvffer.strip().split() # strip()删除空白符;split()以空格分割字符串 regex = "^[a-z]{4}(\w)*" words = [] st = open("stop_word.txt", 'r') st1 = st.read() for word in bvffer: # 判定是否是符合单词设定 if re.match(regex, word): words.append(word) for word in words: # 获取字典 word_freq[word] = word_freq.get(word, 0) + 1 for key in list(word_freq): # 删除一些常用单词 if key in st1: del word_freq[key] return word_freq, words def process_MPhrase(self, bvffer): # 查找m个单词组成的词组 if bvffer: model = '' for i in range(self.m): model += '[a-z]+' if i < self.m - 1: model += '\s' result = re.findall(model, bvffer) # 正则查找词组 word_freq = {} for word in result: # 将正则匹配的结果进行统计 word_freq[word] = word_freq.get(word, 0) + 1 return word_freq def output_result(self,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[:self.n]: # 输出 Top 10 的单词 print('<' + str(item[0]) + '>:' + str(item[1])) return sorted_word_freq[:self.n] def print_result(self): bvffer = WordCount.process_file(self) # 文件读入缓冲区 lines = WordCount.process_line(self) # 计算文章的行数 word_freq, words = WordCount.process_buffer(self, bvffer) # 筛选出符合单词标准的单词词组 wordslen = len(words) # 计算出符合单词标准的单词数量 phrase_freq = WordCount.process_MPhrase(self, bvffer) wordslen_show = 'words:' + str(wordslen) lines_show = 'lines:' + str(lines) print(wordslen_show) # 显示文章单词总数 print(lines_show) # 显示文章的行数 print('词频前' + str(self.n) + '单词为:') itemsWord = WordCount.output_result(self, word_freq) print('词组长度为' + str(self.m) + '的词频前' + str(self.n) + '的单词为:') itemsPhrase = WordCount.output_result(self, phrase_freq) with open(self.o, 'w+') as w: w.write(lines_show + '\n') w.write(wordslen_show + '\n') w.write('词频前'+str(self.n)+'单词为:' + '\n') # 单词的可视化输出 for itemWord in itemsWord: item = '<' + str(itemWord[0]) + '>:' + str(itemWord[1]) + '\n' w.write(item) w.write('词组长度为' + str(self.m) + '的词频前' + str(self.n) + '的单词为:' + '\n') # 词组的可视化输出 for itemPhrase in itemsPhrase: item = '<' + str(itemPhrase[0]) + '>:' + str(itemPhrase[1]) + '\n' w.write(item) print('写入' + self.o + '文件已完成!') w.close()
2、我们现在pycharm里试验一下能否成功统计词频
if __name__ == '__main__': obj = WordCount('Gone_with_the_wind.txt', 2, 5, 're.txt') obj.print_result()
截图:
3、测试类
import test1 import argparse def main(): parser = argparse.ArgumentParser(description="your script description") # description参数可以用于插入描述脚本用途的信息,可以为空 parser.add_argument('--i', '-i', type=str, default='Gone_with_the_wind.txt', help="读取文件路径") parser.add_argument('--m', '-m', type=int, default=3, help="输出的单个词组数量") parser.add_argument('--n', '-n', type=int, default=4, help="输出的频率前n个的单词和词组数量") parser.add_argument('--o', '-o', type=str, default='result.txt', help="读取文件路径") args = parser.parse_args() # 将变量以键-值的字典形式存入args字典 dst = args.i m = args.m n = args.n o = args.o obj = test1.WordCount(dst, m, n, o) obj.print_result() if __name__ == '__main__': main();
截图:
4、在Dos命令提示符中传递参数
(1)指定文本分析 -i 参数设定读入的文件路径(先前在声明中有默认值,所以不指定其他要求程序会按默认值执行)
(2)指定统计词组长度为4 -m 参数设定统计的词组长度
(3)指定统计出现频率最高的2个单词 -n 参数设定输出的单词数量
(4)-o 参数设定生成文件的存储路径
(5)总结性的一次性传递所有参数 多参数的混合使用(Python_test_input.txt是自己弄的一个文本文档)
三、性能分析
四、PSP 表格
五、事后分析与总结
1、简述结对编程时,针对某个问题的讨论决策过程。
关于cmd运行py脚本传参的问题,经过百度,找到如果在运行python脚本时需要传入一些参数,例如gpus
与batch_size
,可以使用如下三种方式。,这三种格式对应不同的参数解析方式,分别为sys.argv
, argparse
, tf.app.run
, 前两者是python自带的功能,后者是tensorflow
提供的便捷方式。我们使用的是argparse,优点是parser.add_argument
方法的type
参数理论上可以是任何合法的类型。
2、评价:
(1)周磊对俞林森的评价:个人能力强,不遗余力参与到合作编程中,与他讨论的时候能够给我很大的启发,并且会提出代码中不足的地方,希望能与他再次合作!
(2)俞林森对周磊的评价:周磊同学对python有过接触,而我基本就是个小白,此次他编写了大部分内容,我做到尽量不拖后腿。
3、评价整个过程:关于结对过程的建议
结对编程的过程收获颇多,我觉得结对编程有好有坏,但是好处远远大于的不好的地方。两个人难免会遇到意见不同的时候,关键是看此时如何协调、如何沟通、如何采纳。如果团队内部不能很好地处理这些分歧,那么非但不能提高效率,反而会拖慢工作的进程。如果团队协调得很好,那么两个人的力量是绝对大过一个人的。一个人的想法始终有限,两个人或者一群人合作,说不定还能擦出思想的火花。
4、结对编程照片