基于视觉的网页结构相似性计算

2024-04-15 05:08

本文主要是介绍基于视觉的网页结构相似性计算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

      由于工作学习的安排,一直参与项目课题的工作,期间在计算两个页面之间相似度的时候,寻求到了一个新的思路,于是努力实现了一下,这里简单说一下自己在接到这个问题的时候的思路吧:网页的相似度,分类,聚类之类的工作很多大牛都做了很多的研究,基于文本、内容、图像各个方面的都有,效果也还是可以的,这次出发点是网页的视觉信息但是在真的动手去做的时候却发现视觉信息包含的计算量太过于庞大了,而且需要很多的预处理,没有一定的先验知识是无法做好的,之前有学长做过这方面的东西,我呢这次也是“站在巨人的肩膀上”出发的哈,网页的源码html通过浏览器提供的渲染接口展现给我们的是DOM树,也就是文档对象模型,之所以很多页面会出现视觉上相似的那是检测算法却判定结果相似性较低甚至不相似的原因是,html中包含一定的js,之中的内容是不被显示的,而且基于大量的数据分析发现html中存在很多的伪装方式,他们通过篡改页面的内容设置属性隐藏、iframe内嵌等等的伪装方式来逃避一系列针对这个伪装的检测方法,应对这些伪装最好的办法就是渲染html得到页面真实的DOM树结构,将那些被伪装或者被隐藏的信息都显示出来,直接操作html效果不好,现在换成是操作DOM树,这样一来,得到的分析和处理结果更接近于真实,这里就是这样的思路。

    首先通过对html的渲染得到了页面的DOM树形式,然后利用得到的DOM的视觉块信息来进行下一阶段的处理,对页面中出现的每一个视觉块均从三个方面进行切割划分考虑,这里使用的是差分切割,对与不同级的信息赋予不同的表示序列最终使用得到的表示序列作为页面的身份信息来用作后续步骤中的检索查询与匹配计算。这里不再累赘,下面是详细的处理程序。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import division

import os
import math
import time
from whoosh.index import create_in
from whoosh.fields import *
import whoosh.index as index
from whoosh.qparser import QueryParser


def CutSquence(file_block_list, web_height, web_width):
    '''
    读取页面信息,从位置中心、面积、高宽比三个方面对其进行分割最终得到一个26位长度的结构特征序列
    '''
    #print 'web_height is :' , web_height
    #print 'web_width is :' , web_width
    #print  'file_block_list is ',file_block_list
    structure = []
    structure_dict = {}
    for i in range(len(file_block_list)):
        center_x = int(file_block_list[i][3]) * 0.5
        center_y = int(file_block_list[i][2]) * 0.5
        s_x = center_x + int(file_block_list[i][1])
        s_y = center_y + int(file_block_list[i][0])
        angle1 = math.atan(s_x/s_y)
        angle2 = math.atan(s_y/(int(web_width)-s_x))
        angle3 = math.atan((int(web_width)-s_x)/(int(web_height)-s_y))
        angle4 = math.atan((int(web_height)-s_y)/s_x)
        string = locate_binary((angle1,angle2,angle3,angle4))
        area1 = int(file_block_list[i][2]) * int(file_block_list[i][3])
        area = area_binary(area1)
        hw_rate1 = int(file_block_list[i][2])/int(file_block_list[i][3])
        hw_rate = hw_rate_binary(hw_rate1)
        long = str(string + area + hw_rate)
        #print  'string is ', string
        #print 'area is ', area
        #print 'hr_rate is' , hw_rate
        structure.append(long)
    return structure
    #print 'structure_squence is :', structure


def locate_binary(angle):
    '''
    对角度进行分割,输入时一个四元组,如(0.132,0.23,0.45,0.671)
    '''
    locate = ''
    locate_dict = {1:'0000',2:'0001',3:'0010',4:'0011',5:'0100',6:'0101',7:'0110',8:'0111',9:'1000',10:'1001',11:'1010',12:'1011',
                    13:'1100',14:'1101',15:'1110',16:'1111'}
    for item in angle:
        result = item/0.0982
        value = int(math.ceil(result))
        if value in locate_dict:
            locate = locate + locate_dict[value]
        elif value >= 16:
            locate = locate + '1111'
    return locate


