使用 TextProfileSignature fnv-text-profile-signature 进行近似重复文档检测

Near Dupliate Document detection using TextProfileSignature fnv-text-profile-signature

我有很多文档已经转换为文本。其中许多文档是收集的网页。其中一些使用了 Apache Tika(如果有人关心的话)。

我想要一个 Java 库,我可以用它来查找近似重复项 (NDD)。我可以为您提供不同方法和文档的链接,但是,这个问题专门针对 TextProfileSignature 的使用。也就是说,如果我从另一个现有包中遗漏了一些明显的东西,我对近似重复检测相当陌生。

我首先在 SOLR

中找到了 TextProfileSignature class

https://lucene.apache.org/solr/5_2_1/solr-core/org/apache/solr/update/processor/TextProfileSignature.html

声明算法取自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 个文档;但我需要运行再测试几次,看看我是否仍然同意这个数字。