99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀大數(shù)據(jù)時代,如何搜集有效數(shù)據(jù)
大數(shù)據(jù)時代,如何搜集有效數(shù)據(jù)
2017-03-14
收藏

大數(shù)據(jù)時代,如何搜集有效數(shù)據(jù)

小編從阿爾茲海默癥成病機理出發(fā),提到了如何對模型參數(shù)降維的問題。我們先來復(fù)(Yù)習(xí)(Xí)一下那張圖表:

經(jīng)過復(fù)(Yù)習(xí)(Xí)后,這張圖似乎不再那么催人入眠了!不僅如此,而且我們可以使用信息幾何,這一自內(nèi)而外散發(fā)著高格調(diào)的技術(shù),達到參數(shù)降維的目的。正所謂——

一聲驚雷劃冬去,兩鳴鴻雁游春來。

三月桃花映山紅,四處玉蘭擬雪白。

五味醇釀溫心海,六色晨光覆陰霾。

七刻余暉寓暖陽,八方云動照英才。

冬去春來,良辰美景,更何況突然有了解決難題的思路,心情大好,正該不醉不歸!但回頭仔細一想,讀者們會發(fā)現(xiàn)還有另一個大問題——數(shù)據(jù)從什么地方得來呢?巧婦難為無米之炊,就算理論算法再高屋建瓴天花亂墜,若沒有實驗數(shù)據(jù)的支持,那也無異于紙上談兵。大數(shù)據(jù)時代,信息(數(shù)據(jù))的搜集可是極其重要的。信息(數(shù)據(jù))通常來源于網(wǎng)絡(luò),而如何過濾掉無用的數(shù)據(jù),提取有效成分,這也是公認的難題。下圖是一個例子:

提取有效信息的過程

因此提取有效數(shù)據(jù)的關(guān)鍵在于準確地抓住信息的特點,或者關(guān)鍵詞(keywords)。當我們把關(guān)鍵詞輸入到搜索引擎(百度、谷歌等)后,這些搜索引擎就會以一定的優(yōu)先級返回我們想要的信息。那么搜索引擎是怎么展開搜索的呢?答案:網(wǎng)絡(luò)爬蟲或者網(wǎng)絡(luò)蜘蛛(web crawler或web spider,以下簡稱爬蟲)。

一、網(wǎng)頁的本質(zhì)

網(wǎng)是靜態(tài)的,但爬蟲是動態(tài)的,所以爬蟲的基本思想就是沿著網(wǎng)頁(蜘蛛網(wǎng)的節(jié)點)上的鏈接的爬取有效信息。當然網(wǎng)頁也有動態(tài)(一般用PHP或ASP等寫成,例如用戶登陸界面就是動態(tài)網(wǎng)頁)的,但如果一張蛛網(wǎng)搖搖欲墜,蜘蛛會感到不那么安穩(wěn),所以動態(tài)網(wǎng)頁的優(yōu)先級一般會被搜索引擎排在靜態(tài)網(wǎng)頁的后面。

知道了爬蟲的基本思想,那么具體如何操作呢?這得從網(wǎng)頁的基本概念說起(本文只討論靜態(tài)網(wǎng)頁)。一個網(wǎng)頁有三大構(gòu)成要素,分別是html文件、css文件和JavaScript文件。如果把一個網(wǎng)頁看做一棟房子,那么html相當于房子外殼;css相當于地磚涂料,美化房子外觀內(nèi)飾;JavaScript則相當于家具電器浴池等,增加房子的功能。從上述比喻可以看出,html才是網(wǎng)頁的根本,畢竟地磚顏料在市場上也有,家具電器都可以露天擺設(shè),而房子外殼才是獨一無二的。

下面就是一個簡單網(wǎng)頁的例子:

而在爬蟲眼里,這個網(wǎng)頁是這樣的:

因此網(wǎng)頁實質(zhì)上就是超文本(hypertext),網(wǎng)頁上的所有內(nèi)容都是在形如“<>...</>”這樣的標簽之內(nèi)的。如果我們要搜集網(wǎng)頁上的所有超鏈接,只需尋找所有標簽中前面是"href="的字符串,并查看提取出來的字符串是否以"http"(超文本轉(zhuǎn)換協(xié)議,https表示安全的http協(xié)議)開頭即可。如果超鏈接不以"http"開頭,那么該鏈接很可能是網(wǎng)頁所在的本地文件或者ftp或smtp(文件或郵件轉(zhuǎn)換協(xié)議),應(yīng)該過濾掉。

