1. 程式人生 > 實用技巧 >詞頻統計例項

詞頻統計例項

目錄

英文(詞頻統計)

def getText():  # 編寫獲得文字函式
    txt = open("C:\\Users\\dell\\Desktop\\a.txt", mode='tr').read()  # 開啟文字檔案只讀
    txt = txt.lower()  # 將所有的英文字元變成小寫
    for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_’{|}`':
        txt = txt.replace(ch, " ")  # 用空格替換以上的特殊符號
    return txt  # 返回歸一化處理後的文字
hamletTxt = getText()  # 讀取檔案
words = hamletTxt.split()  # 由於是以空格分隔,所以採用.split變成一個列表
counts = {}  # 定義一個字典,用對映關係可以標記每個單詞出現的次數
for word in words:  # 在words列表中逐一取出每一個單詞
    counts[word] = counts.get(word, 0) + 1  # .get()函式用word作為鍵索引字典,如果在字典就返回已有次數加一,不在則為0+1(相當於往字典新加了一個元素)
items = list(counts.items())  # 將counts變成列表型別
items.sort(key=lambda x: x[1], reverse=True)  # 對列表按照鍵值對的2個元素的第二個元素進行由大到小的排序
for i in range(10):  # 前10名
    word, count = items[i]  # 將前10名的單詞和次數儲存在items中
    print("{0:<10}{1:>5}".format(word, count))  # 打印出前10的單詞和次數

中文(三國演義 詞頻統計)

  • 不同:中文不存在大小寫問題,使用jieba庫進行分詞,不用考慮標點符號
import jieba
txt = open("C:\\Users\\dell\\Desktop\\a.txt","r",encoding="utf-8").read()
words = jieba.lcut(txt)
counts = {}#建立一個字典
for word in words:
    if len(word) == 1:
        continue
    else:
        counts[word] = counts.get(word,0) + 1#計數
items = list(counts.items())#轉換成列表
items.sort(key=lambda x:x[1],reverse=True)
for i in range(15):
    word,count = items[i]
    print("{0:<10}{1:>5}".format(word,count))#列印

詞頻統計2.0->三國演義人物出場統計

  • 排除上圖紅筆勾畫的與人物無關的詞語如將軍,卻說...

  • 整合詞意相同的人名,如孔明,諸葛亮,孔明說...

import jieba
txt = open("C:\\Users\\dell\\Desktop\\a.txt","r",encoding="utf-8").read()
excludes = {"將軍","卻說","荊州","二人","不可","不能","如此"}#把不是人名的詞加到集合excludes中
words = jieba.lcut(txt)
counts = {}#建立一個字典
for word in words:
    if len(word) == 1:
        continue
    elif word == "諸葛亮" or word == "孔明曰":
        rword = "孔明"
    elif word == "關公" or word == "雲長":
        rword = "關羽"
    elif word == "玄德" or word == "玄德曰":
        rword = "劉備"#整合操作
    elif word == "孟德" or word == "丞相":
        rword = "曹操"#整合操作
    else:
        rword = word
        counts[word] = counts.get(word,0) + 1#計數
for word in excludes:
    del counts[word]  # 排除操作
items = list(counts.items())#轉換成列表
items.sort(key=lambda x:x[1],reverse=True)
for i in range(10):
    word,count = items[i]
    print("{0:<10}{1:>5}".format(word,count))#列印
  • 結果優化:可以經過不斷地除錯,把結果中不是人名的詞加到encludes集合中,最終可得到期望的結果

詞雲實現

import jieba
import wordcloud#詞雲庫
f = open("C:\\Users\\dell\\Desktop\\a.txt",encoding="utf-8")
t = f.read()
f.close()
ls = jieba.lcut(t)#分詞後儲存到ls
txt = " ".join(ls) #用空格將列表的每一個元素連線起來
w = wordcloud.WordCloud( font_path = "msyh.ttc",width = 1000,height = 700,background_color = "white")#繪製詞雲
w.generate(txt)#載入文字
w.to_file("grwordcloud.png")#生成詞雲檔案

更多操作:1)限制字數:在繪製詞雲程式碼中加max_words = 10
2)底部更有形:程式碼第三行新增from imageio import imread第四行加mask = imread(“圖片”),繪製詞雲程式碼第一個引數後加mask = mask