項目起因及意義
起初在瀏覽知乎時看見一篇文章覺得很有意思(用Python分析《紅樓夢》),此文章較長,題主採用了一系列方法分析紅樓夢前八十回和後四十回是否為同一個人所寫,雖然題主貼上了部分實現的截圖,我就想試著來實現一遍,但由於目前能力有限,一些機器學習演算法不夠瞭解,加上python又是剛剛學,所以我打算先結合《Python語言程式設計基礎》這本書上的例子—-《三國演義》人物出場統計來作為此系列部落格第一篇,後續等能力足矣會陸陸續續補上。 前期準備
三國裡人物眾多,我們需要對人物出場次數統計,中文文章需要分詞才能進行詞頻統計,這裡我們用到第三方庫jieba,這裡我就不提供下載方法了,然後我們需要《三國演義》的電子書網上都有,很容易下載。 項目進行 將文本資料匯入pycharm
import jiebatxt = open("三國演義.txt", "r", encoding="gb18030").read()
這裡的編碼格式一開始我是按照書上‘utf-8’格式讀取,發現會亂碼,後來在pycharm裡面用‘gbk’格式能讀出常值內容,但是個別字元識別不出來,就去百度到“gb18030”比gbk範圍更廣,這裡我成功讀入。如果你此時還是讀入不了可以寫成下面形式
txt = open("三國演義.txt", "r", encoding="gb18030",errors="ignore").read()
2.完整代碼實現
import jiebaexcludes = {"將軍", "卻說", "荊州", "二人", "不可", "不能", "如此", "商議", "如何", "主公", "軍士", "左右", "軍馬", "引兵", "次日", "大喜", "天下", "東吳", "於是", "今日", "不敢", "魏兵","人馬", "陛下", "一人"}txt = open("三國演義.txt", "r", encoding="gbk").read()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[rword] = counts.get(rword, 0) + 1for 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 (word, count)
excludes裡面定義了一些出現次數較多但不是人名的詞,這裡主要語句就是 counts[rword] = counts.get(rword, 0) + 1 這一句字典類型的counts,如果word在counts中,返回word對應的值,否則返回0。後面用sort()函數和匿名函數lambda()進行排序,這裡字典沒有順序,需要先轉化為清單類型。輸出結果如下:
3.匯出資料檔案
fo = open("三國人物出場次數.txt", "a")for i in range(10): word, count=items[i] word = str(word) count = str(count) fo.write(word) fo.write(' ') fo.write(count) fo.write('\n') print (word, count)print(items)fo.close()
這裡我們將資料匯入到 三國人物出場次數.txt 這個檔案裡面。
4.將資料畫出泡泡圖
總結
由此可知“曹操“,“ 孔明””劉備”是出場最多的人,這些只是簡單的資料分析,作為此系列部落格的開頭篇,隨著學習希望自己能實現完整用python分析四大名著。