首页 > 技术文章 > 韩昊20190912-3 词频统计

hanhao970620 2019-09-17 21:57 原文

此作业的要求参见[https://edu.cnblogs.com/campus/nenu/2019fall/homework/6583]

词频统计 SPEC 20180918

 一、代码以及版本控制

代码地址:https://e.coding.net/hanhao/count_words.git

使用语言:python

使用git的客户端为: git push

二、重点/难点以及效果截图

功能1 小文件输入。 为表明程序能跑,结果真实而不是迫害老五,请他亲自键
盘在控制台下输入命令。

重点/难点 :

(1)如何将py文件转化为exe文件

附上教程:https://www.cnblogs.com/hanhao970620/p/11537088.html

(2)英文字符的冗余校验和删除,解决办法是将字符等替换成空格

重要代码展示:

删除冗余字符:

def deal_Redundantwords(string):
    string = string.replace('\n', ' ').replace(',', ' ')
    s1 = list(string)
    num = len(s1)
    s1.append(' ')
    for i in range(num):
        if s1[i] in '."?\')-(;#$%&*!':
            #isalnum检测字符串是否有数组组成
            if str(s1[i - 1].isalnum()) == 'True' and (str(s1[i + 1].isalnum()) == 'True'):
                pass
            else:
                s1[i] = ' '
    for i in range(num):
        if s1[i] in ':':
            if s1[i + 1] == '/':
                pass
            else:
                s1[i] = ' '
    #join连接字符数组
    s = ''.join(s1)
    # print(s)
    return s

实现功能一:

list1 = text.replace('\n', ' ').lower().split()  # 保存原始数据
    list2 = list(set(list1))  # 去重之后的数据
    if (flag == 0):
        print("total  " + str(len(list2)))  # 小文本统计词汇量(功能1不输出words)
    else:
        print("total  " + str(len(list2)) + "  words")  # 统计词汇量
    print("\n")
    dir_a = {}  # 计算频数
    for str1 in list1:
        if str1 != ' ':
            if str1 in dir_a.keys():
                dir_a[str1] = dir_a[str1] + 1
            else:
                dir_a[str1] = 1
    dir_b = sorted((dir_a).items(), key=lambda x: x[1], reverse=True)  # 按照频数排序

执行效果截图:

得意、突破、困难的地方 ;
函数的了解程度:对isalnum(),jion()函数没有认知,导致在检测字符串和连接字符串过程中进行的十分困难。
冗余函数的定义:在项目中,我将去除冗余字符单独定义成一个函数,可以项目中四个功能反复调用,大大简化了程序。

功能2 支持命令行输入英文作品的文件名,请老五亲自录入。

重点/难点 :读文件,使用open函数(open(filename,mode,buffering,encoding)方法),将单词存入字典根据空格数计算词频

重要代码展示:

  try:
        with open(filename, 'r', encoding='UTF-8') as f_obj:
            content = f_obj.read()
            countNumber(content, flag)
    except FileNotFoundError:
        msg = "sorry,the file " + filename + " does not exist."
        print(msg)

执行效果截图:

 得意、突破、困难的地方 :

大文件:对大文件的筛选难度要明显高于功能一的小文件,不过python中read,open函数起了很大作用。

功能3 支持命令行输入存储有英文作品文件的目录名,批量统计。

重点/难点 :

(1)由于没有接触过批量读取文件中所在文档,所以导致耗时巨大。
(2)提取文件夹中类型为.txt文件,输入文件名,并存入列表。

重要代码展示:

找文件:

path = os.listdir(os.getcwd())  # 获取当前目录下所有文件
    folderList = []
    for p in path:
        if os.path.isdir(p):  # 找到所有文件夹

读文件:

for folder in folderList:
        if textFolder == folder:
            path1 = os.listdir(folder)  # 该文件夹下所有文件建成列表
            for i in path1:
                if os.path.splitext(i)[1] == '.txt':
                    fileNameList.append(os.path.splitext(i)[0])

执行效果截图:

 

  得意、突破、困难的地方 :

函数的调用:对os.path函数和splitext()的理解和调用解决的获取文件路径和分离文件后缀的问题,而这些函数在本项目前我并不了解。

功能4 :从控制台读入英文单篇作品,这不是为了打脸老五,而是为了向你女朋
友炫酷,表明你能提供更适合嵌入脚本中的作品(或者如她所说,不过是更灵活
的接口)。

重点/难点 :

(1)对于重定向的理解和实践(这里对老师所提出的四大概念:命令行参数、重定向、标准输入、控制台进行了重新理解)

详细内容求参考:https://www.cnblogs.com/hanhao970620/p/11536985.html

(2)用户输入文件名或者文本内容 捕获问题。

重要代码展示:

    elif sys.argv[1] == "-s":
        if (len(sys.argv) == 3):
            # print(sys.argv)
            flag = 0
            countFileWords(sys.argv[2], flag)
        else:
            # print(sys.argv) #重定向获取文件名
            redirect_words = sys.stdin.read()  # 存储文件名调用方法即可
            flag = 0
            countNumber(redirect_words, flag)

执行效果截图:

 得意、突破、困难的地方 :

对重定向的的实践,'<'在重定向中的意义是标准输入,而使用input()方法可以获取输入内容。

三、PSP表格

总结:

    初见作业时,我在很长一段时间内是崩溃的,因为完全无从下手。出于想要了解和尝试python的目的,决定首次使用python完成项目,进行过程中基本一直是处于一个边学边做的状态。本次项目不仅让我在一定意义上认识到了自我,同时也是对自己的一个很大提高。在不停的焦躁和崩溃同时,我算是想python走出了一小步。该项目完成要感谢很多人,老师,室友,包括大学本科同学等等。在完成项目的过程中,我了解并应用了isalnum()replace()os.listdir()等等等一系列python函数用法,并了解了重定向,命令行参数等相关概念。

 

推荐阅读