我已将大量文档转换为文本。其中许多文档都是收获的网页。 Apache Tika用于其中一些(如果有人关心)。
我想要一个可以用来查找近似重复项(NDD)的Java库。我可以为您提供有关此方法的不同方法和文档的链接,但是,这个问题具体是关于TextProfileSignature的使用。也就是说,如果我遗漏了另一个现有软件包中显而易见的东西,我对Near Duplicate Detection更新了。
我首先在SOLR中找到了TextProfileSignature类
据说该算法取自Clutch
org.apache.nutch.crawl.TextProfileSignature
然后混淆水域,看起来实际上可以直接在GitHub上使用
https://github.com/casetext/fnv-text-profile-signature
我很清楚,如果我安装SOLR / Lucene,当我将文档提供给SOLR时,我可以将其配置为运行NDD并填充文本配置文件签名。对于我的用途,我希望不通过SOLR / Lucene运行我的文档,而只是生成文本配置文件签名。
我无法使用提供的软件包之外的任何实例找到任何示例代码。在准备提出这个问题时,我找到了GITHUB代码,看起来好像这对我来说可能是最好的方式,因为看起来它会提供一个独立的包而不试图从更大的SOLR中提取JARS封装
我已经跟踪了许多路径,这就是我走了多远......那么,在你自己的代码中使用这些类的任何示例代码都是什么?
答案 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个文档;但我需要再进行一些测试,看看我是否仍然同意这个数字。