文本重复性检测一直是NLP等领域非常重要的一项研究工作,今天 #paperClub# 给大家翻译一下"Detect duplicate content like Google"。
重复的内容是影响网站排名的最重要的负面因素之一。这就是为什么近重复检测 (NDD) 在任何 SEO 应执行的任务之间占据重要位置的原因。但是,尽管近乎重复检测是一个众所周知且经过深入研究的科学主题,但 SEO 工具市场并没有提供开箱即用的解决方案。
1. 近重复检测:内容与图像消歧
图像的近似重复检测也是一个重要的 SEO 主题。这是一个性能问题,一个站点是否加载一个图像版本而不是十个具有自己 URL 的相似图像。然而,本文的主题是文本内容之间的近似重复检测。图像的 NDD 在技术上是另一项任务,因为图像具有与文本文件不同的文件性质。对于图像之间的重复和相似性检测,市场上有一些很好的工具,但在内容 NDD 部分中并非如此。
2. 查找重复项和近似重复项,例如 Google!
我以两种算法为例描述了两种近似重复检测算法。一种经过测试的算法在可接受的时间内提供可靠的结果,因此您可以在 SEO 日常业务中使用。从 SEO 的角度来看,这两种方法,即使是输出不可靠的方法,也特别有趣,因为它们使用了算法,用于谷歌的近重复检测。
我在常规内容(HTML、DOCX、TXT、CSV、PDF)上测试了这两种分析方法,并且在有足够硬件资源的前提下,不限数量(在 30.000 个文件和 3.000 个字符上进行了测试)。
NDD算法
一般而言,近重复检测的工作原理
- 文本文档被分割成带状疱疹,
- 对于每个 shingle,它是令牌(单词)的连续子序列,进行所谓的指纹计算,
- 每个文档的瓦组相互比较,
相似性的定义:如果文档具有一定数量的相同指纹,则认为文档相似。
对我们来说,了解Minhash和SimHash是什么、它们做什么、Google 如何使用它们、它们在哪里相似、它们如何相互区分以及它们在哪里失败是很重要的。
两种算法都将每个比较的文档转换为标记序列,并从文档的标记序列中生成位串。位串用于确定相似度。
MinHash:1997 年为 AltaVista 发明,被谷歌用于谷歌新闻个性化。该算法考虑了单词的顺序,但忽略了带状疱疹的频率。
SimHash:于 2007 年为 Google 发明,并被 Google 用于在网页抓取时进行重复检测。该算法生成对象的紧凑表示,称为 scatches。可以比较不同对象的数量,从而将对象的相似性转化为知识。该算法考虑了术语频率,但忽略了令牌的顺序。
这种行为会导致误报和误报,这是我在 SimHash 算法测试中所经历的。除此之外,我的设置中的 Python 实现需要太多的计算时间才能在生产环境中使用。但是,让我们进入正题。
SimHash + Python + Screaming Frog
什么?已知条款?当然!至少 Screaming Frog 对任何 SEO 来说都是熟悉的。但是,它在这里只扮演数据采购的一小部分角色。
在这里您可以找到Python 代码和一些信息。
首先,我们应该收集我们想要分析的数据。关于应该比较的内容有不同的含义:
- <body> 的全部内容,带有所谓的 chrome(HTML 标签、页眉、页脚、侧边栏 - 网页中所有没有意义的部分)
- 只有 SEO 文本,例如 <article id="seo-text"> 的内容。
在我的测试中,我比较了整个正文内容——您可以测试 SEO 文本并报告您的体验。我会喜欢并分享你的通知。
假设 Screaming Frog 提取引擎会为您解决问题,请为您想要从中获取内容的页面部分创建一个提取器。如果是全身的话,
- 将提取器命名为“BodyExtractor 1”。为什么这样?Python 脚本将使用此名称。您可以自由重命名它 - 不要忘记更改脚本中的列名。
- 选择作为提取器类型 XPath,
- 用作选择器 //body/*
就像屏幕截图一样:
现在您已准备好收集数据。将您的 Screaming Frog 指向您要分析和运行它的网站。运行完成后,将您的自定义提取导出为 CSV 文件。
让我们去 Python。安装它,如果还没有的话 - Python2 是选择的分支(我在 Windows10 的 3.7 上运行它,并且在 Windows上将 mmh3作为所需的包遇到了一堆问题。我的解决方法是安装 Visual Studio 的某些部分并从内-但我不希望您获得如此痛苦的经验;)。
我的自定义提取 CSV 的大小为 2.7GB。将脚本指向提取文件,如自述文件中所示:
python sf_shingling.py -i internal_html_ap.csv -o output_html_ap.csv -c "BodyContent 1"
我的提取过程用了 18 个小时。在这台机器上:
处理后我得到了几乎相同大小的文件,2,7GB。为什么?因为具有分析结果的文件除了包含 URL 对及其计算的 SimHash 索引之外,还包含它们的内容。
但这不是问题 - 只需删除包含内容的列,无需打开文件。再次使用 Python:
```
#!/usr/bin/env python # coding:utf-8import pandas as pd f=pd.read_csv( "output_html_ap.csv" ) keep_col = [ 'address' , 'status code' , 'status' , 'Sim Score '] new_f = f[keep_col]
new_f.to_csv( "newFile.csv" , index= False )
```
简单:只需列出您要保留的列,并将它们写入新文件。
我的新结果文件大约 6MB - 不是什么大问题。
结论
我分析过的网站对我来说非常熟悉——我在它上面工作了大约一年。这就是为什么我能够在分析中看到误报。
SimHash 索引计算如下:索引越高,文档越相似。据此,SimHash 索引等于 1 的文件是 100% 重复的,索引从 0,6 向上的文件应该被审查。好吧,我过滤掉了所有文件,SimHash 索引小于 0,99 并且正在查看剩余文件。
其中一些是具有不同 URL(真实重复)的相同文档 - 检测到规范化和/或 hreflang 问题,
其中一些是真正的半重复:产品页面具有非常相似的产品描述。在这些情况下,我抓取了他们的规范以了解这种相似性是否是一个真正的问题。
该算法产生的问题是大约 10% 的误报和误报。加上很长的处理时间,我决定进一步调查。
SoftCorporation LLC 的 Neardup
起初:在写这篇文章的时候,原来的网站似乎不再可用,所以我创建了一种镜像GitHub存储库以将其保存以供社区使用。Github 存储库包含所有需要的文件(包括第三方 Java 库)。该软件以另一种方式工作 - 它直接分析文件。所以下载它,指向你的文件所在的目录,然后从选择的终端运行。好消息是:离线几天后,他们的网站又可以正常工作了。
Neardup 到底是什么,它做了什么,为什么它是我选择的工具
Neardup是近重复检测专利编号:8.370.390的 Java 实现,由Vadim Permakoff于 2011 年提交,于2013 年授予。我在ResearchGate获得了全文和描述。
简而言之,该算法考虑了先前算法的缺点,特别是那些导致假阴性/阳性的算法。
由于该算法的实际实现服务于一个易于使用的 Java 软件,几乎没有依赖关系。我已经在 PDF 和 TXT 文件上对其进行了测试,在这两种情况下都在可容忍的时间内获得了非常可靠的结果。分析 6.000 个 PDF 文件不到两分钟,分析了 30.000 个 TXT 文件不到 10 分钟。
假设你已经在你的机器上安装了 Java,Neardup 的使用很简单:
- 将包含您的文本的文件夹放在 Neardup 目录 /neardup/docs/ 中
- 在您的终端中将程序指向包含文档的文件夹:
处理后将生成三个包含感兴趣信息的文件:
- report.log:它包含具有相似性索引的 url 对
- 报告链.xml。什么是链条?该链是文档的有序集合,具有根文档,按文档差异排序。链中的最后一个文档可能与第一个文档完全不同,但是该软件允许您查看一组中的更改链。每个链都从根(原始)文档开始,然后是完全重复的和近似重复的文档,以树的形式呈现。
- report-cluster.xml 每个集群都以数据透视文档开始,然后是按相似度得分排序的完全重复或接近重复的文档列表。
你可以做一些进一步的设置——它们列在原始站点和我的 Github 镜像中。
注意:如果您想测试使用 Screaming Frog 抓取的相同文件,并且不想再次下载它们,我建议您直接从 Excel 创建 TXT 文件。只需为此使用我的 Gist 中的简单 VB 脚本,它将从 Excel 文件的每一行生成一个 TXT 文件,文件名来自第一列。
结论
Neardup 的速度和研究质量(我试图通过该工具找到任何错误信号,但最终无法找到)使其成为我选择的内容分析工具。使用它,别忘了给开发者点赞!
Tl; dr:搜索引擎优化的近重复检测
用于 SEO 的近乎重复检测是一项至关重要的任务,但没有现成的工具可以完成这项任务。我分享了一个工具,用于对任何内容文件进行近乎重复的检测,该工具是免费的,可提供可靠准确的结果并且运行速度极快。