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

 一、基本信息

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脚本时需要传入一些参数,例如gpusbatch_size,可以使用如下三种方式。,这三种格式对应不同的参数解析方式,分别为sys.argvargparsetf.app.run, 前两者是python自带的功能,后者是tensorflow提供的便捷方式。我们使用的是argparse,优点是parser.add_argument 方法的type参数理论上可以是任何合法的类型。

2、评价:

(1)周磊对俞林森的评价:个人能力强,不遗余力参与到合作编程中,与他讨论的时候能够给我很大的启发,并且会提出代码中不足的地方,希望能与他再次合作!

(2)俞林森对周磊的评价:周磊同学对python有过接触,而我基本就是个小白,此次他编写了大部分内容,我做到尽量不拖后腿。

3、评价整个过程:关于结对过程的建议

       结对编程的过程收获颇多,我觉得结对编程有好有坏,但是好处远远大于的不好的地方。两个人难免会遇到意见不同的时候,关键是看此时如何协调、如何沟通、如何采纳。如果团队内部不能很好地处理这些分歧,那么非但不能提高效率,反而会拖慢工作的进程。如果团队协调得很好,那么两个人的力量是绝对大过一个人的。一个人的想法始终有限,两个人或者一群人合作,说不定还能擦出思想的火花。

4、结对编程照片

 

posted @ 2018-11-30 15:26  俞林森  阅读(176)  评论(1编辑  收藏  举报