Applying Tree Kernel to DOM Tree on Python

Definition:

We will use normalized one instead for the property of positive-definite kernel.

code:

from bs4 import BeautifulSoup
from pylab import *
import requests

def dom_tree_kernel(elems1,elems2):
    v1=[]
    v2=[]
    for target_elem in elems1+elems2:
        i=0
        for elem in elems1:
            if target_elem==elem:
                i+=1
        v1.append(i)
        i=0
        n=float(len(elems2))
        for elem in elems2:
            if target_elem==elem:
                i+=1
        v2.append(i)
    v1=array(v1)
    v2=array(v2)
    return v1.dot(v2)/(norm(v1)*norm(v2))

def get_dom_tree(url):
    return list(BeautifulSoup(requests.get(url).content).body.findAll())

if __name__ == "__main__":
    url1="http://www.webcreatorbox.com/tech/wordpress-tips/" # 2 columns
    url2="http://masalog.net/workflowy.html" # 2 columns
    url3="http://www.tuad.ac.jp/" # 3 columns
    dt1=get_dom_tree(url1)
    dt2=get_dom_tree(url2)
    dt3=get_dom_tree(url3)
    print "2-columns vs 2-columns:",dom_tree_kernel(dt1,dt2)
    print "2-columns vs 3-columns:",dom_tree_kernel(dt1,dt3)
    print "2-columns vs 3-columns:",dom_tree_kernel(dt2,dt3)

Result:

2-columns vs 2-columns: 0.206278804472
2-columns vs 3-columns: 0.0855306751119
2-columns vs 3-columns: 0.670058498405

In third result, although one is 2-columns and the other is 3-columns, the result is high. This is quite interesting. It could capture the internal structure. This DOM tree kernel can be regarded as a similarity between webpages🙂

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中