二、爬蟲實例

既然知道了網(wǎng)頁的本質(zhì),相信讀者們已經(jīng)躍躍欲試了。為了使讀者更好地理解爬蟲的工作原理,小編將用兩種方式編寫一個最簡單的爬蟲,用以獲取谷歌首頁上的所有超鏈接(以http://或https://開頭,過濾掉本地文件),并把它們存到電子表格(Excel)中。

從第一節(jié)的分析可以看出,超鏈接出現(xiàn)在標簽"<a href="...">... </a>"中,所以我們只需要匹配關(guān)鍵詞"href="即可??紤]到python是最簡單且使用最廣泛的多用途語言,小編以python 3.6版本為例寫了如下爬蟲,詳細注解都在圖片中,有興趣的讀者可以親自嘗試,看看會出來什么結(jié)果:

如果采用過程式編寫思路,代碼還會更短一些。為圖簡單,小編沒有使用異常處理手段(Exceptional Handling,一般指try-exception語句,或者條件語句加flag值),這種語句可以用于檢查網(wǎng)絡(luò)鏈接是否異常、搜集文件的過程是否成功甚至本地文件讀寫是否正常等。這種手段常常被經(jīng)常做計算機模擬的科研工作者忽視,以至于當小編把自己寫的程序和一些教授討論時,常常被評論說我的程序“很花哨,沒必要寫得像商業(yè)程序”。盡管這種手段并非必須,但經(jīng)小編大量實踐后發(fā)現(xiàn),當編寫的代碼過長時,這種手段實則可以有效提高程序查錯(debug)的效率。尤其是在計算機模擬中,程序中的bug經(jīng)常來自于內(nèi)存錯誤(數(shù)組長度溢出、指針錯誤等),若不采用異常處理手段,這種bug會非常棘手。就像戀愛中的少女一樣,因內(nèi)存錯誤造成的程序崩潰可以發(fā)生在任意時刻任意地點,全由計算機的心情而定。

或許不了解編程讀者會表示異議:“這代碼有足足32行,哪里簡單了!”其實去掉空行和評論后也就21行,也不算太多。什么,還嫌多?好吧,為了造福更多讀者,也為了讓大家感受一下21世紀之前的程序員前輩們是如何碼代碼的,小編又用Unix的外殼腳本(shell script)把這個爬蟲重新寫了一遍,并命名為"crawler.sh"。同樣,詳細注釋盡在圖中(這是所有Unix系統(tǒng)都有的emacs文檔編輯器):

從21行簡化到只有8行!執(zhí)行后,得到的電子表格內(nèi)容是這樣的:

如果經(jīng)過了嘗試和對比,讀者可以發(fā)現(xiàn)使用外殼腳本比python多搜集了很多網(wǎng)址,而且還去掉了重復(fù)的鏈接。這是因為“wget”命令不僅搜集了谷歌主頁面上的所有鏈接,而且直接把谷歌根目錄里能訪問到的文件全都爬了個遍。有了這一項技術(shù),我們可以大大豐富電腦E盤中“三個代表重要思想”、“黨章黨規(guī)全集”和“日本現(xiàn)代史研究”等文檔的內(nèi)容,從而精神境界得到極大提高。

有經(jīng)驗的讀者可能注意到了,小編明明用的是Windows系統(tǒng)的命令指示符(cmd),又沒有安裝虛擬機,怎么變成了Unix的外殼腳本呢?從歷史角度來講,Unix和Windows完全是兩個不同派系,兩者理應(yīng)是互不兼容的。但事實上2015年自Win10發(fā)布以后,微軟官方就宣布Win10可以很簡易地安裝蘋果的終端(蘋果OS系統(tǒng)是Unix系統(tǒng)的一個分支,具體方式見文獻[2]),并通過“bash”命令實現(xiàn)從cmd到蘋果終端的轉(zhuǎn)變,從此告別了Unix虛擬機的時代!值得一提的是,vim文檔編譯器可以在Windows下直接使用;emacs由于功能較多,需要輸入“sudo apt-get install emacs”命令來安裝。

