【问题标题】:Near Dupliate Document detection using TextProfileSignature fnv-text-profile-signature使用 TextProfileSignature fnv-text-profile-signature 进行近乎重复的文档检测
【发布时间】:2016-09-09 19:14:15
【问题描述】:

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

我想要一个 Java 库,我可以使用它来查找附近的重复项 (NDD)。我可以为您提供指向不同方法和文档的链接,但是,这个问题专门关于 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包。

我已经走了很多路,这就是我已经走了多远……那么,有任何示例代码可以在您自己的代码中使用这些类吗?

【问题讨论】:

    标签: solr duplicates nutch


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2019-06-21
      • 2017-11-05
      • 1970-01-01
      • 2012-09-27
      • 2021-03-12
      • 2010-11-05
      • 2019-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多