數據分析、機器學習? 用Python分析 慶余年 里的人物關係

寫這篇文章的原因是因為我上的數據分析的慕課要交結課作業啦!碰巧前一段時間有看到了這個:Python與擇天記,我就想試試看能不能自己實現一下文中的功能,最後的確也成功了,(雖然踩了不少坑)~

慶余年的人物形象(來自百度百科)

沒有看過原著的同學可以看一下這張圖,理清一下人物關係

我們的目的就是利用Python的gensim模塊來分析上述的人物關係,

從而了解一下「機器學習」到底是怎麼一回事

當然,我也只是十分淺薄的了解了一下,

所以都是皮毛,皮毛。

開始分析:

首先我們先做好分析需要的準備工作:

  • 001.txt (慶余年小說文本)
  • name.txt(慶余年主要出場人物名單,方便分詞的時候用)
  • stopwords.txt (常用的中文停用詞
  • matplotlib (用來展示圖)
  • wordcloud (用來做詞雲)
  • cn.ttf (我自己下的中文字體文件)

好了,基本上我們需要的東西都在這裡了

下面開始敲代碼吧!

數據的讀入和人物出現頻率

# 從百度百科下載的文中的人物名字,並篩選出重複的名字,保存在列表裡with open(name.txt, r) as f: names = list(set(name.strip() for name in f.readlines()))# 讀入整個慶余年文本的內容:with open(001.txt, r, encoding=gbk) as f: content = list(line.strip() for line in f.readlines())# 我們從最簡單的做起,統計人物出先次數:def find_pepple_showup_cont(num=10): 對比統計人物姓名出現的次數, 並返回出現次數最多的前Num個人 novel = .join(content) showup_counts = [] for name in names: # 這裡從文章統計處每個名詞出現的次數後,保存在一個列表裡返回 showup_counts.append([name, novel.count(name)]) # 我們將列表通過出現次數排序 showup_counts.sort(key=lambda v: v[1], reverse=True) return showup_counts[:num]# 簡單的展示一下數據showup_10 = find_pepple_showup_cont()print(showup_10)# 用DataFrame展示:import pandas as pdshow = pd.DataFrame(showup_10, columns=[names, counts])print(show)# 用matplotlib繪製直方圖展示:import matplotlib.pyplot as pltfrom pylab import mpl# 設置中文子字體mpl.rcParams[font.sans-serif] = [SimHei]# 展示的姓名和數據data = list(show.counts)index = list(show.names)# 繪製直方圖plt.bar(range(len(data)), data, tick_label=index)plt.xlabel(出現的人物)plt.ylabel(出現的次數)plt.title(慶余年人物出現頻次圖)plt.savefig(001.jpg)

結果是這樣的:

這樣太不直觀了,我們做成圖片:

主人公范閑的出場次數,簡直爆表了!

不然也不叫主人公了,對吧?

當然,從這裡我們可以得到一個結論:

這本小說是以 第三人稱 寫的

找出文中關鍵詞和製作圖云:

# 利用結巴分詞來進行關鍵詞查找import jiebaimport jieba.analyseimport matplotlib.pyplot as plt# 獲取關鍵詞 最多的二十個print(正在分析文章中的關鍵詞!)tags = jieba.analyse.extract_tags( .join(content), topK=20, withWeight=True)print(關鍵詞:)for k, v in tags: print(關鍵詞:{} 權重:{:.3f}.format(k, v))# 利用關鍵詞製作圖云:from wordcloud import WordCloudtxt = .join([v + , for v, x in tags])wordcloud = WordCloud(background_color=white, font_path=cn.ttf, max_font_size=40).generate(txt)plt.imshow(wordcloud)plt.axis(off)plt.show()wordcloud.to_file(qun_gjc.jpg)

效果如下:

做成圖雲之後:

從這寫「慶國」「北齊」這些關鍵詞中,

我們可以輕易的分析得出:

這是一部描寫 「家國」之間紛爭的小說,

從「皇子」「皇帝」等關鍵詞我們可以得出

這本小說大概率是一部架空的「歷史文學」

多半還參雜著「皇權的爭奪

分詞和訓練模型

# 將關鍵詞加入結巴分詞for tag, x in tags: jieba.add_word(tag)# 將小說中的姓名加入結巴分詞的關鍵詞for name in names: jieba.add_word(name)# 加入中文停用詞列表with open(stopwords.txt, r) as f: STOPWORD = [word.strip() for word in f.readlines()]# 開始進行分詞print(開始進行分詞。。。。)# 我們期待的分詞結果是保存著小說每一句話的分詞結果# 即一個二元數組,這將方便我們一會進行模型的訓練sentence = []for line in content: seg_list = list(jieba.cut(line, cut_all=False)) unique_list = [] # 開始去除停用詞 for seg in seg_list: if seg not in STOPWORD: unique_list.append(seg) sentence.append(unique_list)print(分詞完畢)# 開始訓練模型import gensim# Gensim中的Word2Vec期望的輸入是經過分詞的 句子列表。即是一個包含句子分詞結果的二維數組print(開始訓練模型。。。這個時間很長,去喝杯咖啡吧)model = gensim.models.Word2Vec( sentence, size=100, window=5, min_count=4, workers=4)print(訓練完畢。正在將模型保存到本地)model.save(qyn.model)print(Okey )

這個部分沒有什麼好說的,

需要注意的我都寫在注釋里啦

調用模型:

這裡我們就要用到 Word2Vec最著名的 語意推斷分析相似辭彙 的功能了

利用訓練好的模型進行文本相似性分析import gensim# 讀入訓練好的模型model = gensim.models.Word2Vec.load(qyn.model)# 我們來找找和范閑類似的人物print(===============和范閑類似的人物=================)for s in model.most_similar(positive=[范閑])[:5]: print(s)print(

)# 我們來找找武功高強的人物print(===============武功高強的人物=================)for s in model.most_similar(positive=[葉流雲])[:5]: print(s)print(

)# 我們來找到范縣的徒弟們print(===============范閑的徒弟們?=================)for s in model.most_similar(positive=[楊萬里]): print(s)print(

)# 我們來看一下侯季常到底算不算范閑的徒弟?print(===============候季常到底真的叛變了?=================)child = model.most_similar(positive=[楊萬里,侯季常],negative=[范閑],topn=1)print(child)print(

)# 我們來找一下慶帝的老婆到底是不是范閑她媽?# 也就是讓程序幫我們預測一下葉輕眉在某種意義上是不是慶弟的老媽print(===============慶帝的真正的老婆=================)wife = model.most_similar(positive=[范閑,慶帝],negative=[林婉兒],topn=1)print(wife)

結果:

從結果中我們可以分析出一下結論:

  • 言云冰 不僅是范閑得力的下屬,還是他的好基友
  • 范閑神的陳萍萍的真傳 (可以說程萍萍是范閑的教父)
  • 慶帝的"老婆"其實是 葉流雲 (對頭?)
  • 哥哥對弟弟真的起了很大的教育意義(范思澈)
  • 要麼我的模型建立的不太完美,要麼就是老貓寫的文章思路不清
  • 當然,我猜是前者。。。。。。

最後:

對於數據分析這方面,

我一直都不是很擅長,

這次實踐相當一次鍛煉了。

希望大家也能從中學到一些東西!

本篇文章的代碼在這:Ehco1996/PythonPractice

每天的學習記錄都會 同步更新到:

微信公眾號: findyourownway

知乎專欄:從零開始寫Python爬蟲 - 知乎專欄

blog : www.ehcoblog.ml

Github: Ehco1996/Python-crawler

推薦閱讀:

毛姆|潛伏在文學圈的名偵探
海的女兒
尋車記
我們寫小說的招誰惹誰了?咪咕閱讀你臉紅嗎?
最佳拍檔

TAG:Python | 机器学习 | 小说 |