使用 TextProfileSignature fnv-text-profile-signature 进行近似重复文档检测
Near Dupliate Document detection using TextProfileSignature fnv-text-profile-signature
我有很多文档已经转换为文本。其中许多文档是收集的网页。其中一些使用了 Apache Tika(如果有人关心的话)。
我想要一个 Java 库,我可以用它来查找近似重复项 (NDD)。我可以为您提供不同方法和文档的链接,但是,这个问题专门针对 TextProfileSignature 的使用。也就是说,如果我从另一个现有包中遗漏了一些明显的东西,我对近似重复检测相当陌生。
我首先在 SOLR
中找到了 TextProfileSignature class
声明算法取自Clutch
org.apache.nutch.crawl.TextProfileSignature
然后搅浑水,看起来这个实现实际上可以直接在 GitHub
上使用
https://github.com/casetext/fnv-text-profile-signature
我很清楚,如果我安装 SOLR/Lucene,当我将文档输入 SOLR 时,我可以将其配置为 运行 NDD 并填充文本配置文件签名。对于我的用途,我希望不通过 SOLR/Lucene 运行 我的文档,而是简单地生成文本配置文件签名。
我无法在提供的包之外找到任何使用此实例的示例代码。在准备问这个问题时,我找到了 GITHUB 代码,看起来这可能是我最好的方法,因为它看起来会提供一个独立的包,而无需尝试从中提取 JARS更大的 SOLR 包。
我已经走了很多路,这就是我走了多远....那么,有没有在您自己的代码中使用这些 classes 的示例代码?
事实证明,在github上调用代码非常容易。请注意,我是在 Fedora Linux 计算机上完成所有这些操作的。我做了以下事情:
我使用“./gradlew build”构建代码
我将生成的 JAR 文件添加到我的本地 Maven 存储库:mvn install:install-file -Dfile=/home/andy/fnv-text-profile-signature-1.0.jar -DgroupId=com.casetext -DartifactId= textprofilesignature -Dversion=1.0 -Dpackaging=jar
在我的 POM 文件中设置依赖关系后,我可以使用以下简单代码:
TextProfileSignature signer = new TextProfileSignature(quantizationRate, minimumTokenLength);
signer.addText(s);
String signature = signer.getSignature();
非常容易做到。我发现我每秒可以处理大约 70 个文档。我针对 5200 个文档进行了测试。对我来说,这很慢,所以我看得更深。
我发现直接调用SOLR/LUCENE版本没问题
首先,我将其添加到我的 POM 文件中:
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-core</artifactId>
<version>4.6.0</version>
</dependency>
我包含了一些依赖项:
import org.apache.solr.update.processor.TextProfileSignature;
import org.apache.solr.common.params.ModifiableSolrParams;
SOLR 版本 returns byte[] 而不是字符串,并且它不接受任何参数
TextProfileSignature signer = new TextProfileSignature();
signer.init(params);
signer.add(s);
byte[] signature = signer.getSignature();
如果您不使用 init,则您拥有默认参数值,这对于大多数用途来说可能是可以接受的。这就是我初始化参数对象以使用我的值的方式:
ModifiableSolrParams params = new ModifiableSolrParams();
params.set("minTokenLen", minimumTokenLength);
params.set("quantRate", Float.toString(quantizationRate));
我通过反复试验以及查看一些源代码确定了这一点。我没有严格验证我是否正确设置了参数,但返回的唯一文档数是 4691 而不是 4690;足够接近让我接受它是正确的,特别是因为较慢的版本生成 127 位 FNV-1 哈希,而 SOLR 版本似乎生成 MD5,但同样,我没有深入了解。
所以归根结底,我为什么要关心使用 SOLR 版本,因为它似乎每秒处理大约 10,000 个文档,而不是每秒 70 个文档;但我需要运行再测试几次,看看我是否仍然同意这个数字。
我有很多文档已经转换为文本。其中许多文档是收集的网页。其中一些使用了 Apache Tika(如果有人关心的话)。
我想要一个 Java 库,我可以用它来查找近似重复项 (NDD)。我可以为您提供不同方法和文档的链接,但是,这个问题专门针对 TextProfileSignature 的使用。也就是说,如果我从另一个现有包中遗漏了一些明显的东西,我对近似重复检测相当陌生。
我首先在 SOLR
中找到了 TextProfileSignature class声明算法取自Clutch
org.apache.nutch.crawl.TextProfileSignature
然后搅浑水,看起来这个实现实际上可以直接在 GitHub
上使用https://github.com/casetext/fnv-text-profile-signature
我很清楚,如果我安装 SOLR/Lucene,当我将文档输入 SOLR 时,我可以将其配置为 运行 NDD 并填充文本配置文件签名。对于我的用途,我希望不通过 SOLR/Lucene 运行 我的文档,而是简单地生成文本配置文件签名。
我无法在提供的包之外找到任何使用此实例的示例代码。在准备问这个问题时,我找到了 GITHUB 代码,看起来这可能是我最好的方法,因为它看起来会提供一个独立的包,而无需尝试从中提取 JARS更大的 SOLR 包。
我已经走了很多路,这就是我走了多远....那么,有没有在您自己的代码中使用这些 classes 的示例代码?
事实证明,在github上调用代码非常容易。请注意,我是在 Fedora Linux 计算机上完成所有这些操作的。我做了以下事情:
我使用“./gradlew build”构建代码
我将生成的 JAR 文件添加到我的本地 Maven 存储库:mvn install:install-file -Dfile=/home/andy/fnv-text-profile-signature-1.0.jar -DgroupId=com.casetext -DartifactId= textprofilesignature -Dversion=1.0 -Dpackaging=jar
在我的 POM 文件中设置依赖关系后,我可以使用以下简单代码:
TextProfileSignature signer = new TextProfileSignature(quantizationRate, minimumTokenLength);
signer.addText(s);
String signature = signer.getSignature();
非常容易做到。我发现我每秒可以处理大约 70 个文档。我针对 5200 个文档进行了测试。对我来说,这很慢,所以我看得更深。
我发现直接调用SOLR/LUCENE版本没问题
首先,我将其添加到我的 POM 文件中:
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-core</artifactId>
<version>4.6.0</version>
</dependency>
我包含了一些依赖项:
import org.apache.solr.update.processor.TextProfileSignature;
import org.apache.solr.common.params.ModifiableSolrParams;
SOLR 版本 returns byte[] 而不是字符串,并且它不接受任何参数
TextProfileSignature signer = new TextProfileSignature();
signer.init(params);
signer.add(s);
byte[] signature = signer.getSignature();
如果您不使用 init,则您拥有默认参数值,这对于大多数用途来说可能是可以接受的。这就是我初始化参数对象以使用我的值的方式:
ModifiableSolrParams params = new ModifiableSolrParams();
params.set("minTokenLen", minimumTokenLength);
params.set("quantRate", Float.toString(quantizationRate));
我通过反复试验以及查看一些源代码确定了这一点。我没有严格验证我是否正确设置了参数,但返回的唯一文档数是 4691 而不是 4690;足够接近让我接受它是正确的,特别是因为较慢的版本生成 127 位 FNV-1 哈希,而 SOLR 版本似乎生成 MD5,但同样,我没有深入了解。
所以归根结底,我为什么要关心使用 SOLR 版本,因为它似乎每秒处理大约 10,000 个文档,而不是每秒 70 个文档;但我需要运行再测试几次,看看我是否仍然同意这个数字。