導航:首頁 > 源碼編譯 > 智能web演算法代碼

智能web演算法代碼

發布時間:2023-08-24 03:54:10

Ⅰ web前端diff 演算法深入一下

有同學問:能否詳細說一下 diff 演算法。

詳細的說,請閱讀這篇文章,有疑問的地方歡迎留言一起討論。

因為 diff 演算法是 vue2.x , vue3.x 以及 react 中關鍵核心點,理解 diff 演算法,更有助於理解各個框架本質。

說到「diff 演算法」,不得不說「虛擬 Dom」,因為這兩個息息相關。

比如:

等等

我們先來說說虛擬 Dom,就是通過 JS 模擬實現 DOM ,接下來難點就是如何判斷舊對象和新對象之間的差異。

Dom 是多叉樹結構,如果需要完整的對比兩棵樹的差異,那麼演算法的時間復雜度 O(n ^ 3),這個復雜度很難讓人接收,尤其在 n 很大的情況下,於是 React 團隊優化了演算法,實現了 O(n) 的復雜度來對比差異。

實現 O(n) 復雜度的關鍵就是只對比同層的節點,而不是跨層對比,這也是考慮到在實際業務中很少會去跨層的移動 DOM 元素。

虛擬 DOM 差異演算法的步驟分為 2 步:

實際 diff 演算法比較中,節點比較主要有 5 種規則的比較

部分源碼 https://github.com/vuejs/vue/blob//src/core/vdom/patch.js#L501 如下:

在 reconcileChildren 函數的入參中

diff 的兩個主體是:oldFiber(current.child)和 newChildren(nextChildren,新的 ReactElement),它們是兩個不一樣的數據結構。

部分源碼

很多時候手工優化 dom 確實會比 virtual dom 效率高,對於比較簡單的 dom 結構用手工優化沒有問題,但當頁面結構很龐大,結構很復雜時,手工優化會花去大量時間,而且可維護性也不高,不能保證每個人都有手工優化的能力。至此,virtual dom 的解決方案應運而生。

virtual dom 是「解決過多的操作 dom 影響性能」的一種解決方案。

virtual dom 很多時候都不是最優的操作,但它具有普適性,在效率、可維護性之間達到平衡。

virutal dom 的意義:

vue2.x 的 diff 位於 patch.js 文件中,該演算法來源於 snabbdom,復雜度為 O(n)。了解 diff 過程可以讓我們更高效的使用框架。react 的 diff 其實和 vue 的 diff 大同小異。

最大特點:比較只會在同層級進行, 不會跨層級比較。

對比之前和之後:可能期望將 直接移動到

的後邊,這是最優的操作。

但是實際的 diff 操作是:

vue 中也使用 diff 演算法,有必要了解一下 Vue 是如何工作的。通過這個問題,我們可以很好的掌握,diff 演算法在整個編譯過程中,哪個環節,做了哪些操作,然後使用 diff 演算法後輸出什麼?

解釋:

mount 函數主要是獲取 template,然後進入 compileToFunctions 函數。

compileToFunction 函數主要是將 template 編譯成 render 函數。首先讀取緩存,沒有緩存就調用 compile 方法拿到 render 函數的字元串形式,在通過 new Function 的方式生成 render 函數。

compile 函數將 template 編譯成 render 函數的字元串形式。後面我們主要講解 render

完成 render 方法生成後,會進入到 mount 進行 DOM 更新。該方法核心邏輯如下:

上面提到的 compile 就是將 template 編譯成 render 函數的字元串形式。核心代碼如下:

compile 這個函數主要有三個步驟組成:

分別輸出一個包含

parse 函數:主要功能是 將 template 字元串解析成 AST(抽象語法樹) 。前面定義的 ASTElement 的數據結構,parse 函數就是將 template 里的結構(指令,屬性,標簽) 轉換為 AST 形式存進 ASTElement 中,最後解析生成 AST。

optimize 函數(src/compiler/optomizer.js):主要功能是 標記靜態節點 。後面 patch 過程中對比新舊 VNode 樹形結構做優化。被標記為 static 的節點在後面的 diff 演算法中會被直接忽略,不做詳細比較。

generate 函數(src/compiler/codegen/index.js):主要功能 根據 AST 結構拼接生成 render 函數的字元串

其中 genElement 函數(src/compiler/codgen/index.js)是根據 AST 的屬性調用不同的方法生成字元串返回。

總之:

就是 compile 函數中三個核心步驟介紹,

