最佳的模糊文档匹配/文本指纹库

11

我想建立一个API,让程序提交学术论文的“指纹”,与Open Access期刊文章数据库进行匹配,如果找到,则向用户发送规范引用信息。最初,这将是针对特定的小型研究领域,因此成功并不一定需要处理2000万篇论文(即使涵盖了该领域中最常引用的1000篇论文,也将对生产力和协作产生巨大的帮助)。

我想知道哪个库(最好能与Ruby接口)最适合做这种“指纹识别”。我看过Lucene的模糊匹配,但那似乎只在单词级别上工作,而在这种情况下,我们可能需要提交更大的文档子集。使用模糊匹配的原因是有些人可能有一个Word.doc预印本,有些人可能有最终的PDF等。

我非常感激这里的一些想法。通过谷歌搜索“感知哈希”让我进入了一堆新材料。我试图在这里总结了我的许多发现。

例如,SimHash,以及 C实现似乎是最好的选择,但我还需要更多的实验。


1
这是一个可能很有趣的帖子:https://dev59.com/EF7Va4cB1Zd3GeqPJWVd - Michael Kohl
提供库的替代方案是详细说明算法,尽管我怀疑它在纯Ruby中执行速度是否足够快。一个朋友提出的想法是使用某种差异来查看文本与数据库中每个文本的“不同之处”。由于数据库中有数千个文本,这可能无法扩展,但我们可以通过对文本中的一些单词进行搜索,以快速将集合减少到可管理的数量。尝试了不同的单词差异,但没有发现任何能够稳健地输出“差异”/转换数量等信息而不带有大量其他信息的方法。 - Stian Håklev
1个回答

7

您可以使用pHash来完成这种工作。

this宝石将帮助您入门:

require 'phash/text'
Phash::Text.new('first.txt') % Phash::Text.new('second.txt')

这非常整洁,是我接触到的最有用的东西。我看到C库有一个内置的数据存储,可以让您提交哈希,然后让您将新文件与所有提交的哈希进行匹配。虽然我没有在Ruby中看到任何与此相关的接口,但不确定在实践中该怎么做。另外,我想了解更多关于可扩展性的信息(例如,如果我想匹配100k个文件会怎样)。 - Stian Håklev
1
我更喜欢将哈希存储在Lucene中,并通过Levenstein距离匹配pHashes。Lucene可以快速处理数百万个哈希。 - fl00r
有趣,你能提供更多细节吗?你如何检索匹配的哈希值?你计算Levenshtein距离的数量是多少? - Stian Håklev
1
在这个特定的 gem 方法中,text_hash 将返回文本文件的哈希值。哈希是一个由 10 组成的序列(text_hash(file).to_s(2) 将返回此序列)。因此,您需要将此位序列作为字符串存储在数据存储中。在 lucene 中,您将发送另一个位序列,并将其与所有存储的序列进行匹配。我相信 Lucene 可以从头开始计算 Levenstein,因此我们编写了一些规则,告诉了我们所谓的“相似哈希”的内容。如果距离不超过 15%,我们会做出决定,认为文件非常相似。我们已经获得了约 1500 万个哈希值。 - fl00r

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接