作业4:词频统计——基本功能


一、基本信息

(1)编译环境:python3.7.1、pycharm2018

(2)结对同学:1613072030 张鑫、1613072031 殷玉洁

(3)本次作业地址:https://edu.cnblogs.com/campus/ntu/Embedded_Application/homework/2088

(4)项目Git地址:https://gitee.com/ntucs/PairProg/tree/SE030_031

二、项目分析

1.1程序运行模块介绍

(1)Task1.读文件到缓冲区(process_file(dst))

def process_file(dst):     # 读文件到缓冲区
    try:     # 打开文件
        file1 = open(dst, "r")
    except IOError as s:
        print(s)
        return None
    try:     # 读文件到缓冲区
        bvffer = file1.read()
    except:
        print("Read File Error!")
        return None
    file1.close()
    return bvffer

(2)Task1.统计有效行数、用正则表达式筛选合格单词并统计(process_buffer(bvffer))

def process_buffer(bvffer):
    if bvffer:
        word_freq = {}
        # 下面添加处理缓冲区 bvffer代码,统计每个单词的频率,存放在字典word_freq

        count = 0
        for i in bvffer:  # 统计文件内容中换行符的数目
            if i == '\n':
                count += 1
        if i[-1] != '\n':  # 当文件最后一个字符不为换行符时,行数+1
            count += 1

        for i in '!"#$%&()*+-,-./:;<=>?@“”[\\]^_{|}~':
            bvffer = bvffer.replace(i, " ")  # 替换特殊字符
        words = bvffer.lower().split()

        if words:
            Newwords = []
            words_select = '[a-z]{4}(\w)*'   # 用正则表达式筛选合格单词
            for i in range(len(words)):
                word = re.match(words_select, words[i])
                if word:
                        Newwords.append(word.group())

        remain_words = []
        last_words = []
        for word in Newwords:
            if word not in stop_words:
                remain_words.append(word)

(3)Task1.输出出现频率排在前十的单词(output_result(word_freq))

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("<%s>:%d " % (item[0], item[1]))
            f = open("result.txt", 'a')
            print("<%s>:%d " % (item[0], item[1]), file=f)
            f.close()

(4)Task1.main()函数

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('dst')
    args = parser.parse_args()
    dst = args.dst
    bvffer = process_file(dst)
    word_freq = process_buffer(bvffer)
    output_result(word_freq)

(5)Task1.主函数进行调用

if __name__ == "__main__":
    cProfile.run("main()", "results")
    # 直接把分析结果打印到控制台
    p = pstats.Stats("results")  # 创建Stats对象
    p.sort_stats('calls').print_stats(10)
    # 按照调用次数排序,打印前10函数的信息
    p.strip_dirs().sort_stats("cumulative", "name").print_stats(10) # 按执行时间次数排序
    p.print_callers(0.5, "process_file")  # 想知道有哪些函数调用了process_file,小数,表示前百分之几的函数信息
    p.print_callers(0.5, "process_buffer")  # 想知道有哪些函数调用了process_buffer
    p.print_callers(0.5, "output_result")  # 想知道有哪些函数调用了output_result

(6)Task2.读取停词表

stop = open("stopwords.txt", 'r')  # 停词表的读取
        stopfile = stop.read()
        stop_words = stopfile.replace('\n', " ").lower().split()

(7)Task2.查看常用短语

print("请输入统计的内容:1.单个单词 \n"
              "                  2.2个单词组成的词组 \n"
              "                  3.3个单词组成的词组 \n")

        choice = int(input())
        if choice != 1 and choice != 2 and choice != 3:
            print("输入错误,请再输一遍:")
            choice = int(input())
        if choice == 1:
            last_words = remain_words
        elif choice == 2:
            for i in range(len(remain_words) - 1):
                phrase = "%s %s" % (remain_words[i - 1], remain_words[i])
                last_words.append(phrase)
        elif choice == 3:
            for i in range(len(remain_words) - 1):
                phrase = "%s %s %s" % (remain_words[i - 2], remain_words[i - 1], remain_words[i])
                last_words.append(phrase)

        for word in last_words:
            word_freq[word] = word_freq.get(word, 0) + 1
        print("lines:%d " % count)
        print("words:%d " % len(Newwords))
        f = open("result.txt", 'w')
        print("lines:%d " % count, file=f)
        print("words:%d " % len(Newwords), file=f)
        f.close()
        return word_freq

