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個

測試結果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM