【问题标题】:Best library for fuzzy document match / text fingerprinting模糊文档匹配/文本指纹识别的最佳库
【发布时间】:2012-02-14 15:37:13
【问题描述】:

我正在考虑构建一个 API,它可以让程序提交学术出版物的“指纹”,将其与开放获取期刊的文章数据库进行匹配,如果找到,则向用户发送规范的引文信息。最初这将针对特定的小型研究领域,因此不一定需要处理 2000 万篇论文才能成功(即使涵盖了该领域最常引用的 1000 篇论文,这对生产力来说也是一个巨大的福音和协作)。

我想知道哪个库(理想情况下能够与 Ruby 交互)最适合进行这种“指纹识别”。我见过 Lucene 的模糊匹配,但这似乎适用于单词级别,而在这种情况下,我们可能希望提交文档的更大子集。进行模糊匹配的原因是有些人可能有 Word.doc 预印本,有些人可能有最终 PDF 等。

我真的很欣赏这里的一些想法。谷歌搜索“感知哈希”让我进入一堆新材料。我试图总结我的许多发现here

似乎SimHash,例如the C implementation 是可行的方法,但我仍然需要进行更多实验。

【问题讨论】:

  • 这篇文章可能很有趣:stackoverflow.com/questions/8544583/…
  • 提供库的另一种方法是详细说明算法,尽管我怀疑在纯 Ruby 中完成它是否足够快。一位朋友提到的一个想法是使用某种差异来查看文本与数据库中每个文本的“不同”程度。由于数据库中有数千个文本,这可能无法扩展,但我们也许可以对文本中的一些单词进行搜索,以快速减少集合以匹配到可管理的数量。尝试了不同的单词差异,但没有发现任何能够可靠地吐出“差异”/转换等的数量,而没有很多其他信息

标签: ruby full-text-search string-matching fingerprint


【解决方案1】:

您可以使用 pHash 来完成此类工作。

this gem 将帮助您开始:

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

【讨论】:

  • 这非常简洁,是我最接近有用的东西。我看到 C 库有一个内置的数据存储,它可以让您提交哈希,然后让您将新文件与所有提交的哈希匹配。通过 Ruby 思想看不到任何接口,不知道在实践中我会如何做到这一点。也希望了解有关可扩展性的更多信息(例如,如果我想匹配 100k 个文件怎么办)。
  • 我更喜欢将哈希存储在 Lucene 中,并通过 Levenstein 距离匹配 pHash。 Lucene 可以非常快地处理数百万个哈希
  • 有趣,你能提供更多细节吗?您如何检索哈希以进行匹配?你计算 Levenshtein 距离是多少?
  • 在这个特定的 gem 方法中,text_hash 将返回带有文本的文件的哈希值。哈希是10 的序列(text_hash(file).to_s(2) 将返回此序列)。因此,您需要将此位序列作为字符串存储在数据存储中。在 lucene 中,您将发送另一个位序列,它将与所有存储的序列匹配。我相信 Lucene 可以从盒子中计算出 Levenstein,所以我们刚刚编写了一些规则来告诉我们所谓的“相似哈希”。如果距离不超过 15%,我们会认为文件非常相似。我们有大约 1500 万个哈希值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 2012-04-19
  • 2017-07-05
  • 2015-11-10
  • 2010-10-04
相关资源
最近更新 更多