1.2程序算法的时间、空间复杂度分析

(1)时间复杂度分析:O(N+n)

(2)空间复杂度分析:即word_freq = {}的长度,则空间复杂度为O(2n)

1.3程序运行案例截图

(1)未使用停词表的有效行数、合格单词数

(2)使用停词表前的耗时最多、运行次数最多的函数

(3)停词表展示

(4)使用停词表后统计有效行数、合格单词数、常用短语

①一个单词组成的词组

②两个单词组成的词组

三个单词组成的词组

三、性能分析

(1)性能提高时间

关于性能的提高方面,我们在查找性能不足、寻求和讨论改进方法、实现性能提高、程序性能优化测试等过程中经历了两天时间,每天平均耗时大约在两到三个小时。

(2)性能图表展示

四、其他

(1)结对编程时间开销(单位:小时)

从准备工作和分工开始到博客撰写完成大约经历了六天时间。我们每天在课余时间划分出两到三个小时进行资料的查询、知识点的学习和讨论。后期博客方面则快些,用了两天的课余时间完成。

(2)结对编程照片

五、事后分析与总结

(1)讨论决策过程

我们在做词组统计时针对是选择“正则表达式”还是“将单词进行两两结合”的方式进行了讨论,并选择使用两两结合的方式完成任务。接着,我们还对停词表的单词进行了讨论。

(2)评价合作伙伴

殷玉洁评价张鑫:张鑫是一位非常认真的同学。他从分配任务时就照顾到了我对Python不熟悉的短板;能够积极学习、修改和讨论目标程序的实现方法,查询陌生的知识点;接着热心帮助我扫除知识盲区,共同完成学习任务。目前来说,没有什么缺点。

张鑫评价殷玉洁:殷玉洁同学虽然对Python代码的掌握不很熟悉,但是学习态度是端正的。在完成任务的过程中,她也能够自主利用线上资源查询相关知识进行学习。如果平时能够走出书本,拓宽一下知识面会更好。

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

我们平时没有频繁的接触,私下里并不互相了解,但是这次结对过程增强了同学间的互动,也给彼此留下了深刻的记忆。

首先,本次结对使我们充分利用到了双方的优势进行互补。张鑫同学对Python语言较为熟悉,学习理解能力较强,主动负责较为困难的代码以及程序的测试部分任务。殷玉洁同学则紧跟其后进行学习和讨教,在能力范围内做出一些贡献,学习和理解后完成博客部分的撰写和排版。

其次,由于班级和性别的不同,两人平时没有什么接触。通过此次结对学习,我们认识彼此并且通力合作,完成了看似不易的工作。在互相讨论的过程中,我们能够做到互相理解、互相尊重,只为找到最合适的解决方法,在不断了解对方后建立了深厚的情谊。

最后,结对完成任务即是一个团队的任务。我们认为无论成员数量如何,每个成员都要把自己当做一份子;无论能力如何,做事态度最重要;无论面对的工作是容易还是困难,都需要每位成员积极探索、努力实践、端正态度。至此,我们很期待接下来与更多同学的结对合作环节,希望能一如既往地愉快合作。

(4)其他

希望这样利于学习、开拓视野的活动能够不以作业的形式开展。

优质内容筛选与推荐>>
1、struts中ApplicationResources.properties支持中文
2、使用serialize()方法序列化表单元素值
3、Mina框架详解——简单的TCPServer
4、第二次冲刺——个人工作总结01
5、WF工作流与Web服务的相互调用 —— 以InvokeWebServiceActivity在Workflow工作流调用Web服务


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn