使用TextProfileSignature fnv-text-profile-signature检测Near Dupliate Document

时间:2016-09-09 19:14:15

标签: solr duplicates nutch

我已将大量文档转换为文本。其中许多文档都是收获的网页。 Apache Tika用于其中一些(如果有人关心)。

我想要一个可以用来查找近似重复项(NDD)的Java库。我可以为您提供有关此方法的不同方法和文档的链接,但是,这个问题具体是关于TextProfileSignature的使用。也就是说,如果我遗漏了另一个现有软件包中显而易见的东西,我对Near Duplicate Detection更新了。

我首先在SOLR中找到了TextProfileSignature类

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代码,看起来好像这对我来说可能是最好的方式,因为看起来它会提供一个独立的包而不试图从更大的SOLR中提取JARS封装

我已经跟踪了许多路径,这就是我走了多远......那么,在你自己的代码中使用这些类的任何示例代码都是什么?

1 个答案:

答案 0 :(得分:0)

事实证明,在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版本返回byte []而不是string,并且它不接受任何参数

    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个文档;但我需要再进行一些测试,看看我是否仍然同意这个数字。