一、基本信息
1、本次作业的地址:https://edu.cnblogs.com/campus/ntu/Embedded_Application/homework/2088
2、项目Git地址:https://gitee.com/ntucs/PairProg/tree/SE015_014
3.开发环境:Pycharm2017、Python3.6
4.结对成员:1613072015候玉权 、1613072014卢杰
二、项目分析
1.程序运行模块(方法、函数)介绍
1.1Task1:
(1)读文件到缓冲区,统计文件的有效行数.
def process_file(dst): # 读文件到缓冲区 try: # 打开文件 doc = open(dst, "r") except IOError as e: print(e) return None try: # 读文件到缓冲区 bvffer = doc.read() except: print('Read File Error!') return None doc.close() return bvffer def count_line(dst): #计算文章的行数 lines = len(open(dst, 'r').readlines()) # 借助readlines可以获得文本的行数 print("line:",lines)
(2) 统计文件的单词总数.
def process_word(words): # 通过正则表达式证明是否符合单词标准,计算单词个数且返回单词字典 if words: T = [] words_select = '[a-z]{4}(\w)*' for i in range(len(words)): word = re.match(words_select, words[i]) # 如果不匹配,返回NULL类型 if word: T.append(word.group()) print("words:{:}".format(len(T))) f = open('result.txt', 'a') print("words:{:}".format(len(T)),file=f) f.close() return T
(3) 统计文件中各单词的出现次数,最终只输出频率最高的10个。频率相同的单词,优先输出字典序靠前的单词。
def process_stopword(words, stopwords): word_freq = {} for word in words: #将转换好的words中踢除stopwords.txt中的单词 if word in stopwords: continue else: word_freq[word] = word_freq.get(word, 0) + 1 # 对单词进行计数统计 return word_freq
(4)输出到文件result.txt
def save_result(lines, words, items): # 保存结果到文件(result.txt) result = open("result.txt", "w") # 以写模式打开,并清空文件 result.write("lines:" + lines + "\n") # 写入文件result.txt result.write("words:" + words + "\n") for item in items: item = '<' + str(item[0]) + '>:' + str(item[1]) + '\n' result.write(item) result.close()
(5)主函数
def main(): dst = 'Gone_with_the_wind.txt' txt = 'stopwords.txt' b1 = process_file(dst) # 读目标文件 b2 = process_file(txt) # 读stopwords.txt文件 F = process_tr(b1) # 将目标文件中的文章文体及字符转换 S = process_tr(b2) # 将stopwords.txt文件中的文章文体及字符转换 count_line(dst) # 统计行数 T = process_word(F) # 计算单词的个数 word_freq = process_stopword(T, S) # 输出转换好的words中踢除stopwords.txt中的前10个单词 output_result(word_freq) print("高频短语:") word_group(dst,word_freq) items = output_result(word_freq) lines = str(lines) words = str(words) save_result(lines, words, items)
1.2Task2:
停词表模块(将停词模块与统计高频短语合二为一)
def word_group(dst,word_freq): #输出频率高的短语 str= open(dst, 'r').read() useless_Phrase={'would','that'} wordGroup = str.lower() tokens = nltk.wordpunct_tokenize(wordGroup) # 二字短语 finder = nltk.collocations.BigramCollocationFinder.from_words(tokens) # 删除掉符合条件fn的词组 finder.apply_word_filter(lambda x: x in [',', '.', '’', '“', '”', '\'', '"', ',"', ',”']) print("频率高的二字短语") # 这里的key是排序依据,就是说先按t[1](词频)排序,-表示从大到小;再按照词组(t[0])排序,默认从a-z. print(sorted(finder.ngram_fd.items(), key=lambda t: (-t[1], t[0]))[:5]) # 三字短语 finder = nltk.collocations.TrigramCollocationFinder.from_words(tokens) # 删除掉符合条件fn的词组 finder.apply_word_filter(lambda x: x in [',', '.', '’', '“', '”', '\'', '"', ',"', ',”']) print("频率高的三字短语") print(sorted(finder.ngram_fd.items(), key=lambda t: (-t[1], t[0]))[:5]) for word in wordGroup: if word in useless_Phrase: continue else: word_freq[word] = word_freq.get(word, 0) + 1 # 将词组进行计数统计 return word_freq
三.程序算法的时间、空间复杂度分析
以下面代码为例:
def count_line(dst): #计算文章的行数 lines = len(open(dst, 'r').readlines()) # 借助readlines可以获得文本的行数 print("line:",lines)
该程序只有一个函数,其时间复杂度为O(n),所以该程序时间复杂度为O(n)。同理空间复杂度也为O(n)。
四、程序运行截图
任务一:
任务二:
六、结对编程开销时间及照片
(1)结对编程开销时间花费了一周时间左右。
(2)结对编程照片
1.简述关于停词表部分的决策过程 一开始准备使用nltk中的停词表,但是考虑到时间开销以及停词效果显示方面的原因,我们选择创建stopwords.txt,自定义停词内容,然后通过代码读取txt文档中停用词,在输出词频前十的过程中进行剔除停用词。
2.评价 (1)卢杰评价侯玉权:侯玉权同学学习能力强、对于不熟悉的方法上手很快。而且他做事认真且有条理、但是严谨性需加强。提出 使用nltk中的方法,思考角度为“不重复造轮子”,并且该工具包已经发展成熟,
在使用过程中并不会产生程序问题。美中不足的是对编写程序背后的逻辑方面,不够严谨,希望以后能够多加思考。 (2)侯玉权评价卢杰:卢杰同学思维活跃、常常想出好的方法。不过他的基础代码能力欠缺,需要继续努力。使用正则表达式,针对2个词汇的短语,与3个词汇的短语编写正则表达式,从文本中找出
符合要求的短语集合之后,进行短语统计(类似词频统计)。在完成任务的同时,积极帮助我解答疑问,受益匪浅,期待下一次的合作。
3.关于结对过程的建议 (1)可以以自由结对编程的形式开展,同学自主寻找的结对伙伴彼此比较熟悉能够更有效率地开展结对编程工作;当然,不太熟悉的人结对编程也有一定好处,如可以锻炼个人的与他人交流沟通、相处之道。
4.其他 “三人行必有我师”,相互学习对方的技能,可以提升自己水平。工作及时得到同伴的肯定,自信心和成就感会增强,觉得工作很愉快,很愿意很partner一起工作,这样就会提高生产率。在编程中,相互讨论,可能更快更有效地解决问题。