值得一提的是,因為習(xí)慣原因,很多人根深蒂固地認為Windows系統(tǒng)更適合家用,Unix系統(tǒng)才適合程序員。其實時代一直在變化,微軟集團也在不斷地對Windows系統(tǒng)進行改進,一方面更好地兼容Unix體系,另一方面則開發(fā)更為先進的外殼平臺。例如Powershell就是一個很好的例子。小編試著用過Powershell,它的一些語句和Unix外殼腳本頗為類似,同時也支持對象的定義,而且還有和編程語言一樣的高度可讀性。只是對于習(xí)慣了Unix外殼的程序員而言,Powershell可能顯得不那么熟悉。

回到爬蟲的話題。經(jīng)過兩種方式的對比,我們可以發(fā)現(xiàn)外殼腳本的巨大優(yōu)勢——可以與計算機硬件直接交流,這就是為什么程序調(diào)試員往往對外殼腳本(或匯編語言)滾瓜爛熟的原因。當然作為多用途式的編程語言,python的其他優(yōu)勢也不是外殼腳本所具有的。在什么場合使用何種語言,這個判斷十分重要。

三、守規(guī)矩的爬蟲才是好爬蟲

當一個爬蟲活動過于頻繁時,會造成網(wǎng)絡(luò)交通堵塞,因此一些網(wǎng)站很反感陌生的爬蟲。怎么樣限制陌生爬蟲的行為呢?答案就在目標網(wǎng)站根目錄的"robot.txt"文件里面,這個文件規(guī)定了爬蟲應(yīng)該遵守的條款。當正常的爬蟲開始爬取網(wǎng)頁信息時,會首先檢查robot.txt的規(guī)定并且遵守它。例如百度的robot.txt是這樣的:

可見百度只允許少數(shù)幾個搜索引擎訪問,所以直接用第二節(jié)的方法爬取百度首頁是會被拒絕的。如果確實有批量作業(yè)的必要,則應(yīng)該把爬蟲的“User-agent”改為上述任一瀏覽器的字符串,以模仿瀏覽器訪問的過程,并且限定爬蟲的活動頻率。

有的壞爬蟲(Bad bots)直接無視掉robot.txt里的約束,肆無忌憚地爬取網(wǎng)頁信息,不僅可能造成網(wǎng)絡(luò)癱瘓,還會出現(xiàn)安全隱患。如何過濾掉這些爬蟲,是網(wǎng)絡(luò)安全領(lǐng)域的一大課題,尤其是高級的爬蟲會使用分布式技術(shù)(多個客戶端分別爬取網(wǎng)頁,用以防止IP被查封)和抓取AJAX(用以模仿JavaScript以爬取動態(tài)網(wǎng)頁)等,這就使得反爬蟲的工作變得十分具有挑戰(zhàn)性。

有趣的是,幾乎每個大型網(wǎng)站都會有對應(yīng)的robot.txt,而這些文件能在一定程度上反映出不同網(wǎng)站開發(fā)者的偏好。有興趣的讀者可以自行分析。

四、完整的搜索引

索引擎要做的當然不止普通爬蟲那么簡單。讀者可以思考一下,當你在百度上輸入關(guān)鍵詞“謝雕英雄傳”時,搜索出的結(jié)果會是“射雕英雄傳”,怎么做到的呢?顯然還需要文字和網(wǎng)頁的預(yù)處理(Preporcessing)。另一方面,能匹配關(guān)鍵詞的網(wǎng)頁太多了,總得有個先后次序吧。這就是網(wǎng)頁的排序(Ranking)問題[3]。

預(yù)處理通常有三個步驟,第一是把網(wǎng)頁中的文字編號(indexing),這樣匹配關(guān)鍵詞就變成了尋找編號的的問題;第二是關(guān)鍵詞溯源(stemming),例如去掉“的”、“我”和標點符號等不重要符號限制;第三是提取網(wǎng)頁中的關(guān)鍵信息。要記住,瀏覽器眼中的網(wǎng)頁永遠都是一堆代碼,所以需要過濾掉標簽符號、超鏈接和網(wǎng)頁排版布局等冗雜信息。

網(wǎng)頁排序的算法有很多,不同瀏覽器使用的算法也有不同,但核心都是一樣的——把網(wǎng)絡(luò)看作有向圖(小編在《愛因斯坦vs阿爾法狗》[4]中提到過,這里又出現(xiàn)了)。網(wǎng)頁是有向圖的節(jié)點,如果網(wǎng)頁A上有指向網(wǎng)頁B的鏈接,那么就形成了一條節(jié)點A到節(jié)點B的箭頭,有向圖就這么被產(chǎn)生了。

