检测两个HTML页面是否相似的算法?

3

我有10,000个HTML页面。

我知道其中一些是由相同的CMS系统构建的,因此具有“某种程度上”相同的结构,尽管不完全相同。 我预计会有大约100个不同的CMS,但我事先不知道它们,所以我不能寻找预定义的模式。

这就是为什么我需要一个算法来计算每个页面的相似度,并根据相似度对它们进行聚类的原因..?

我希望能在Ruby中找到一些工具,但其他语言也可以。

附注:我不想查看内容(文本)的相似性。 只想在元级别上进行比较。 像HTML结构、CSS规则、类名等等。


如果这是一个真实的问题,你可能需要自己添加识别模式。只需逐个打开页面,看它们是否与你拥有的任何模式匹配。如果没有,就手动分析页面,找到 CMS,并将其模式添加到列表中。这样,你最终将为每个 CMS 添加模式。 - GolezTrol
这是现实生活,我已经不想再按照你的建议去做了。 :-) - Niels Kristian
首先,您必须定义您所说的“相似”是什么意思。您是想查看它们是否具有相同的结构吗?它们的内容是否相似(即相同或接近相同的文本)?它们都在讨论相同的主题,尽管它们的结构和实际内容大不相同吗?您在这里追求的是什么样的“相似性”? - Jim Mischel
我不是在谈论文本内容,而是在谈论元信息,例如HTML结构、属性名称、CSS等。 - Niels Kristian
1
你可以尝试使用HTML解析器或正则表达式提取带有属性的HTML标签,然后计算并比较提取之间的Levenshtein距离。 - spickermann
1个回答

2
在过去的工作中,我为一家公司编写了大量分析软件,需要搜索大量页面来返回类似的信息,数量就像你所说的那样。
无论你想如何确定相似性,你都必须自己编写规则。页面差异太大,代码无法真正理解“相似”意味着什么,也无法确定对你特定用途而言什么是重要的。
你可以做以下事情:
- 确定“文本”节点(可见和不可见文本加上CSS和JavaScript)的总大小。你可以获取后两者的大小并从整体文本大小中减去它们,以获得总内容的概念,但这不会考虑CSS或JavaScript对可见页面的影响。 - 查找meta标签中的有用信息,例如关键字或相关页面。 - 查找表格并获取其行和单元格的计数以及其文本的大小,并可能搜索数据以进行关联或比较。 - 查找链接和锚点,并获取其文本和/或href的相似度。 - 查找图像和任何具有“alt”文本的内容,然后进行比较。
最终,你必须查看页面并确定什么是重要的,没有其他程序员可以猜测这些可能是什么。
HTML结构,各个标记的顺序,不再像以前那样有用,因为CSS和JavaScript可以将加载到浏览器中的内容移动到页面上的任何位置,所以眼睛看到的可能与基于标准代码的工具看到的差异很大。两个相同CMS的版本可能具有完全不同的输出,但由于CSS / JavaScript的结果,对观众来说看起来相同,因此你必须确定如何使它们相关联。

嗯,我发现这个工具可以产生有效的输出,在我尝试并知道“相同”的情况下,但我不知道它是如何工作的,所以很难复制... http://tool.motoricerca.info/similarity-analyzer.phtml - Niels Kristian
好的,就像其他评论所说的那样,这并不容易。你试图做的太多都与你特定的需求有关。找到一个接近的工具很好,但往往一旦你进一步推动,你会发现重叠部分越来越少,因为他们的需求与你的不一致,这时你就必须自己动手了。不幸的是,对于这个问题没有好的现成解决方案,但另一方面,如果有的话,你可能不需要费力去解决这个问题,别人只需点击一个按钮,它就会神奇地发生。 - the Tin Man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接