⑴ python爬蟲之九陰真經
用Python 探索 金庸筆下的江湖!
帶你用python看小說, 娛樂 學習兩不誤。
涉及的知識點有:
本文從傳統匹配邏輯分析過渡到機器學習的詞向量,全方位進行文本分析,值得學習,干貨滿滿。( 文末點擊閱讀原文 )
以前金庸小說的網站有很多,但大部分已經無法訪問,但由於很多金庸迷的存在,新站也是源源不斷出現。我近期通過網路找到的一個還可以訪問的金庸小說網址是: ==
不過我已經准備好已經採集完成的數據,大家可以直接下載數據,跳過本章的內容。
數據源下載地址:https://gitcode.net/as604049322/blog_data
下面首先獲取這15部作品的名稱、創作年份和對應的鏈接。從開發者工具可以看到每行的a標簽很多,我們需要的節點的特徵在於後續臨近節點緊接著一個創作日期的字元串:
那麼我們就可以通過遍歷所有的a標簽並判斷其後續一個臨近節點的內容是否符合日期格式,最終完整下載代碼為:
可以按照創作日期排序查看:
名稱創作時間網址 書劍恩仇錄1955年/shujianenchoulu/ 碧血劍1956年/bixuejian/ 射鵰英雄傳1957—1959年/shediaoyingxiongzhuan/ 神鵰俠侶1959—1961年/shendiaoxialv/ 雪山飛狐1959年/xueshanfeihu/ 飛狐外傳1960—1961年/feihuwaizhuan/ 白馬嘯西風1961年/maxiaoxifeng/ 倚天屠龍記1961年/yitiantulongji/ 鴛鴦刀1961年/yuanyang/ 天龍八部1963—1966年/tianlongbabu/ 連城訣1963年/lianchengjue/ 俠客行1965年/xiakexing/ 笑傲江湖1967年/xiaoaojianghu/ 鹿鼎記1969—1972年/ludingji/ 越女劍1970年/yuenvjian/
下面看看章節頁節點的分布情況,以《雪山飛狐》為例:
同時可以看到部分小說的節點出現了倒序的情況,我們需要在識別出倒序時將其正序,完整代碼:
測試一下:
可以看到章節已經順利的正序排列。
小說每一章的詳細頁最後一行的數據我們不需要:
下載每章內容的代碼:
然後我們就可以批量下載全部小說了:
為了更好分析金庸小說,我們還需要採集金庸小說的人物、武功和門派,個人並沒有找到還可以訪問相關數據的網站,於是自行收集整理了相關數據:
相關數據都以如下格式存儲,例如金庸小說的人物:
武功:
數據源下載地址:https://gitcode.net/as604049322/blog_data
定義一個載入小說的方法:
首先我們載入人物數據:
可以預覽一下天龍八部中的人物:
下面我們尋找一下每部小說的主角,統計每個人物的出場次數,顯然次數越多主角光環越強,下面我們看看每部小說,出現次數最多的前十個人物:
上述結果用文本展示了每部小說的前5個主角,但是不夠直觀,下面我用pyecharts的樹圖展示一下:
顯然,《神鵰俠侶》中的楊過和小龍女,《天龍八部》中的蕭(喬)峰,段譽,虛竹,《射鵰英雄傳》的郭靖和黃蓉,《倚天屠龍記》的張無忌和趙敏 都是主角光環最強的角色。
使用上述相同的方法,分析各種武功的出現頻次,首先載入武功數據:
定義計數方法:
每部小說頻次前5的武功可視化:
門派分析
載入數據並獲取每部小說前10的門派:
可視化:
還可以測試一下樹形圖:
綜合統計
下面我們編寫一個函數,輸入一部小說名,可以輸出其最高頻的主角、武功和門派:
例如查看天龍八部:
詞雲圖分析
可以先添加所有的人物、武功和門派作為自定義詞彙:
這里我們僅提取詞長度不小於4的成語、俗語和短語進行分析,以天龍八部這部小說為例:
修改上述代碼,查看《射鵰英雄傳》:
神鵰俠侶:
主角相關劇情詞雲
我們知道《神鵰俠侶》這部小說最重要的主角是楊過和小龍女,我們可能會對於楊過和小龍女之間所發生的故事很感興趣。如果通過程序快速了解呢?
我們考慮把《神鵰俠侶》這部小說每一段中出現楊過及小龍女的段落進行jieba分詞並製作詞雲。
同樣我們只看4個字以上的詞:
這里的每一個詞都能聯想到發生在楊過和小龍女背後的一個故事。
同樣的思路看看郭靖和黃蓉:
最後我們看看天龍八部的三兄弟相關的詞雲:
關系圖分析
金庸小說15部小說中預計出現了1400個以上的角色,下面我們將遍歷小說的每一段,在一段中出現的任意兩個角色,都計數1。最終我們取出現頻次最高的前200個關系對進行可視化。
完整代碼如下:
這次我們生成了HTML文件是為了更方便的查看結果,前200個人物的關系情況如下:
門派關系分析
按照相同的方法分析所有小說的門派關系:
Word2Vec分析
Word2Vec 是一款將詞表徵為實數值向量的高效工具,接下來,我們將使用它來處理這些小說。
gensim 包提供了一個 Python 版的實現。
之前我有使用 gensim 包進行了相似文本的匹配,有興趣可查閱:《批量模糊匹配的三種方法》
首先我要將所有小說的段落分詞後添加到組織到一起(前面的程序可以重啟):
接下面我們使用Word2Vec訓練模型:
我這邊模型訓練耗時15秒,若訓練耗時較長可以把訓練好的模型存到本地:
以後可以直接從本地磁碟讀取模型:
有了模型,我們可以進行一些簡單而有趣的測試。
首先看與喬(蕭)峰相似的角色:
再看看與阿朱相似的角色:
除了角色,我們還可以看看門派:
還可以看看與降龍十八掌相似的武功秘籍:
在 Word2Vec 的模型里,有過「中國-北京=法國-巴黎」的例子,我們看看"段譽"和"段公子"類似於喬峰和什麼的關系呢?
類似的還有:
查看韋小寶相關的關系:
門派武功之間的關系:
之前我們使用 Word2Vec 將每個詞映射到了一個向量空間,因此,我們可以利用這個向量表示的空間,對這些詞進行聚類分析。
首先取出所有角色對應的向量空間:
聚類演算法有很多,這里我們使用基本的Kmeans演算法進行聚類,如果只分成3類,那麼很明顯地可以將眾人分成主角,配角,跑龍套的三類:
我們可以根據每個類別的角色數量的相對大小,判斷該類別的角色是屬於主角,配角還是跑龍套。
下面我們過濾掉眾龍套角色之後,重新聚合成四類:
每次運行結果都不一樣,大家可以調整類別數量繼續測試。從結果可以看到,反派更傾向於被聚合到一起,非正常姓名的人物更傾向於被聚合在一起,主角更傾向於被聚合在一起。
現在我們採用層級聚類的方式,查看人物間的層次關系,這里同樣龍套角色不再參與聚類。
層級聚類調用 scipy.cluster.hierarchy 中層級聚類的包,在此之前先解決matplotlib中文亂碼問題:
接下來調用代碼為:
然後我們可以得到金庸小說宇宙的人物層次關系地圖,結果較長僅展示一部分結果:
當然所有小說混合產生的平行宇宙中,人物關系變得有些混亂,讀者有興趣可以拿單本小說作層次分析,就可以得到較為准確的人物層次關系。
對各種武功作與人物層次聚類相同的操作:
結果較長,僅展示部分結果:
可以看到,比較少的黃色部分明顯是主角比較厲害的武功,而綠色比較多的部分基本都是配角的武功。
最後我們對門派進行層次聚類:
比較少的這一類,基本都是在某幾部小說中出現的主要門派,而大多數門派都是打醬油的。
本文從金庸小說數據的採集,到普通的頻次分析、劇情分析、關系分析,再到使用詞向量空間分析相似關系,最後使用scipy進行所有小說的各種層次聚類。
⑵ 當下熱度最高的編程語言Python究竟是怎樣誕生的
Python誕生與發展Python作為當下大火的一門編程語言,深受眾多程序員的喜愛,而追溯其發展始末還得從上世紀說起。Python是Guido Van Rossum (荷蘭人吉多·范羅蘇姆)於1989年開發推出。而開發這一編程語言背後還有個不為人知的小故事。1989年聖誕節期間,在阿姆斯特丹的吉多深感無聊與苦悶,作為一名資深的編程愛好者他決定開發一個新的腳本解釋程序,作為編程界慣用的ABC語言的一種繼承。
Python因其奉行極簡主義,易於讀寫受眾多人青睞。更令人稱道的是Python作為一種開源軟體不用花一分錢就能夠實現編輯,同時Python兼容多平台,學習強度相對於其他編程語言而言是普遍公認的簡單,在實際生活的各個領域均得到了廣泛的應用。
⑶ 使用 Python 和 Pygame 模塊構建一個游戲框架
在我的 這系列的第一篇文章 中, 我已經講解如何使用 Python 創建一個簡單的、基於文本的骰子 游戲 。這次,我將展示如何使用 Python 模塊 Pygame 來創建一個圖形化 游戲 。它將需要幾篇文章才能來得到一個確實做成一些東西的 游戲 ,但是到這系列的結尾,你將更好地理解如何查找和學習新的 Python 模塊和如何從其基礎上構建一個應用程序。
在開始前,你必須安裝 Pygame 。
有幾種方法來安裝 Python 模塊,但是最通用的兩個是:
兩個方法都工作的很好,並且每一個都有它自己的一套優勢。如果你是在 Linux 或 BSD 上開發,可以利用你的發行版的軟體存儲庫來自動和及時地更新。
然而,使用 Python 的內置軟體包管理器可以給予你控制更新模塊時間的能力。而且,它不是特定於操作系統的,這意味著,即使當你不是在你常用的開發機器上時,你也可以使用它。pip 的其它的優勢是允許本地安裝模塊,如果你沒有正在使用的計算機的管理許可權,這是有用的。
如果 Python 和 Python3 都安裝在你的系統上,你想使用的命令很可能是 pip3,它用來區分 Python 2.x 的 pip 的命令。如果你不確定,先嘗試 pip3。
pip 命令有些像大多數 Linux 軟體包管理器一樣工作。你可以使用 search 搜索 Python 模塊,然後使用 install 安裝它們。如果你沒有你正在使用的計算機的管理許可權來安裝軟體,你可以使用 --user 選項來僅僅安裝模塊到你的家目錄。
Pygame 是一個 Python 模塊,這意味著它僅僅是一套可以使用在你的 Python 程序中的庫。換句話說,它不是一個像 IDLE 或 Ninja-IDE 一樣可以讓你啟動的程序。
一個電子 游戲 需要一個背景設定:故事發生的地點。在 Python 中,有兩種不同的方法來創建你的故事背景:
你的背景僅是一張圖片或一種顏色。你的電子 游戲 人物不能與在背景中的東西相互作用,因此,不要在後面放置一些太重要的東西。它僅僅是設置裝飾。
要開始一個新的 Pygame 工程,先在計算機上創建一個文件夾。 游戲 的全部文件被放在這個目錄中。在你的工程文件夾內部保持所需要的所有的文件來運行 游戲 是極其重要的。
一個 Python 腳本以文件類型、你的姓名,和你想使用的許可證開始。使用一個開放源碼許可證,以便你的朋友可以改善你的 游戲 並與你一起分享他們的更改:
然後,你告訴 Python 你想使用的模塊。一些模塊是常見的 Python 庫,當然,你想包括一個你剛剛安裝的 Pygame 模塊。
由於你將用這個腳本文件做很多工作,在文件中分成段落是有幫助的,以便你知道在哪裡放代碼。你可以使用塊注釋來做這些,這些注釋僅在看你的源文件代碼時是可見的。在你的代碼中創建三個塊。
接下來,為你的 游戲 設置窗口大小。注意,不是每一個人都有大計算機屏幕,所以,最好使用一個適合大多數人的計算機的屏幕大小。
這里有一個方法來切換全屏模式,很多現代電子 游戲 都會這樣做,但是,由於你剛剛開始,簡單起見僅設置一個大小即可。
在腳本中使用 Pygame 引擎前,你需要一些基本的設置。你必須設置幀頻,啟動它的內部時鍾,然後開始 (init)Pygame 。
現在你可以設置你的背景。
在你繼續前,打開一個圖形應用程序,為你的 游戲 世界創建一個背景。在你的工程目錄中的 images 文件夾內部保存它為 stage.png 。
這里有一些你可以使用的自由圖形應用程序。
你的圖像不必很復雜,你可以以後回去更改它。一旦有了它,在你文件的 Setup 部分添加這些代碼:
如果你僅僅用一種顏色來填充你的 游戲 的背景,你需要做的就是:
你也必須定義顏色以使用。在你的 Setup 部分,使用紅、綠、藍 (RGB) 的值來創建一些顏色的定義。
至此,你理論上可以啟動你的 游戲 了。問題是,它可能僅持續了一毫秒。
為證明這一點,保存你的文件為 your-name_game.py(用你真實的名稱替換 your-name)。然後啟動你的 游戲 。
如果你正在使用 IDLE,通過選擇來自 「Run」 菜單的 「Run Mole」 來運行你的 游戲 。
如果你正在使用 Ninja,在左側按鈕條中單擊 「Run file」 按鈕。
你也可以直接從一個 Unix 終端或一個 Windows 命令提示符中運行一個 Python 腳本。
如果你正在使用 Windows,使用這命令:
啟動它,不過不要期望很多,因為你的 游戲 現在僅僅持續幾毫秒。你可以在下一部分中修復它。
除非另有說明,一個 Python 腳本運行一次並僅一次。近來計算機的運行速度是非常快的,所以你的 Python 腳本運行時間會少於 1 秒鍾。
為強制你的 游戲 來處於足夠長的打開和活躍狀態來讓人看到它(更不要說玩它),使用一個 while 循環。為使你的 游戲 保存打開,你可以設置一個變數為一些值,然後告訴一個 while 循環只要變數保持未更改則一直保存循環。
這經常被稱為一個「主循環」,你可以使用術語 main 作為你的變數。在你的 Setup 部分的任意位置添加代碼:
在主循環期間,使用 Pygame 關鍵字來檢查鍵盤上的按鍵是否已經被按下或釋放。添加這些代碼到你的主循環部分:
也是在你的循環中,刷新你世界的背景。
如果你使用一個圖片作為背景:
如果你使用一種顏色作為背景:
最後,告訴 Pygame 來重新刷新屏幕上的所有內容,並推進 游戲 的內部時鍾。
保存你的文件,再次運行它來查看你曾經創建的最無趣的 游戲 。
退出 游戲 ,在你的鍵盤上按 q 鍵。
在這系列的 下一篇文章 中,我將向你演示,如何加強你當前空空如也的 游戲 世界,所以,繼續學習並創建一些將要使用的圖形!
via: https://opensource.com/article/17/12/game-framework-python
作者: Seth Kenlon 選題: lujun9972 譯者: robsean 校對: wxy
⑷ python能做什麼
python的用途:
Python的優勢有必要作為第一步去了解,Python作為面向對象的腳本語言,優勢就是數據處理和挖掘,這也註定了它和AI、互聯網技術的緊密聯系。
網路爬蟲。顧名思義,從互聯網上爬取信息的腳本,主要由urllib、requests等庫編寫,實用性很強,小編就曾寫過爬取5w數據量的爬蟲。在大數據風靡的時代,爬蟲絕對是新秀。
人工智慧。AI使Python一戰成名,AI的實現可以通過tensorflow庫。神經網路的核心在於激活函數、損失函數和數據,數據可以通過爬蟲獲得。訓練時大量的數據運算又是Python的show time。
(4)用python編一個故事擴展閱讀:
Python開發人員盡量避開不成熟或者不重要的優化。一些針對非重要部位的加快運行速度的補丁通常不會被合並到Python內。在某些對運行速度要求很高的情況,Python設計師傾向於使用JIT技術,或者用使用C/C++語言改寫這部分程序。可用的JIT技術是PyPy。
Python是完全面向對象的語言。函數、模塊、數字、字元串都是對象。並且完全支持繼承、重載、派生、多繼承,有益於增強源代碼的復用性。
Python支持重載運算符和動態類型。相對於Lisp這種傳統的函數式編程語言,Python對函數式設計只提供了有限的支持。有兩個標准庫(functools, itertools)提供了Haskell和Standard ML中久經考驗的函數式程序設計工具。
⑸ 少兒編程都學的啥啊,對於三歲的孩子來說難不難
首先來說Scratch。
Scratch是一款可以製作游戲、動畫、工具的圖形編程。簡單地說,Scratch能夠通過有限的命令、代碼塊,輸出各種、甚至無限的可能,一旦掌握了Scratch,孩子們就能自由自在地揮灑它們無限的創意,享受創造的樂趣。而且Scratch編程的操作自主性非常高,不像學科輔導,需要通過老師一題一題的教導來完成的。在Scratch編程學習的過程中,老師更多承擔的是輔助的角色,通過引導式教學不斷啟發孩子的思維,充分釋放孩子們的想像力和創造力。
Scratch是一種用解構和重構世界的數字化工具,學習Scratch對孩子的思維模式的完善有很大幫助。未來AI的發展,會讓很多職業消失,孩子們需要掌握用數字化的思維去理解這個世界,這樣才能和AI交流,控制AI來輔助自己高效的處理事務,而不是被替代。
接下來我們再來說說Python。
少兒編程的教學難點在於用兒童理解的語言向孩子們傳達編程內容。Python簡單易入門的特點,對於孩子們來說十分友好。比起C語言、C++來說,Python更容易被孩子們接受,而且更具親和力,容錯率也更低。基於上述特性,Python非常利於孩子們良好的學習編碼習慣的養成。
值得一提的是,Python有更多的拓展素材,更多的拓展素材意味著孩子們可以利用Python做更多的事,完成更多的高級任務,實現完整應用程序所需的各種功能。等到小朋友們逐漸具備少兒編程這種計算編程能力之後,他們自主學習的能力和理解能力將會得到極大的提高。
⑹ 有個python的程序看不懂,如下是代碼,求高手解析
說黑客的哥哥牛逼了,陰謀論專家嗎,zip只是壓縮序列,你這故事講的,這一看people.append(full_name)---添加名字,我沒判斷錯的話應該是一個存,找名字的簡單程序。。不知道哪兒看不懂,也不知道你的基礎是怎麼樣,我就標注詳細一點吧,首先格式調整一下,函數和循環不空格子多難讀
def init(data):
data['first']={}
data['second']={}
data['last']={} #init(data)應該很好理解吧,生成一個空值的字典。#
def lookup(data,lable,name):
return data[lable].get(name) #應該是字典里的標簽(frist或second等)下獲取一個含有name的名字返回 #
def store(data,full_name):
names=full_name.split() #把名字分片 比如『你奶奶』變 '你','奶','奶' #
lables='first','second','last' #給zip做鋪墊的#
if len(full_name)==2 : names.insert(1,'') #冒號中間還是要空幾個格子,不然看暈眼,求長度等於2,說明如果是兩個字的名字,在1的位置插入一個空格,你奶 就變成了你 '空格 ' 奶 ,這樣所有的名字都統一適用了init的三個標簽#
for lable,name in zip(lables,names): # 新變數名,把壓縮成元組的鍵值對解包然後一個個放到下面people里的lookup參數中去循環#
people=lookup(data,lable,name) #設定了一個people名,套用函數lookup(前面解釋過了),判斷這個輸入的full_name中每一個lable(first,se。。)下的name是不是存在#
if people: #如果存在就會返回一個值,非0和None即為True #
people.append(full_name) #在末尾追加全名,比如已經有了data['first']={['你' : ['你 奶 奶']},那麼你輸入一個 你爺爺,由於'你'是存在的,所以會變成data['first']={['你' : ['你 奶 奶' , '你 爺 爺']} #
else:
data[lable][name]=[full_name]
#如果輸入的是 我爺爺 ,即first下不存在wo ,那麼返回值就是None,執行else ,即是在指定標簽下加入一個新的name鍵進去,然後賦值全名,以前面的data為例,用拼音吧,打中文切換太累,就會變成data['first']={['ni' : ['ni nai nai' , 'ni ye ye'],'wo':['wo ye ye']}
然後你就可以調用函數來store名字進去和lookup名字出來了,這樣講夠具體嗎