patch 函數 就是新舊 VNode 對比的 diff 函數,主要是為了優化 dom,通過演算法使操作 dom 的行為降低到最低, diff 演算法來源於 snabbdom,是 VDOM 思想的核心。snabbdom 的演算法是為了 DOM 操作跨級增刪節點較少的這一目標進行優化, 它只會在同層級進行,不會跨層級比較。

總的來說:

在創建 VNode 就確定類型,以及在 mount/patch 的過程中採用位運算來判斷一個 VNode 的類型,在這個優化的基礎上再配合 Diff 演算法,性能得到提升。

可以看一下 vue3.x 的源碼:https://github.com/vuejs/vue/blob//src/core/vdom/patch.js

對 oldFiber 和新的 ReactElement 節點的比對,將會生成新的 fiber 節點,同時標記上 effectTag,這些 fiber 會被連到 workInProgress 樹中,作為新的 WIP 節點。樹的結構因此被一點點地確定,而新的 workInProgress 節點也基本定型。在 diff 過後,workInProgress 節點的 beginWork 節點就完成了,接下來會進入 completeWork 階段。

snabbdom 演算法:https://github.com/snabbdom/snabbdom

定位:一個專注於簡單性、模塊化、強大功能和性能的虛擬 DOM 庫。

snabbdom 中定義 Vnode 的類型(https://github.com/snabbdom/snabbdom/blob//src/vnode.ts#L12)

init 函數的地址:

https://github.com/snabbdom/snabbdom/blob//src/init.ts#L63

init() 函數接收一個模塊數組 moles 和可選的 domApi 對象作為參數,返回一個函數,即 patch() 函數。

domApi 對象的介麵包含了很多 DOM 操作的方法。

源碼:

https://github.com/snabbdom/snabbdom/blob//src/init.ts#L367

源碼:

https://github.com/snabbdom/snabbdom/blob//src/h.ts#L33

h() 函數接收多種參數,其中必須有一個 sel 參數,作用是將節點內容掛載到該容器中,並返回一個新 VNode。

在 vue2.x 不是完全 snabbdom 演算法,而是基於 vue 的場景進行了一些修改和優化,主要體現在判斷 key 和 diff 部分。

1、在 snabbdom 中 通過 key 和 sel 就判斷是否為同一節點,那麼在 vue 中,增加了一些判斷 在滿足 key 相等的同時會判斷,tag 名稱是否一致,是否為注釋節點,是否為非同步節點,或者為 input 時候類型是否相同等。

https://github.com/vuejs/vue/blob//src/core/vdom/patch.js#L35

2、diff 差異,patchVnode 是對比模版變化的函數,可能會用到 diff 也可能直接更新。

https://github.com/vuejs/vue/blob//src/core/vdom/patch.js#L404

java開發大型Web程序需要什麼學習演算法

(totalpage) totalpage = (tolalitem % maxitem)== 0 ? tolalitem / maxitem :(tolalitem / maxitem)+1 這些演算法不需要特別高深的 數學基礎,也不需要數據結構的基礎 只要上過初中 學過java 語法都能理解, 這里我不是說那些知識沒用, web開發按我的理解開發屬於,企業級的開發,屬於商品級的 宜用 快速 開發 不成熟的東西是不會用的,不能快速賺錢的 不會用的 ,但是在開發中或者項目的後期維護,會遇到效率問題 所以說演算法的所用只是理解其數據運作的原理,就像設計師設計出火車需要高深的物理的 , 數學的 ..知識,而製造者只需按照圖紙,拼裝即可.... 要看你以後的發展方向,做程序設計師還是,程序員

Ⅲ 初學web開發需要掌握哪些知識

Web前端開發要學習的知識很雜亂,知識范圍也很廣。不過,所有技術都是圍繞著三大基本技術來進行的:HTML、CSS,JavaScript。前端的開發中,在頁面的布局時, HTML將元素進行定義,CSS對展示的元素進行定位,再通過JavaScript實現相應的效果和交互。

掌握三大技能,還要運用多種開發工具輔助開發。目前我們常用到的有:Dreamweaver,Sublime Text ,HBuilder等。

工具只是解決單個問題,在你更加深入了解這個行業之後,你可能還會用到各種不同的框架,目前有三大框架Angular、React、Vue,除此之外還有Bootstrap、Fbootstrapp、BootMetro、Gumby、IVORY、Kube等,都是需要慢慢接觸的。

另外,做前端開發可能還會運用到SEO、DOM、BOM、Ajax等技能,網站性能優化和伺服器端的基礎知識也是需要了解的。

學前端可能會很難,但世界上沒有學不會的知識,相信自己,努力學下去,一定可以成功。

Ⅳ WEB超鏈分析演算法的WEB超鏈分析演算法

搜索引擎Google最初是斯坦福大學的博士研究生Sergey Brin和Lawrence Page實現的一個原型系統[2],現在已經發展成為WWW上最好的搜索引擎之一。Google的體系結構類似於傳統的搜索引擎,它與傳統的搜索引擎最大的不同處在於對網頁進行了基於權威值的排序處理,使最重要的網頁出現在結果的最前面。Google通過PageRank元演算法計算出網頁的PageRank值,從而決定網頁在結果集中的出現位置,PageRank值越高的網頁,在結果中出現的位置越前。
2.1.1PageRank演算法
PageRank演算法基於下面2個前提:
前提1:一個網頁被多次引用,則它可能是很重要的;一個網頁雖然沒有被多次引用,但是被重要的網頁引用,則它也可能是很重要的;一個網頁的重要性被平均的傳遞到它所引用的網頁。這種重要的網頁稱為權威(Authoritive)網頁。
前提2:假定用戶一開始隨機的訪問網頁集合中的一個網頁,以後跟隨網頁的向外鏈接向前瀏覽網頁,不回退瀏覽,瀏覽下一個網頁的概率就是被瀏覽網頁的PageRank值。
簡單PageRank演算法描述如下:u是一個網頁,是u指向的網頁集合,是指向u的網頁集合,是u指向外的鏈接數,顯然=| | ,c是一個用於規范化的因子(Google通常取0.85),(這種表示法也適用於以後介紹的演算法)則u的Rank值計算如下:
這就是演算法的形式化描述,也可以用矩陣來描述此演算法,設A為一個方陣,行和列對應網頁集的網頁。如果網頁i有指向網頁j的一個鏈接,則,否則=0。設V是對應網頁集的一個向量,有V=cAV,V為A的特徵根為c的特徵向量。實際上,只需要求出最大特徵根的特徵向量,就是網頁集對應的最終PageRank值,這可以用迭代方法計算。
如果有2個相互指向的網頁a,b,他們不指向其它任何網頁,另外有某個網頁c,指向a,b中的某一個,比如a,那麼在迭代計算中,a,b的rank值不分布出去而不斷的累計。如下圖:
為了解決這個問題,Sergey Brin和Lawrence Page改進了演算法,引入了衰退因子E(u),E(U)是對應網頁集的某一向量,對應rank的初始值,演算法改進如下:
其中,=1,對應的矩陣形式為V』=c(AV』+E)。
另外還有一些特殊的鏈接,指向的網頁沒有向外的鏈接。PageRank計算時,把這種鏈接首先除去,等計算完以後再加入,這對原來計算出的網頁的rank值影響是很小的。
Pagerank演算法除了對搜索結果進行排序外,還可以應用到其它方面,如估算網路流量,向後鏈接的預測器,為用戶導航等[2]。
2.1.2演算法的一些問題
Google是結合文本的方法來實現PageRank演算法的[2],所以只返回包含查詢項的網頁,然後根據網頁的rank值對搜索到的結果進行排序,把rank值最高的網頁放置到最前面,但是如果最重要的網頁不在結果網頁集中,PageRank演算法就無能為力了,比如在 Google中查詢search engines,像Google,Yahoo,Altivisa等都是很重要的,但是Google返回的結果中這些網頁並沒有出現。 同樣的查詢例子也可以說明另外一個問題,Google,Yahoo是WWW上最受歡迎的網頁,如果出現在查詢項car的結果集中,一定會有很多網頁指向它們,就會得到較高的rank值, 事實上他們與car不太相關。
在PageRank演算法的基礎上,其它的研究者提出了改進的PageRank演算法。華盛頓大學計算機科學與工程系的Matthew Richardson和Pedro Dominggos提出了結合鏈接和內容信息的PageRank演算法,去除了PageRank演算法需要的前提2,增加考慮了用戶從一個網頁直接跳轉到非直接相鄰的但是內容相關的另外一個網頁的情況[3]。斯坦大學計算機科學系Taher Haveliwala提出了主題敏感(Topic-sensitive)PageRank演算法[4]。斯坦福大學計算機科學系Arvind Arasu等經過試驗表明,PageRank演算法計算效率還可以得到很大的提高[22]。 PageRank演算法中對於向外鏈接的權值貢獻是平均的,也就是不考慮不同鏈接的重要性。而WEB的鏈接具有以下特徵:
1.有些鏈接具有注釋性,也有些鏈接是起導航或廣告作用。有注釋性的鏈接才用於權威判斷。
2.基於商業或競爭因素考慮,很少有WEB網頁指向其競爭領域的權威網頁。
3.權威網頁很少具有顯式的描述,比如Google主頁不會明確給出WEB搜索引擎之類的描述信息。
可見平均的分布權值不符合鏈接的實際情況[17]。J. Kleinberg[5]提出的HITS演算法中引入了另外一種網頁,稱為Hub網頁,Hub網頁是提供指向權威網頁鏈接集合的WEB網頁,它本身可能並不重要,或者說沒有幾個網頁指向它,但是Hub網頁確提供了指向就某個主題而言最為重要的站點的鏈接集合,比一個課程主頁上的推薦參考文獻列表。一般來說,好的Hub網頁指向許多好的權威網頁;好的權威網頁是有許多好的Hub網頁指向的WEB網頁。這種Hub與Authoritive網頁之間的相互加強關系,可用於權威網頁的發現和WEB結構和資源的自動發現,這就是Hub/Authority方法的基本思想。
2.2.1HITS演算法
HITS(Hyperlink-Inced Topic Search)演算法是利用Hub/Authority方法的搜索方法,演算法如下:將查詢q提交給傳統的基於關鍵字匹配的搜索引擎.搜索引擎返回很多網頁,從中取前n個網頁作為根集(root set),用S表示。S滿足如下3個條件:
1.S中網頁數量相對較小
2.S中網頁大多數是與查詢q相關的網頁
3.S中網頁包含較多的權威網頁。
通過向S中加入被S引用的網頁和引用S的網頁將S擴展成一個更大的集合T.
以T中的Hub網頁為頂點集Vl,以權威網頁為頂點集V2,Vl中的網頁到V2中的網頁的超鏈接為邊集E,形成一個二分有向圖SG=(V1,V2,E)。對V1中的任一個頂點v,用h(v)表示網頁v的Hub值,對V2中的頂點u,用a(u)表示網頁的Authority值。開始時h(v)=a(u)=1,對u執行I操作修改它的a(u),對v執行O操作修改它的h(v),然後規范化a(u),h(v),如此不斷的重復計算下面的操作I,O,直到a(u),h(v)收斂。(證明此演算法收斂可見)
I 操作: (1) O操作: (2)
每次迭代後需要對a(u),h(v)進行規范化處理:
式(1)反映了若一個網頁由很多好的Hub指向,則其權威值會相應增加(即權威值增加為所有指向它的網頁的現有Hub值之和)。式(2)反映了若一個網頁指向許多好的權威頁,則Hub值也會相應增加(即Hub值增加為該網頁鏈接的所有網頁的權威值之和)。
和PageRank演算法一樣,可以用矩陣形式來描述演算法,這里省略不寫。
HITS演算法輸出一組具有較大Hub值的網頁和具有較大權威值的網頁。
2.2.2HITS的問題
HITS演算法有以下幾個問題:
1.實際應用中,由S生成T的時間開銷是很昂貴的,需要下載和分析S中每個網頁包含的所有鏈接,並且排除重復的鏈接。一般T比S大很多,由T生成有向圖也很耗時。需要分別計算網頁的A/H值,計算量比PageRank演算法大。
2.有些時候,一主機A上的很多文檔可能指向另外一台主機B上的某個文檔,這就增加了A上文檔的Hub值和B上文檔的Authority,相反的情況也如此。HITS是假定某一文檔的權威值是由不同的單個組織或者個人決定的,上述情況影響了A和B上文檔的Hub和Authority值[7]。
3.網頁中一些無關的鏈接影響A,H值的計算。在製作網頁的時候,有些開發工具會自動的在網頁上加入一些鏈接,這些鏈接大多是與查詢主題無關的。同一個站點內的鏈接目的是為用戶提供導航幫助,也與查詢主題不甚無關,還有一些商業廣告,贊助商和用於友情交換的鏈接,也會降低HITS演算法的精度[8]。
4.HITS演算法只計算主特徵向量,也就是只能發現T集合中的主社區(Community),忽略了其它重要的社區[12]。事實上,其它社區可能也非常重要。
5.HITS演算法最大的弱點是處理不好主題漂移問題(topic drift)[7,8],也就是緊密鏈接TKC(Tightly-Knit Community Effect)現象[8]。如果在集合T中有少數與查詢主題無關的網頁,但是他們是緊密鏈接的,HITS演算法的結果可能就是這些網頁,因為HITS只能發現主社區,從而偏離了原來的查詢主題。下面討論的SALSA演算法中解決了TKC問題。
6.用HITS進行窄主題查詢時,可能產生主題泛化問題[5,9],即擴展以後引入了比原來主題更重要的新的主題,新的主題可能與原始查詢無關。泛化的原因是因為網頁中包含不同主題的向外鏈接,而且新主題的鏈接具有更加的重要性。
2.2.3HITS的變種
HITS演算法遇到的問題,大多是因為HITS是純粹的基於鏈接分析的演算法,沒有考慮文本內容,繼J. Kleinberg提出HITS演算法以後,很多研究者對HITS進行了改進,提出了許多HITS的變種演算法,主要有:
2.2.3.1Monika R. Henzinger和Krishna Bharat對HITS的改進
對於上述提到的HITS遇到的第2個問題,Monika R. Henzinger和Krishna Bharat在[7]中進行了改進。假定主機A上有k個網頁指向主機B上的某個文檔d,則A上的k個文檔對B的Authority貢獻值總共為1,每個文檔貢獻1/k,而不是HITS中的每個文檔貢獻1,總共貢獻k。類似的,對於Hub值,假定主機A上某個文檔t指向主機B上的m個文檔,則B上m個文檔對t的Hub值總共貢獻1,每個文檔貢獻1/m。I,O操作改為如下
I 操作:
O操作:
調整後的演算法有效的解決了問題2,稱之為imp演算法。
在這基礎上,Monika R. Henzinger和Krishna Bharat還引入了傳統信息檢索的內容分析技術來解決4和5,實際上也同時解決了問題3。具體方法如下,提取根集S中的每個文檔的前1000個詞語,串連起來作為查詢主題Q,文檔Dj和主題Q的相似度按如下公式計算:
,,=項i在查詢Q中的出現次數,
=項i在文檔Dj中的出現次數,IDFi是WWW上包含項i的文檔數目的估計值。
在S擴展到T後,計算每個文檔的主題相似度,根據不同的閾值(threshold)進行刷選,可以選擇所有文檔相似度的中值,根集文檔相似度的中值,最大文檔相似度的分數,如1/10,作為閾值。根據不同閾值進行處理,刪除不滿足條件的文檔,再運行imp演算法計算文檔的A/H值,這些演算法分別稱為med,startmed,maxby10。
在此改進的演算法中,計算文檔的相似度時間開銷會很大。
2.2.3.2ARC演算法
IBM Almaden研究中心的Clever工程組提出了ARC(Automatic Resource Compilation)演算法,對原始的HITS做了改進,賦予網頁集對應的連結矩陣初值時結合了鏈接的錨(anchor)文本,適應了不同的鏈接具有不同的權值的情況。
ARC演算法與HITS的不同主要有以下3點:
1.由根集S擴展為T時,HITS只擴展與根集中網頁鏈接路徑長度為1的網頁,也就是只擴展直接與S相鄰的網頁,而ARC中把擴展的鏈接長度增加到2,擴展後的網頁集稱為增集(Augment Set)。
2.HITS演算法中,每個鏈接對應的矩陣值設為1,實際上每個鏈接的重要性是不同的,ARC演算法考慮了鏈接周圍的文本來確定鏈接的重要性。考慮鏈接p->q,p中有若干鏈接標記,文本1<a href=」q」>錨文本</a>文本2,設查詢項t在文本1,錨文本,文本2,出現的次數為n(t),則w(p,q)=1+n(t)。文本1和文本2的長度經過試驗設為50位元組[10]。構造矩陣W,如果有網頁i->j ,Wi,j=w(i,j),否則Wi,j=0,H值設為1,Z為W的轉置矩陣,迭代執行下面3個的操作:
(1)A=WH (2)H=ZA (3)規范化A,H
3.ARC演算法的目標是找到前15個最重要的網頁,只需要A/H的前15個值相對大小保持穩定即可,不需要A/H整個收斂,這樣2中迭代次數很小就能滿足,[10]中指出迭代5次就可以,所以ARC演算法有很高的計算效率,開銷主要是在擴展根集上。
2.2.3.3Hub平均( Hub-Averaging-Kleinberg)演算法
Allan Borodin等在[11]指出了一種現象,設有M+1個Hub網頁,M+1個權威網頁,前M個Hub指向第一個權威網頁,第M+1個Hub網頁指向了所有M+1個權威網頁。顯然根據HITS演算法,第一個權威網頁最重要,有最高的Authority值,這是我們希望的。但是,根據HITS,第M+1個Hub網頁有最高的Hub值,事實上,第M+1個Hub網頁既指向了權威值很高的第一個權威網頁,同時也指向了其它權威值不高的網頁,它的Hub值不應該比前M個網頁的Hub值高。因此,Allan Borodin修改了HITS的O操作:
O操作: ,n是(v,u)的個數
調整以後,僅指向權威值高的網頁的Hub值比既指向權威值高又指向權威值低的網頁的Hub值高,此演算法稱為Hub平均(Hub-Averaging-Kleinberg)演算法。
2.2.3.4閾值(Threshhold—Kleinberg)演算法
Allan Borodin等在[11]中同時提出了3種閾值控制的演算法,分別是Hub閾值演算法,Authority閾值演算法,以及結合2者的全閾值演算法。
計算網頁p的Authority時候,不考慮指向它的所有網頁Hub值對它的貢獻,只考慮Hub值超過平均值的網頁的貢獻,這就是Hub閾值方法。
Authority閾值演算法和Hub閾值方法類似,不考慮所有p指向的網頁的Authority對p的Hub值貢獻,只計算前K個權威網頁對它Hub值的貢獻,這是基於演算法的目標是查找最重要的K個權威網頁的前提。
同時使用Authority閾值演算法和Hub閾值方法的演算法,就是全閾值演算法 PageRank演算法是基於用戶隨機的向前瀏覽網頁的直覺知識,HITS演算法考慮的是Authoritive網頁和Hub網頁之間的加強關系。實際應用中,用戶大多數情況下是向前瀏覽網頁,但是很多時候也會回退瀏覽網頁。基於上述直覺知識,R. Lempel和S. Moran提出了SALSA(Stochastic Approach for Link-Structure Analysis)演算法[8],考慮了用戶回退瀏覽網頁的情況,保留了PageRank的隨機漫遊和HITS中把網頁分為Authoritive和Hub的思想,取消了Authoritive和Hub之間的相互加強關系。
具體演算法如下:
1.和HITS演算法的第一步一樣,得到根集並且擴展為網頁集合T,並除去孤立節點。
2.從集合T構造無向圖G』=(Vh,Va,E)
Vh = { sh | s∈C and out-degree(s) > 0 } ( G』的Hub邊).
Va = { sa | s∈C and in-degree(s) > 0 } (G』的Authority邊).
E= { (sh , ra) |s->r in T}
這就定義了2條鏈,Authority鏈和Hub鏈。
3.定義2條馬爾可夫鏈的變化矩陣,也是隨機矩陣,分別是Hub矩陣H,Authority矩陣A。
4.求出矩陣H,A的主特徵向量,就是對應的馬爾可夫鏈的靜態分布。
5.A中值大的對應的網頁就是所要找的重要網頁。
SALSA演算法沒有HITS中相互加強的迭代過程,計算量遠小於HITS。SALSA演算法只考慮直接相鄰的網頁對自身A/H的影響,而HITS是計算整個網頁集合T對自身AH的影響。
實際應用中,SALSA在擴展根集時忽略了很多無關的鏈接,比如
1.同一站點內的鏈接,因為這些鏈接大多隻起導航作用。
2.CGI 腳本鏈接。
3.廣告和贊助商鏈接。
試驗結果表明,對於單主題查詢java,SALSA有比HITS更精確的結果,對於多主題查詢abortion,HITS的結果集中於主題的某個方面,而SALSA演算法的結果覆蓋了多個方面,也就是說,對於TKC現象,SALSA演算法比HITS演算法有更高的健壯性。
2.3.1BFS(Backword Forward Step)演算法
SALSA演算法計算網頁的Authority值時,只考慮網頁在直接相鄰網頁集中的受歡迎程度,忽略其它網頁對它的影響。HITS演算法考慮的是整個圖的結構,特別的,經過n步以後,網頁i的Authority的權重是,為離開網頁i的的路徑的數目,也就是說網頁j<>i,對i的權值貢獻等於從i到j的路徑的數量。如果從i到j包含有一個迴路,那麼j對i的貢獻將會呈指數級增加,這並不是演算法所希望的,因為迴路可能不是與查詢相關的。
因此,Allan Borodin等[11]提出了BFS(Backward Forward Step)演算法,既是SALSA的擴展情況,也是HITS的限制情況。基本思想是,SALSA只考慮直接相鄰網頁的影響,BFS擴展到考慮路徑長度為n的相鄰網頁的影響。在BFS中,被指定表示能通過路徑到達i的結點的集合,這樣j對i的貢獻依賴就與j到i的距離。BFS採用指數級降低權值的方式,結點i的權值計算公式如下:
=|B(i)|+ |BF(i)| +|BFB(i)|+……+||
演算法從結點i開始,第一步向後訪問,然後繼續向前或者向後訪問鄰居,每一步遇到新的結點加入權值計算,結點只有在第一次被訪問時加入進去計算。 D.Cohn and H.Chang提出了計算Hub和Authority的統計演算法PHITS(Probabilistic analogue of the HITS)[12]。他們提出了一個概率模型,在這個模型裡面一個潛在的因子或者主題z影響了文檔d到文檔c的一個鏈接,他們進一步假定,給定因子z,文檔c的條件分布P(c|z)存在,並且給定文檔d,因子z的條件分布P(z|d)也存在。
P(d) P(z|d) P(c|z) ,其中
根據這些條件分布,提出了一個可能性函數(likelihood function)L,
,M是對應的連結矩陣
然後,PHITS演算法使用Dempster等提出的EM演算法[20]分配未知的條件概率使得L最大化,也就是最好的解釋了網頁之間的鏈接關系。演算法要求因子z的數目事先給定。Allan Borodin指出,PHITS中使用的EM演算法可能會收斂於局部的最大化,而不是真正的全局最大化[11]。D. Cohn和T. Hofmann還提出了結合文檔內容和超鏈接的概率模型[13]。 Allan Borodin等提出了完全的貝葉斯統計方法來確定Hub和Authoritive網頁[11]。假定有M個Hub網頁和N個Authority網頁,可以是相同的集合。每個Hub網頁有一個未知的實數參數,表示擁有超鏈的一般趨勢,一個未知的非負參數,表示擁有指向Authority網頁的鏈接的趨勢。每個Authoritive網頁j,有一個未知的非負參數,表示j的Authority的級別。
統計模型如下,Hub網頁i到Authority網頁j的鏈接的先驗概率如下給定:
P(i,j)=Exp(+)/(1+Exp(+))
Hub網頁i到Authority網頁j沒有鏈接時,P(i,j)=1/(1+Exp(+))
從以上公式可以看出,如果很大(表示Hub網頁i有很高的趨勢指向任何一個網頁),或者和都很大(表示i是個高質量Hub,j是個高質量的Authority網頁),那麼i->j的鏈接的概率就比較大。
為了符合貝葉斯統計模型的規范,要給2M+N個未知參數(,,)指定先驗分布,這些分布應該是一般化的,不提供信息的,不依賴於被觀察數據的,對結果只能產生很小影響的。Allan Borodin等在中指定滿足正太分布N(μ,),均值μ=0,標准方差δ=10,指定和滿足Exp(1)分布,即x>=0,P(>=x)=P(>=x)=Exp(-x)。
接下來就是標準的貝葉斯方法處理和HITS中求矩陣特徵根的運算。
2.5.1簡化的貝葉斯演算法
Allan Borodin同時提出了簡化的上述貝葉斯演算法,完全除去了參數,也就不再需要正太分布的參數μ,δ了。計算公式變為:P(i,j)=/(1+),Hub網頁到Authority網頁j沒有鏈接時,P(i,j)=1/(1+)。
Allan Borodin 指出簡化的貝葉斯產生的效果與SALSA演算法的結果非常類似。 上面的所有演算法,都是從查詢項或者主題出發,經過演算法處理,得到結果網頁。多倫多大學計算機系Alberto Mendelzon, Davood Rafiei提出了一種反向的演算法,輸入為某個網頁的URL地址,輸出為一組主題,網頁在這些主題上有聲望(repution)[16]。比如輸入,www.gamelan.com,可能的輸出結果是「java」,具體的系統可以訪問htpp://www.cs.toronto.e/db/topic。
給定一個網頁p,計算在主題t上的聲望,首先定義2個參數,滲透率和聚焦率,簡單起見,網頁p包含主題項t,就認為p在主題t上。
是指向p而且包含t的網頁數目,是指向p的網頁數目,是包含t的網頁數目。結合非條件概率,引入,,是WEB上網頁的數目。P在t上的聲望計算如下:
指定是既指向p有包含t的概率,即,顯然有
我們可以從搜索引擎(如Altavista)的結果得到,, ,WEB上網頁的總數估計值某些組織會經常公布,在計算中是個常量不影響RM的排序,RM最後如此計算:
給定網頁p和主題t,RM可以如上計算,但是多數的情況的只給定網頁p,需要提取主題後計算。演算法的目標是找到一組t,使得RM(p,t)有較大的值。TOPIC系統中是抽取指向p的網頁中的錨文本的單詞作為主題(上面已經討論過錨文本能很好描述目標網頁,精度很高),避免了下載所有指向p的網頁,而且RM(p,t)的計算很簡單,演算法的效率較高。主題抽取時,還忽略了用於導航、重復的鏈接的文本,同時也過濾了停止字(stop word),如「a」,「the」,「for」,「in」等。
Reputation演算法也是基於隨機漫遊模型的(random walk),可以說是PageRank和SALSA演算法的結合體。
3.鏈接演算法的分類及其評價
鏈接分析演算法可以用來提高搜索引擎的查詢效果,可以發現WWW上的重要的社區,可以分析某個網站的拓撲結構,聲望,分類等,可以用來實現文檔的自動分類等。歸根結底,能夠幫助用戶在WWW海量的信息裡面准確找到需要的信息。這是一個正在迅速發展的研究領域。
上面我們從歷史的角度總結了鏈接分析演算法的發展歷程,較為詳細的介紹了演算法的基本思想和具體實現,對演算法的存在的問題也做了討論。這些演算法有的處於研究階段,有的已經在具體的系統實現了。這些演算法大體可以分為3類,基於隨機漫遊模型的,比如PageRank,Repution演算法,基於Hub和Authority相互加強模型的,如HITS及其變種,基於概率模型的,如SALSA,PHITS,基於貝葉斯模型的,如貝葉斯演算法及其簡化版本。所有的演算法在實際應用中都結合傳統的內容分析技術進行了優化。一些實際的系統實現了某些演算法,並且獲得了很好的效果,Google實現了PageRank演算法,IBM Almaden Research Center 的Clever Project實現了ARC演算法,多倫多大學計算機系實現了一個原型系統TOPIC,來計算指定網頁有聲望的主題。
AT&T香農實驗室的Brian Amento在指出,用權威性來評價網頁的質量和人類專家評價的結果是一致的,並且各種鏈接分析演算法的結果在大多數的情況下差別很小[15]。但是,Allan Borodin也指出沒有一種演算法是完美的,在某些查詢下,結果可能很好,在另外的查詢下,結果可能很差[11]。所以應該根據不同查詢的情況,選擇不同的合適的演算法。
基於鏈接分析的演算法,提供了一種衡量網頁質量的客觀方法,獨立於語言,獨立於內容,不需人工干預就能自動發現WEB上重要的資源,挖掘出WEB上重要的社區,自動實現文檔分類。但是也有一些共同的問題影響著演算法的精度。
1.根集的質量。根集質量應該是很高的,否則,擴展後的網頁集會增加很多無關的網頁,產生主題漂移,主題泛化等一系列的問題,計算量也增加很多。演算法再好,也無法在低質量網頁集找出很多高質量的網頁。
2.噪音鏈接。WEB上不是每個鏈接都包含了有用的信息,比如廣告,站點導航,贊助商,用於友情交換的鏈接,對於鏈接分析不僅沒有幫助,而且還影響結果。如何有效的去除這些無關鏈接,也是演算法的一個關鍵點。
3.錨文本的利用。錨文本有很高的精度,對鏈接和目標網頁的描述比較精確。上述演算法在具體的實現中利用了錨文本來優化演算法。如何准確充分的利用錨文本,對演算法的精度影響很大。
4.查詢的分類。每種演算法都有自身的適用情況,對於不同的查詢,應該採用不同的演算法,以求獲得最好的結果。因此,對於查詢的分類也顯得非常重要。
結束語:當然,這些問題帶有很大的主觀性,比如,質量不能精確的定義,鏈接是否包含重要的信息也沒有有效的方法能准確的判定,分析錨文本又涉及到語義問題,查詢的分類也沒有明確界限。如果演算法要取得更好的效果,在這幾個方面需要繼續做深入的研究,相信在不久的將來會有更多的有趣和有用的成果出現。

閱讀全文

與智能web演算法代碼相關的資料

熱點內容
程序員相親被刪除微信 瀏覽:790
centos命令窗口 瀏覽:596
編譯器有幾個好用的 瀏覽:500
資料庫和網站如何搭載伺服器 瀏覽:154
網路流理論演算法與應用 瀏覽:795
java和matlab 瀏覽:388
釘釘蘋果怎麼下app軟體 瀏覽:832
php網站驗證碼不顯示 瀏覽:859
鋁膜構造柱要設置加密區嗎 瀏覽:344
考駕照怎麼找伺服器 瀏覽:884
阿里雲伺服器如何更換地區 瀏覽:972
手機app調音器怎麼調古箏 瀏覽:503
銳起無盤系統在伺服器上需要設置什麼嗎 瀏覽:19
紅旗計程車app怎麼應聘 瀏覽:978
如何編寫linux程序 瀏覽:870
吉利車解壓 瀏覽:248
java輸入流字元串 瀏覽:341
安卓軟體沒網怎麼回事 瀏覽:785
dvd壓縮碟怎麼導出電腦 瀏覽:275
冒險島什麼伺服器好玩 瀏覽:543