詞頻統計例項
阿新 • • 發佈:2020-08-16
目錄
英文(詞頻統計)
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