邏輯訓練基礎 ---單詞統計,並列出topN


需求:
讀取給定文本文件,統計單詞,計算TOP 10
示例文件爲sample.txt,對其進行單詞統計,不區分大小寫,並顯示單詞重複最多的10個單詞。
思路
1.按行統計,每一行單獨做個列表
2.特殊字符的轉換
3.忽略大小寫

解法1:查找與替換

核心思想就是過濾與替換:
1.定義特殊字符列表
2.對每一行進行操作,然後將每行中的特殊字符替換爲空格,返回列表
3.使用split()來解構每個列表中的單詞

def format(s:str):
    word_list=[]
    key = set(r"""!()-+*'"/\#.[]{}, \n""") #確定好哪些特殊字符需要進行轉換
    format_word = s.lower() #全部化成小寫
    for i in format_word: #對該行進行處理
        if i in key:
            word_list.append(' ') #特殊字符換成空格然後加入列表
        else:
            word_list.append(i) #一般字符直接加入列表
    temp = ''.join(word_list).split() #解構列表,按空格分割,返回新列表,沒有這一步,下面統計的就只是字母
    for j in temp:                    
        if j not in word_dict:
            word_dict[j] = 1
        else:
            word_dict[j] += 1

if __name__ == '__main__':
    word_dict={}
    filename = './sample.txt'
    with open(filename, 'r', encoding='utf-8') as f:
        for line in f:
            format(line)
    sort_dict = sorted(word_dict.items(), key=lambda x:x[1],reverse=True) #排序
    print(sort_dict[:10])

解法2:字符過濾

1.使用enumerate()來解構每一行,返回包含單詞的列表
2.過濾不需要的字符
3.對每個列表中的每個字符進行判斷,過濾不需要的字符

def format(s:str):
    char = s.lower()
    key = set("""!()-+*'"/\#[]{},\n""")
    word_list = []
    for i, v in list(enumerate(char)): #解構每一行,返回列表,列表元素爲元組(索引,單詞)
        if v in key:
            i += 1
            continue
        elif v == '.': #點號可能是方法的調用(re.compile()),因此點號兩邊的單詞都要分開計算
            word_list.append(' ')
            i += 1
        else:
            word_list.append(v)
            i += 1
    temp = ''.join(word_list).split()

    for j in temp:
        if j not in word_dict:
            word_dict[j]  = 1
        else:
            word_dict[j] += 1

if __name__ == '__main__':
    word_dict={}
    filename = './sample.txt'
    with open(filename, 'r', encoding='utf-8') as f:
        for line in f:
            format(line)

    sort_dict = sorted(word_dict.items(), key=lambda x:x[1],reverse=True) #排序
    print(sort_dict[:10])

解法3:調用re模塊

直接使用re模塊:最簡單
1.調用re.findall對每一行進行處理,找出每個單詞,返回列表

import time
import datetime
import re

with open('sample.txt') as S:
    word_dict={}
    for line in S:
        pattern = re.compile(r"[a-z]*", re.I) #定義匹配表達式,忽略大小寫
        word_list = pattern.findall(line) #找出每行的單詞
        for word in word_list:
            if word not in word_dict:
                word_dict[word] = 1
            else:
                word_dict[word] +=1
    word_dict.pop('') #去除空字符
    sort_list = list(sorted(word_dict.items(), key=lambda x:x[1],reverse=True))
    print(sort_list[0:10])	
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章