软件工程作业——词频统计

文本统计与性能分析
本文介绍了一个使用Python读取并统计文本文件中单词频率的方法,包括处理缓冲区、统计单词频率、输出频率最高的十个单词,并进行了性能分析。通过cProfile模块分析了程序的运行效率,指出process_buffer函数为性能瓶颈。

一、编译环境

 python3.7

pycharm2018


二、程序分析

1、读文件到缓冲区process_file(dst)def process_file(dst): # 读文件到缓冲区


  try:  # 打开文件
        f = open(dst,'r' )  # dst为文本的目录路径
    except IOError as s:
        print(s)
        return None
    try:  # 读文件到缓冲区
        bvffer = f.read()
    except:
        print('Read File Error!')
        return None
    f.close()
    return bvffer

  



2、统计缓冲区的里每个单词的频率,放入 process_buffer(bvffer)
def process_buffer(bvffer):
      if bvffer:
         word_freq = {}
          # 下面添加处理缓冲区 bvffer代码,统计每个单词的频率,存放在字典word_freq
         Char={",.;!?"}
      for ch in Char:
            bvffer=bvffer.replace(ch, ' ')
         #过滤英文标点特殊符号,以空格代替
      Word=bvffer.lower()
      Word = bvffer.split()
      #以空格来划分字符串
      for word in Word:
             if word in word_freq.keys():#若没有就置为1,有的话加1
                 word_freq[word] = word_freq[word] + 1
             else:
                 word_freq[word] = 1
      return word_freq

  


3、按照单词的频数排序,输出次数排名前十的单词(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(item)

  


4、主函数输出文章中单词前十的结果
def main():
    dst = "C:\\Users\\YCH19981203\\Gone_with_the_wind.txt"
    bvffer = process_file(dst)
    word_freq = process_buffer(bvffer)
    output_result(word_freq)

 

5、性能分析部分

 

if __name__ == "__main__":
    import cProfile
    import pstats
    cProfile.run("main()" , filename="result.out")
    p = pstats.Stats('result.out')  # 创建Stats对象
    p.sort_stats('calls').print_stats(10)  # 按照调用次数排序,打印前10函数的信息
    p.strip_dirs().sort_stats("cumulative", "name").print_stats(10)  # 按照运行时间和函数名排序,只打印前10行函数的信息
    p.print_callees("process_buffer")  # 查看process_buffer()函数中调用了哪些函数

 

  

 


三、代码风格
缩进很严格
try:  # 读文件到缓冲区
        bvffer = f.read()
    except:
        print('Read File Error!')
        return None

  没有;符号:

try:  # 读文件到缓冲区
        bvffer = f.read()
    except:
        print('Read File Error!')
        return None

 四、程运行结果截图 

   《Gone_with_the_wind》 

 

五、性能分析及结果改进

执行次数最多的代码

 


按照函数名,时间最多进行排序

 

 查看调用的函数

 


改进:

可以选择减少调用次数,这部分调用最多,但是需要遍历整篇文章,不好动。
for word in Word:
             if word in word_freq.keys():
                 word_freq[word] = word_freq[word] + 1
             else:
                 word_freq[word] = 1
      return word_freq

 那就需要减少运行时间,第一个图发现process_buffer函数用时最多;查看一下发现split分割字符串用时最长,还是不好动;

将代码low函数与split函数同时用,不再分开。发现减少了一丢丢时间

 











转载于:https://www.cnblogs.com/xffych/p/9755466.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值