2020年秋第三周-词频统计

此作业的要求参见[https://edu.cnblogs.com/campus/nenu/2020Fall/homework/11206]

1、功能一

程序执行结果如下图所示,

2、功能二

录入A_BOYS_TRIP测试

录入A_Year_With_A_Whaler测试

3、功能三

查看文件夹下的英文作品

输入文件名进行测试

(补充截图)

4、功能四

重定向输入测试

5、代码展示

该程序分为几个功能不同的函数,分别实现特定的操作。是我感觉自己做的比较满意的地方
1)、该函数根据输入的文件或文件夹的名称返回文件列表

'''isdir or isfile, return list'''
def filelist(filePath):
    # get file list
    if(os.path.isdir(filePath) == True):
        # filePath is folder
        return os.listdir(filePath)
    elif(os.path.isfile(filePath) == True):
        # filePath is file
        return [filePath]
    return

2)、该函数根据文件地址读取文件内容,并使用正则表达式分割文件内容为词汇列表。其中正则表达式是一大难点,也是一大亮点。

'''read file content'''
def opentxt(filePath):
    with open(filePath, "r", encoding="utf-8") as file:
        txtStr = file.read()
    regEx = re.compile(u'\t|\n|\.|-|;|\)|\(|\?|"')      # genernal
    txtStr = re.sub(regEx, '', txtStr)
    return txtStr.lower().split()                       # translate lower

3)、该函数传入词汇列表,统计词汇出现次数并排序输出

'''word frequency statistics and print sorted'''
def printsort(strList, isfile = True):
    strDict = { }                                       # storage word dict
    for str in strList:
        strDict[str] = strDict.get(str, 0) + 1
    strDictSort = sorted(strDict.items(), key = lambda item : item[1], reverse = True)
    print("total %d words \n" % len(strDictSort))
    # format output
    if(len(strDictSort) > 10):
        for i in range(10):
            print("{:5} {:5}".format(strDictSort[i][0], strDictSort[i][1]))
        if(isfile == False):
            print("----")
    else:
        for i in range(len(strDictSort)):
            print("{:5} {:5}".format(strDictSort[i][0], strDictSort[i][1]))
        if(isfile == False):
            print("----")
    return

4)、重定向执行函数,直接分割传入的保存文本的变量,使用上述printsort()函数排序输出

'''rediect word statistics'''
def redirect(strTxt):
    regEx = re.compile(u'\t|\n|\.|-|;|\)|\(|\?|"')      # genernal
    txtStr = re.sub(regEx, '', strTxt).lower().split()
    printsort(txtStr)
    return

5)、词频统计函数,其中使用上述已介绍的函数,根据传入参数为文件或是文件夹分别执行不同操作

'''word frequency statistics'''
def wordStatistics(filePath):
    filePathList = filelist(filePath)
    if(os.path.isfile(filePath)):
        for file in filePathList:
            printsort(opentxt(file))
    else:
        for file in filePathList:
            print(file.split('.')[0])
            printsort(opentxt(filePath + '\\' + file), False)
    return

6)、主函数

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    # nargs - 命令行参数应当消耗的数目。
    parser.add_argument("filePath", nargs = '?', help = "file or folder path")           # filePath, file or folder
    parser.add_argument('-s',nargs = '?', help = "file path")
    args = parser.parse_args()
    # wordStatistics(args.filePath)
    if ((args.s == None) and (args.filePath == None)):
        redi = sys.stdin.read()         # redirect
        redirect(redi)
        pass
    elif ((args.s == None) and (args.filePath != None)):
        wordStatistics(args.filePath)
        pass
    elif ((args.s != None) and (args.filePath == None)):
        wordStatistics(args.s)
        pass
    pass

6、PSP表

完成程序的四种功能的PSP表

完成该博客任务所用时间的PSP表

7、代码及版本控制

GitHub中代码地址https://github.com/1501106169/nenuWork.git
coding中代码地址https://e.coding.net/nenuwork/nenuwork/nenuWork.git

8、功能五

修改源代码中的输出函数printsort(strList, isfile = True)为printsort(strList, top, leng, isfile=True)

def printsort(strList, top, leng, isfile=True):
    strDict = { }                                       # storage word dict
    for str in strList:
        strDict[str] = strDict.get(str, 0) + 1
    strDictSort = sorted(strDict.items(), key = lambda item : item[1], reverse = True)
    print("total %d words \n" % len(strDictSort))
    # format output
    for i in range(len(strDictSort)):
        if(top <= 0): break
        if(len(strDictSort[i][0]) == leng or leng == -1):
           print("{:5} {:5}".format(strDictSort[i][0], strDictSort[i][1]))
           top -= 1
    if(isfile == False):
        print("----")
    return

主函数修改为

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    # nargs - 命令行参数应当消耗的数目。
    parser.add_argument("filePath", nargs = '?', help = "file or folder path")          # filePath, file or folder
    parser.add_argument('-s',nargs = '?', help = "file path")
    parser.add_argument('-l', nargs = '?', type = int, help = "word length", default = -1)          # word length
    parser.add_argument('-t', nargs = '?', type = int, help = "top number", default = 10)           # top number
    args = parser.parse_args()
    # 输出单词长度5排名前十
    # rewf test.txt -l 5 -t 10
    # wordStatistics(args.filePath)

    if ((args.s == None) and (args.filePath == None)):
        redi = sys.stdin.read()         # redirect
        redirect(redi, top, leng)
        pass
    elif ((args.s == None) and (args.filePath != None)):
        wordStatistics(args.filePath, args.t, args.l)
        pass
    elif ((args.s != None) and (args.filePath == None)):
        wordStatistics(args.s, args.t, args.l)
        pass
    pass

命令行参数-l表示需要统计的单词长度,默认全部;-t表示需要输出的top单词数,默认为10个

测试结果

posted @ 2020-09-20 00:39  韩亚光  阅读(459)  评论(3编辑  收藏  举报