def area_binary(area):
    '''
    对面积进行差分切割,输入时一个面积值,如670000
    '''
    result = ''
    area_binary_dict = ((5000,'00000'),(10000,'00001'),(30000,'00010'),(50000,'00011'),(70000,'00100'),(90000,'00101'),(110000,'00110'),
                        (130000,'00111'),(150000,'01000'),(170000,'01001'),(190000,'01010'),(210000,'01011'),(230000,'01100'),(250000,'01101'),
                        (270000,'01110'),(290000,'01111'),(310000,'10000'),(330000,'10001'),(350000,'10010'),
                        (370000,'10011'),(390000,'10100'),(410000,'10101'),(430000,'10110'),(450000,'10111'),
                        (470000,'11000'),(490000,'11001'),(500000,'11010'),(750000,'11011'),
                        (1000000,'11100'),(2000000,'11101'),(3000000,'11110'),(4000000,'11111'))
    if area > 4000000:
        result = result + '11111'
    else:
        for i in range(len(area_binary_dict)):
            if area <= area_binary_dict[i][0]:
                result = result + area_binary_dict[i][1]
                break
    return result


def hw_rate_binary(hw_rate):
    '''
    对高宽比进行差分切割,输入时一个四高宽比率,如0.12
    '''
    result = ''
    hw_rate_binary_dict = ((0.05,'00000'),(0.1,'00001'),(0.15,'00010'),(0.2,'00011'),(0.25,'00100'),(0.3,'00101'),
                            (0.325,'00110'), (0.35,'00111'),(0.375,'01000'), (0.4,'01001'),(0.45,'01010'),
                            (0.5,'01011'),(0.55,'01100'),(0.6,'01101'),(0.65,'01110'),(0.7,'01111'),
                            (0.725,'10000'),(0.75,'10001'),(0.775,'10010'),(0.8,'10011'),(0.825,'10100'),
                            (0.85,'10101'),(0.875,'10110'),(0.9,'10111'),(0.925,'11000'),(0.95,'11001'),
                            (1,'11010'),(1.25,'11011'),(1.5,'11100'),(1.75,'11101'),
                             (3,'11110'),(4,'11111'))
    if hw_rate >= 4:
        result = result + '11111'
    else:
        for i in range(len(hw_rate_binary_dict)):
            if hw_rate <= hw_rate_binary_dict[i][0]:
                result = result + hw_rate_binary_dict[i][1]
                break
    return result          


if __name__ == '__main__':
    CutSquence(file_path = "1.txt")

这篇关于基于视觉的网页结构相似性计算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/904902

相关文章

Python实现精确小数计算的完全指南

《Python实现精确小数计算的完全指南》在金融计算、科学实验和工程领域,浮点数精度问题一直是开发者面临的重大挑战,本文将深入解析Python精确小数计算技术体系,感兴趣的小伙伴可以了解一下... 目录引言:小数精度问题的核心挑战一、浮点数精度问题分析1.1 浮点数精度陷阱1.2 浮点数误差来源二、基础解决

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

Python文本相似度计算的方法大全

《Python文本相似度计算的方法大全》文本相似度是指两个文本在内容、结构或语义上的相近程度,通常用0到1之间的数值表示,0表示完全不同,1表示完全相同,本文将深入解析多种文本相似度计算方法,帮助您选... 目录前言什么是文本相似度?1. Levenshtein 距离(编辑距离)核心公式实现示例2. Jac

Java集合中的链表与结构详解

《Java集合中的链表与结构详解》链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序的通过链表中的引用链接次序实现,文章对比ArrayList与LinkedList的结构差异,详细讲解了链表... 目录一、链表概念与结构二、当向单链表的实现2.1 准备工作2.2 初始化链表2.3 打印数据、链表长

Python中经纬度距离计算的实现方式

《Python中经纬度距离计算的实现方式》文章介绍Python中计算经纬度距离的方法及中国加密坐标系转换工具,主要方法包括geopy(Vincenty/Karney)、Haversine、pyproj... 目录一、基本方法1. 使用geopy库(推荐)2. 手动实现 Haversine 公式3. 使用py

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录

SpringBoot利用树形结构优化查询速度

《SpringBoot利用树形结构优化查询速度》这篇文章主要为大家详细介绍了SpringBoot利用树形结构优化查询速度,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一个真实的性能灾难传统方案为什么这么慢N+1查询灾难性能测试数据对比核心解决方案:一次查询 + O(n)算法解决

Oracle查询表结构建表语句索引等方式

《Oracle查询表结构建表语句索引等方式》使用USER_TAB_COLUMNS查询表结构可避免系统隐藏字段(如LISTUSER的CLOB与VARCHAR2同名字段),这些字段可能为dbms_lob.... 目录oracle查询表结构建表语句索引1.用“USER_TAB_COLUMNS”查询表结构2.用“a

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

如何使用Maven创建web目录结构

《如何使用Maven创建web目录结构》:本文主要介绍如何使用Maven创建web目录结构的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录创建web工程第一步第二步第三步第四步第五步第六步第七步总结创建web工程第一步js通过Maven骨架创pytho