可以看出,[4]中的神經(jīng)網(wǎng)絡(luò)其實只是網(wǎng)絡(luò)的一個特例。如果一個網(wǎng)頁(節(jié)點)的鏈接出現(xiàn)在其他很多網(wǎng)頁上,說明這個網(wǎng)頁很受歡迎,理應(yīng)得到較高的排名。事實上我們可以把這一過程用馬爾可夫鏈(Markov Chain)表示出來。以谷歌的PageRank算法為例[5]:

由馬爾科夫鏈的遍歷性定理可知,當矩陣A滿足不可約和漸進無周期條件時(irreducible和aperiodic,也就是網(wǎng)絡(luò)連通,且當經(jīng)歷的鏈接夠多時兩個網(wǎng)頁的深度只相差1),以上關(guān)于向量P(把P看作向量,分量加起來為1)的方程一定存在穩(wěn)定解。穩(wěn)定解(或者收斂性)是計算工作者們的最愛,因為有了穩(wěn)定解以后,就可以通過迭代算法把這個穩(wěn)定解找出來,從而得到網(wǎng)頁排序!

一帆風(fēng)順的事并沒有那么多,因為用上面這一方法定義出來的A未必不可約。這就是為什么要額外加一項d,把右邊這個矩陣活生生地變得不可約。這就是PageRank算法的精妙之處——看起來很簡單,但簡單的智慧往往可以創(chuàng)造出巨大的功效。這也是小編所希望追求的數(shù)學(xué)——簡單,但普適性很高。

當然,這只是最原始的PageRank算法。由于不少網(wǎng)站利用這一算法的特點,來千方百計增加自己的排名(例如把字體和網(wǎng)頁背景色設(shè)置為一樣的顏色以欺騙搜索引擎),谷歌也不斷在更新自己的算法,以達到精準和快速兩大目的。兩者之間的相互較量也構(gòu)成了網(wǎng)絡(luò)領(lǐng)域的另一個課題,即垃圾鏈接和垃圾郵件的清理。其中又有很多手段,在此不一一介紹了。

五、總結(jié)和其他

如果讀者能夠讀懂整篇文章,那么恭喜,你已經(jīng)大體掌握了網(wǎng)頁的本質(zhì)、簡單爬蟲的實現(xiàn)和搜索引擎的工作原理這三大互聯(lián)網(wǎng)基礎(chǔ)知識,可以準確地搜集自己想要的數(shù)據(jù)了。比起滿目琳瑯的數(shù)據(jù)處理和分析手段,數(shù)據(jù)的搜集方式簡單粗暴,一學(xué)就會!

大數(shù)據(jù)時代,程序員可謂是十分吃香的行業(yè),入門快且收入高,再多繁忙也可一筆勾銷。但不同于傳統(tǒng)學(xué)科,計算機語言的發(fā)展更新速度十分迅猛,同一種語言的不同版本都可能發(fā)生巨大的變化。例如小編在學(xué)習(xí)計算機系統(tǒng)的經(jīng)典教材Computer Systems A programmer's Perspective(《深入理解計算機系統(tǒng)》)時,在線程控制(Thread Control)那一章花了不少時間,因為稍不注意就會發(fā)生內(nèi)存崩潰。

相信通過這幅圖能找到不少同道中人

后來發(fā)現(xiàn)了mpi和openmp這兩個神奇的工具后,就再也沒用過"Ptheread_join"(加入線程)和"Ptheread_exit"(退出線程)這些老掉牙的命令。和細胞生物學(xué)類似(在小編另一篇文章《護膚與保養(yǎng)》[6]中提到過),計算機語言也具有高度可變性,我們需要與時俱進,做好學(xué)習(xí)新知識的準備。

作為新時代的弄潮兒,生物和計算機領(lǐng)域的人才需求量是巨大的,這兩個學(xué)科之間交相輝映相輔相成,頗有幾分上個世紀數(shù)學(xué)和物理相互促進共同進步的味道。它們能給21世紀帶來怎樣的變革?我們在拭目以待的同時,也應(yīng)當做好應(yīng)對各種變化的準備。古詩云:

李杜詩篇萬口傳,至今已覺不新鮮。
江山代有才人出,各領(lǐng)風(fēng)騷數(shù)百年。

古人尚有此等遠見,更何況這個沐浴在大數(shù)據(jù)海洋中,充滿了機遇與挑戰(zhàn)的時代?

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }