Shingle算法是搜索引擎去掉相同或相似頁面的其中一種基本算法,做SEO聚合頁面的時候如何讓頁面之間不重復?如何處理重復度的問題?可以反推Shingle算法得到一些啟發。
Shingle [ˈʃɪŋgəl]在英文中表示相互覆蓋的瓦片。先通過一個例子來說明Shingle算法:
假設有A、B兩個文檔的標題,A文檔的標題是:明起電話訂火車票可全國通取取票時間延12小時;B文檔的標題是:火車票電話訂票實現全國通取網上預售期延長。
搜索引擎如何知道這兩篇文檔標題是否是重復的?比如我們可以以2個漢字切為一個Shingle的方法:
對於長度L的文檔,每隔N個漢字切一個Shingle,這樣一共切到L-N+1個shingle,A文檔標題切成了L-N+1=21-2+1=20個Shingle,B文檔標題切成了L-N+1=20-2+1=19個Shingle。
A、B兩個文檔標題共同的Shingle有圖上7個加粗的:電話、話訂、火車、車票、全國、國通、通取。
A、 B兩個文檔標題一共有20+19-7=32個Shingle。
然而,A、B兩個文檔標題共同的Shingle,除以,A、B兩個文檔標題一共有的Shingle,就是這兩個文檔標題的Jaccard系數,可以用來判斷A、B兩個文檔標題的相似度。
A、 B兩個文檔標題的Jaccard系數=7/(20+19-7)=0.21875
從兩個文檔的標題,可以延伸到兩個頁面文檔,再延伸到N個頁面,通過Jaccard系數是否達到相似所需要的標准來判斷頁面與頁面是否相似。
這就是Shingle算法,兩個集合的交集除以兩個集合的並集,得到Jaccard系數,通過判斷Jaccard系數是否大於某個數,來判斷兩個集合是否重復。
反推Shingle算法,如果Jaccard系數小於某個數,就不重復了,先給每個文檔集合拆分成若干個Shingle,再兩兩計算Jaccard系數,如果小於某個數,生成頁面即可。
我之前做的一個項目使用的一個方法,雖然比較笨,也還算實用,分享一下:
假設北京電影品類有100個團購單子,現在要為下圖右邊這些詞設計聚合頁面,每個頁面展示10個單子,假設jaccard系數大於0.3判定為頁面重復,怎麼生成不重復頁面?
如下圖展示單子的標題和長標題(假設seo聚合頁用的長標題,因為長標題文字不單一,文字量也大):
每個id是唯一的,每個id對應的標題和長標題可以近似於唯一,那就可以簡化成允許相同id的單子數來解決重復的問題。
意思是,每個頁面展示10個單子,每兩個頁面不能有>=3.33個id是一樣的,即兩兩頁面id比較,所有的id都不同可以生成頁面,只有1個 id不同可以生成頁面,只有2個id不同可以生成頁面,只有3個id不同可以生成頁面,如果有大於等於4個id相同就不生成頁面。 http://www.baxichina.com