zoukankan      html  css  js  c++  java
  • 20180918-1词频统计

    作业要求参见 https://edu.cnblogs.com/campus/nenu/2018fall/homework/2126

    Git:https://git.coding.net/zhaomeizeng/wc.git

    一.功能实现

    功能一

    (1)     首先对文件的处理需要先输入,利用open函数逐行读取文件内容,本次使用只用了两个参数,文件名和读取方式,open(filename,’r’)

     infile = open(filename,'r')

    (2)    难点:未用punctuation之前出现过去除符号不全的现象 分词,open读取是多行的所以利用for对每行操作,行操作:分词,通过调用punctuation和line共同判断标点是否在行中,有则用空格替换用replace()方法,因为分词的方法spilte()通过空格分词。

    def replaces(line):
        for ch in line:
            if ch in punctuation:
                line = line.replace(ch, " ")
            return line

    (3)重点:需要理清头绪细致掌握,

    对处理好的每行进行操作:字典的键值对属性十分使用这种统计,所以创建字典在for对每行(列表)的统计中for每个单词,存入字典。

    对字典的操作:首先计算total,重复计算的可以统计键的个数,非重复的可以各个值相加;统计是个最多的次,利用sort函数,需要先将字典转化为列表list(word_counts.items()),此列表也是成对存在,但是名在前,数在后,需要先反转数对[x,y] for [y,x] in pairs,然后sort()依据x进行从小到大的排列,所以输出是就要从后往前输出。

    def countLine(line, word_Counts):
        # 用空格替换标点符号,避免造成乱码导致错误
        line = replaces(line)
        '''使用函数替换标点,使用自定义函数'''
        words = line.split()
        '''以空格分割成单词'''
        for word in words:
            if word in word_Counts:
                word_Counts[word] += 1
            else:
                word_Counts[word] = 1
    items = [[x, y] for (y, x) in pairs]
        items.sort()

    结果

     ***在看到老师的指导要求后尝试转换成.exe文件,但是遭遇错误。查询后得知可能是pyinstaller 目前可能不支持我所用的python3.7,

    所以没有调试成功,正在加紧调试,为不晚交作业只能先以现代码为基础完成作业。 

     

    功能二

    难点:对于文件的操作这是第一次实现还是比较有难度的,从os到open学了很长时间。 

     相比功能一改动的是total的统计,从遍历字典的键变成遍历字典的values并累积相加。

    infile = open(filename, 'r')  # 以只读方式打开文件,r表模式
        total = 0
        words = []
        data = []
        '''建立列表'''
        # 建立用于计算词频的空字典
        word_Counts = {}
        for line in infile:
            countLine(line.lower(), word_Counts)  # 这里line.lower()的作用是将大写替换成小写,方便统计词频
        # 从字典中获取数据对,转换为列表,会变成【(a,1),(b,2)]形式,括号内分别为0,1
        for value in word_Counts.values():
            total = total + value
        pairs = list(word_Counts.items())  #
        # 列表中的数据对交换位置,数据对排序
        items = [[x, y] for (y, x) in pairs]
        items.sort()
        # 因为sort()函数是从小到大排列,所以range是从最后一项开始取
    
        #total = len(pairs)
        print("total " + str(total))  # 此for统计总数,通过访问各键的值
        if len(items) - 11 <0:
            lenth = -1
        else:
            lenth = len(items) -11
        for i in range(len(items) - 1,lenth, -1):  # range函数(start,stop,step)
            print(items[i][1] + "	" + str(items[i][0]))  # 对数值对样式的列表处理
            data.append(items[i][0])
            words.append(items[i][1])

     功能三

    (1) 难点在于目录下文件的读取。

    通过os对目录进行读取,将文件置于一个列表下,再依次执行,因为没有将文件转换成.exe,所以需要指定文件的绝对路径,由输入的dir和自行读取的文件名组成,利用os的jion函数。其余的就是对于功能讷讷个二统计一个文件的功能调用。

    path = input()
    dirs = os.listdir(path)
    # 输出所有文件和文件夹
    for filename in dirs:
        print(filename)
        filename = os.path.join(path, filename)
        mains(filename)

     结果

     功能四

     对于功能四查询学习良久还是不能理解学会,没有实现。

    二.psp

     实现与测试psp

    阶段

    预计时间

    实际时间

    原因

    功能一

    120

    244

    在做分析时以为使用python强大的函数可以轻松实现,但上手才知道并非如此,语言掌握不牢,函数不熟悉,只能边学边写

    测试功能一

    30

    15

    没有框架,边学边写,错误太多了

    功能二

    60

    77

    以功能一为蓝本

    测试功能二

    30

    25

    比较顺利,没崩溃

    功能三

    30

    167

    以为目录操作比较简单,但是遇到地址问题,查了好久

    测试功能三

    30

    15

    比较顺利,没崩溃

    功能四

    120

    至今

    没学明白这是什么,只是写了个统计输入的字段的程序,并不符合要求

     确实遇到了很多的困难吧,从硬件到程序,真正认识到自己学的还是 太差了,对各种函数的运用根本不熟练,还要边写边写。

    然后还有不少意外,编程环境崩了两次,自己都意想不到,以后还是要好好使用电脑多多清理垃圾,整理文件。

    全程被蹂躏,最后也没实现好。

    指导自己的实践能力差,这次也是见识到有多差了。

  • 相关阅读:
    杂七杂八的文档资料。
    图片(img标签)的onerror事件
    html的a标签的 href 和 onclick。
    【mysql】一次有意思的数据库查询分析。
    书籍:Building Secure PHP Apps
    js关闭当前页面/关闭当前窗口
    【汉字乱码】IE下GET形式传递汉字。
    弹出层展示插件。
    原型图设计工具。
    LeetCode(24): 两两交换链表中的节点
  • 原文地址:https://www.cnblogs.com/zhaomz853/p/9696809.html
Copyright © 2011-2022 走看看