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

一、基本信息

编译环境:Python3.7

项目名称:词频统计——基本功能(结对编程)

作者:1613072036:谭琪

           1613072037:张铭锐

项目Git地址:https://gitee.com/zmryy/PairProg/tree/SE036_037

二、项目分析

1.程序运行模块(方法、函数)介绍

Task1:基本任务

统计文件的有效行数并输出:

    count = len(open(path, 'r').readlines())
    print("行数:"+str(count))

统计文件的单词总数并输出:

def process_buffer(bvffer,stopwords):  # 处理缓冲区,返回存放每个单词频率的字典word_freq
    if bvffer:
        # 下面添加处理缓冲区bvffer代码,统计每个单词的频率,存放在字典word_freq
        word_freq = {}
        words = []
        wordmatch = "^[a-z]{4}(\w)*"  #正则表达式至少以4个英文字母开头,跟上字母数字符号,单词以分隔符分割,不区分大小写
         # 将文本内容都改为小写且去除文本中的中英文标点符号
        for ch in '“‘!;:,.?”':  
            bvffer = bvffer.lower().replace(ch, " ")
        for i in range(len(bvffer)):
            word = re.match(wordmatch, bvffer[i])  # 将正则表达式与列表中单词匹配 若匹配失败则返回NULL
            if word:  # 匹配成功,加入words
                words.append(word.group())  #将匹配成功的单词放入words列表中    
        # strip()删除空白符(包括'/n', '/r','/t');split()以空格分割字符串
        words = bvffer.strip().split()
        for word in words:
         if word not in stopwords:  #判断列表中的单词是否出现在停词表中 将非停词表中的单词加入到字典word_freq中作为key
               word_freq[word]=word_freq.get(word,0)+1
        print("总词数:"+str(len(words)))
        return word_freq

统计文件中各单词的出现次数,最终只输出频率最高的10个。频率相同的单词,优先输出字典序靠前的单词:

def output_result(word_freq,path):
    resultpath="D:\桌面\python_work\result.txt"
    count = len(open(path, 'r').readlines())
    print("行数:"+str(count))
    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]))
            
            
            
def result(resultpath,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 的单词
            with open(resultpath,'a')as f:
              f.write("单词:"+item[0]+""+"频数:"+str(item[1])+'\n')

Task2:任务进阶

建一个存放停词库的文本“stopwords.txt”:

创建一个list存放文本里的停词:

def stopwordslist(filepath):  #创建停用词列表
    f = open(filepath, encoding='utf-8').readlines()  # 文本读取 
    stopwords = []  # 存放停词列表
    for i in range(len(f)):  
        f[i] = f[i].replace('\n', '')#由于文本是逐行读取,所以要去除换行符
        stopwords.append(f[i]) 
    return stopwords

我们通过创建停词表来优化统计结果,得到想要的高频词组:

def main():#封装main
    path = "D:\桌面\python_work\Gone_with_the_wind.txt"  # 《飘》文件的路径
    filepath="D:\桌面\python_work\stopwords.txt"      #停词表路径
    resultpath="D:\桌面\python_work\Result.txt"   #结果路径
    bvffer = process_file(path)     #读取文本
    stopwords=stopwordslist(filepath)  #创建停词表
    word_freq = process_buffer(bvffer,stopwords)
    output_result(word_freq,path)
    result(resultpath,word_freq)  #输出结果到Result.txt文件
    match='[a-z]+'
    n=input('请输入词组长度:')
    for i in range(1,int(n)):
       match+='\s[a-z]+'   #n个单词词组的正则表达式
    print("匹配"+n+"个单词词组:")
    word_freq=process_buffer1(path,stopwords,match)
    output_result(word_freq,path)

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

 以如下代码为例:

def process_buffer(bvffer,stopwords):  # 处理缓冲区,返回存放每个单词频率的字典word_freq
    if bvffer:
        # 下面添加处理缓冲区bvffer代码,统计每个单词的频率,存放在字典word_freq
        word_freq = {}
        words = []
        wordmatch = "^[a-z]{4}(\w)*"  #正则表达式至少以4个英文字母开头,跟上字母数字符号,单词以分隔符分割,不区分大小写
         # 将文本内容都改为小写且去除文本中的中英文标点符号
        for ch in '“‘!;:,.?”':  
            bvffer = bvffer.lower().replace(ch, " ")
        for i in range(len(bvffer)):
            word = re.match(wordmatch, bvffer[i])  # 将正则表达式与列表中单词匹配 若匹配失败则返回NULL
            if word:  # 匹配成功,加入words
                words.append(word.group())  #将匹配成功的单词放入words列表中    
        # strip()删除空白符(包括'/n', '/r','/t');split()以空格分割字符串
        words = bvffer.strip().split()
        for word in words:
         if word not in stopwords:  #判断列表中的单词是否出现在停词表中 将非停词表中的单词加入到字典word_freq中作为key
               word_freq[word]=word_freq.get(word,0)+1
        print("总词数:"+str(len(words)))
        return word_freq

时间复杂度:代码以3个for循环为主,前两个for循环嵌套运行,设停词表有N个单词,result中待分析的有n个单词(N>n),则时间复杂度为O(N*2+n)。

空间复杂度:本部分的空间复杂度取决于定义的list容量,即停词表加上待分析文本,所以该空间复杂度为O(N+n)。

3.程序运行案例截图

 Task:基本任务

其中测试文件:Gone_with_the_wind.txt

wordcount.py的运行结果:

 

 Task2.1:停词表支持停词

       

 Task2.2:查看常用短语词组

  查看两个单词组成的短语

 

  查看三个单词组成的短语

 

三、性能分析

1、按调用次数

2、按执行时间

3、性能图表

四、其他

1.结对编程时间开销:每天大约花了一个小时,前后共花了5、6个小时时间。时间主要花在程序优化上,还进行了查阅资料、讨论交流、调试优化等必要步骤。

2.结对编程照片:

五、事后分析与总结

1.讨论决策

我们在统计常用短语的方法上产生过一些问题,起初我打算用创建想要短语的字符串来检索的方法,事实证明有些繁琐;后来张铭锐同学提出用正则表达式来进行匹配检索,实行后发现要便捷很多,节省时间,于是最终我们打算采用张铭锐的方法。

2.评价对方

谭琪评价张铭锐:张铭锐同学在编写代码方面基础很好,并且经常有高效的方法来解决算法问题,在合作过程中积极配合,期待下一次合作。

张铭锐评价谭琪:谭琪同学对于编写程序很积极,他这两天经常和我讨论作业4的问题,有了他的协助,我解决了代码方面的许多问题。

3.评价整个过程

结对编程需要双方不断提出自己的想法并加以结合,耐心理解对方的思路。每人负责相应的模块,但也要融会对方的进程,相互补充和学习。在解决问题的过程中,我们相互启发和纠正,对于有争议的问题也是通过实践来印证。通过此次的结对编程,我们体会到合作的重要性以及不理解对方时的艰难,使我们对合作开发有了一定的理解和基础。

4.其他

合作开发是一个有趣的过程,尤其是合作的产物包含了大家的努力,一起解决问题的体验也很不错。

猜你喜欢

转载自www.cnblogs.com/tanqiking/p/9807626.html
今日推荐