第二次作业:词频统计

一、编译环境

 (1)测试工具: PyCharm Community Edition 2019.2.2 x64

   (2) python版本:3.7.2

 

二、程序分析

(1)读文件到缓冲区

复制代码
 1 def process_file(path):  # 读文件到缓冲区
 2     try:# 打开文件
 3         f = open(path, 'r')   # path为文件路径
 4     except IOError as s:
 5         print(s)
 6         return None
 7     try:  # 读文件到缓冲区
 8         bvffer = f.read()
 9     except:
10         print('Read File Error!')
11         return None
12     f.close()
13     return bvffer
复制代码

(2)处理缓冲区,统计每个单词频率

复制代码
def process_buffer(bvffer):  # 处理缓冲区,返回存放每个单词频率的字典word_freq
    if bvffer:
        # 下面添加处理缓冲区bvffer代码,统计每个单词的频率,存放在字典word_freq
        word_freq = {}
        # 将文本内容都改为小写且去除文本中的中英文标点符号
        for ch in '“‘!;:,.?”':
            bvffer = bvffer.lower().replace(ch, " ")
        # strip()删除空白符(包括'/n', '/r','/t');split()以空格分割字符串
        words = bvffer.strip().split()
        for word in words:
            word_freq[word] = word_freq.get(word, 0) + 1
        return word_freq
复制代码

(3)输出频率前十的单词

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]))

(4)主函数调用前面已封装的函数

if __name__ == "__main__":
    path = "Gone_with_the_wind.txt"  
    bvffer = process_file(path)
    word_freq = process_buffer(bvffer)
    output_result(word_freq)

 

 

 

三、程序运行结果截图

1.对Gone_with_the_wind.txt进行词频统计

第二次作业:词频统计_第1张图片

 2.对A_Tale_of_Two_Cities.txt进行词频统计

 第二次作业:词频统计_第2张图片

 

四、性能分析结果及改进

1.可视化操作:

第二次作业:词频统计_第3张图片

五、性能分析结果及改进

(1)性能分析代码

复制代码
def main():  # main函数封装词频运行
    path = "Gone_with_the_wind.txt"
    bvffer = process_file(path)
    word_freq = process_buffer(bvffer)
    output_result(word_freq)


if __name__ == "__main__":
    import cProfile
    import pstats
    cProfile.run("main()", filename="word_freq.out")
    # 创建Stats对象
    p = pstats.Stats('word_freq.out')
    # 输出调用此处排前十的函数
    # sort_stats(): 排序
    # print_stats(): 打印分析结果,指定打印前几行
    p.sort_stats('calls').print_stats(10)
    # 输出按照运行时间排名前十的函数
    # strip_dirs(): 去掉无关的路径信息
    p.strip_dirs().sort_stats("cumulative", "name").print_stats(10)
    # 根据上面的运行结果发现函数process_buffer()最耗时间
    # 查看process_buffer()函数中调用了哪些函数
    p.print_callees("process_buffer")
复制代码

 

(2)执行时间最长的代码

for word in words:

word_freq[word] = word_freq.get(word, 0)+1

 

 

 

 

 
 

(5)代码改进

将bvffer.lower()放到for循环外

修改后代码:

1.bvffer = bvffer.lower()
2.for ch in '“‘!;:,.?”':
3.bvffer = bvffer.replace(ch, " ")
        

修改前性能分析图:

第二次作业:词频统计_第4张图片

修改后性能分析图:

第二次作业:词频统计_第5张图片

可以看出比原来快了0.247s。

你可能感兴趣的:(第二次作业:词频统计)