软工作业 5:结对项目之词频统计——增强功能

一、基本信息

1、编译环境:python3.6 、 pycharm

2、结对成员:1613072032-赵亦明、1613072033-王楠楠

3、本次作业的地址:https://edu.cnblogs.com/campus/ntu/Embedded_Application/homework/2300

二、项目分析

1、接口封装—将基本功能封装成函数

import re

class workCount:

    def process_file(dst):  # 读取文件
        lines = len(open(dst, 'r').readlines())  # 借助readlines可以获得文本的行数
        with open(dst) as f:
            bvffer = f.read()
        f.close()
        return bvffer

    def process_buffer(bvffer):
        if bvffer:
            for ch in ':,.-_':
                bvffer = bvffer.lower().replace(ch, " ")
            bvffer = bvffer.strip().split()
            word_re = "^[a-z]{4}(\w)*"
            # 正则匹配至少以4个英文字母开头,跟上字母数字符号,单词以分隔符分割,不区分大小写
            words = []
            for i in range(len(bvffer)):
                word = re.match(word_re, bvffer[i])  # 匹配list中的元素
                if word:  # 匹配成功,加入words
                    words.append(word.group())
            word_freq = {}
            for word in words:  # 对words进行统计
                word_freq[word] = word_freq.get(word, 0) + 1
        return word_freq, len(words)

    def output_result(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 的单词
                print('<' + str(item[0]) + '>:' + str(item[1]))
        return sorted_word_freq[:10]

    def print_result(dst):
        buffer = workCount.process_file(dst)
        word_freq, counts_words = workCount.process_buffer(buffer)
        print('统计单词数:' + str(counts_words))
        print('统计最多的10个单词及其词频')
        workCount.output_result(word_freq)

  

2、增加新功能

在完成接口封装的基础上,增加新的功能。增加词组统计以及自定义输出功能。

经过分析,通过增加参数来实现新功能。

(1)实现类的代码

 

import re

class workCount:
    def __init__(self, dst, m, n, o):  # dst:文件路径;m:词组长度;n:输出的单词数量
        self.dst = dst
        self.m = m
        self.n = n
        self.o = o

    def process_file(self):  # 读取文件
        lines = len(open(self.dst, 'r+').readlines())  # 借助readlines可以获得文本的行数
        with open(self.dst) as f:
            bvffer = f.read()
        f.close()
        return bvffer, lines

    def process_buffer(self, bvffer):
        if bvffer:
            for ch in ':,.-_':
                bvffer = bvffer.lower().replace(ch, " ")
            counts = bvffer.strip().split()
            regex = ''
            for i in range(self.m):
                regex += '[a-z]+'
                if i < self.m - 1:
                    regex += '\s'
            result = re.findall(regex, bvffer)  # 正则查找词组
            word_freq = {}
            for word in result:  # 将正则匹配的结果进行统计
                word_freq[word] = word_freq.get(word, 0) + 1
            return word_freq, len(counts)

    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):
        print('查询路径为:' + str(self.dst) + '的文本')
        print('统计词组长度为:' + str(self.m) + '且词频前' + str(self.n) + '的单词')
        buffer, lines = workCount.process_file(self)
        word_freq, counts_words = workCount.process_buffer(self, buffer)
        lines = 'lines:' + str(lines)
        words = 'words:' + str(counts_words)
        print(words)
        print(lines)
        items = workCount.output_result(self, word_freq)
        with open(self.o, 'w+') as w:
            w.write(lines+'\n')
            w.write(words+'\n')
            for item in items:  # 格式化
                item = '<' + str(item[0]) + '>:' + str(item[1]) + '\n'
                w.write(item)
        print('写入'+self.o+'文件已完成!')
        w.close()

 

(2)测试类的代码

import lei
import argparse

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description="your script description")  # description参数可以用于插入描述脚本用途的信息,可以为空
    parser.add_argument('--i', '-i', type=str, default='src/test.txt', help="读取文件路径")
    parser.add_argument('--m', '-m', type=int, default=1, help="输出的单词数量")
    parser.add_argument('--n', '-n', type=int, default=6, help="输出的单词数量")
    parser.add_argument('--o', '-o', type=str, default='src/result.txt', help="读取文件路径")
    args = parser.parse_args()  # 将变量以标签-值的字典形式存入args字典
    dst = args.i
    m = args.m
    n = args.n
    o = args.o
    obj = lei.workCount(dst, m, n, o)
    obj.print_result()

  

(3)测试截图

改变参数的值,测试自定义的输出。

软工作业 5:结对项目之词频统计——增强功能_第1张图片

 

软工作业 5:结对项目之词频统计——增强功能_第2张图片

 

三、性能分析

1、性能图表

 

 软工作业 5:结对项目之词频统计——增强功能_第3张图片

 

 

 

四、PSP 表格

1、结对编程时间开销(单位:分钟)

 

 软工作业 5:结对项目之词频统计——增强功能_第4张图片

五、事后分析与总结

1、简述结对编程时,针对某个问题的讨论决策过程。

针对不同的代码解决不同层面的问题,我们花费了很多时间和精力在整理和优化代码上。虽然我们有不同想法,但我们会认真讨论分析选择最优的解决方案。

2、评价对方:请评价一下你的合作伙伴,又哪些具体的优点和需要改进的地方。 这个部分两人都要提供自己的看法。

王楠楠:赵亦明思路清楚,做事细心,对于复杂的问题能认真分析并给出解决办法。

赵亦明:王楠楠态度认真,学习能力很强,讨论时积极思考,在python语言的编写上在不断提高。

3、评价整个过程

在本次结对项目中,对于一些复杂的问题,明显可以感觉到两个人一起思考解决,要比一个人来解决更加严谨,效率更高。结对编程,对于一些问题,大家一定都是有自己的想法,我们会考虑对方的想法,从安全、可实现以及效率等方面综合选择问题的解决办法。整个过程中,彼此都可以学习到对方的优点和长处,也会发现自己的缺点与不足,是一次很好的学习过程。

4、结对编程照片

软工作业 5:结对项目之词频统计——增强功能_第5张图片

5、其它

结对编程不仅考验编程能力,更多的是考验彼此的合作能力,两次结对编程都锻炼了彼此的编程能力与合作能力。

你可能感兴趣的:(软工作业 5:结对项目之词频统计——增强功能)