在文档管理应用程序中检查文档重复和相似文档

8
更新: 我现在编写了一个名为php_ssdeep的PHP扩展,用于ssdeep C API,以便在PHP中本地实现模糊哈希和哈希比较。更多信息可以在我的博客上找到。希望对大家有所帮助。
我参与编写一个在Linux服务器上使用PHP编写的自定义文档管理应用程序,它将存储各种文件格式(可能有数千个文件),我们需要能够检查是否已经上传过文本文档,以防止在数据库中出现重复。
基本上,当用户上传新文件时,我们希望能够向他们呈现一份文件列表,其中包含重复或包含类似内容的文件。然后,这将允许他们选择预先存在的文档之一或继续上传自己的文档。
通过查找其内容中的相似句子和可能动态生成的关键字列表来确定类似的文档。然后,我们可以向用户显示匹配百分比,以帮助他们找到重复项。

你能推荐一些与此过程相关的包吗?你过去是如何完成这个任务的?

我认为直接的重复可以通过获取所有文本内容并执行以下步骤来完成:

  • 去除空格
  • 去除标点符号
  • 转换为小写或大写

然后形成一个MD5哈希值,以便与任何新文档进行比较。去除这些项目应该有助于防止找不到重复项,例如如果用户编辑文档以添加额外的段落分隔符。 有什么想法吗?

如果计算要求过大而无法实时运行,则此过程还可以潜在地作为每晚的任务运行,并且我们可以在用户下次登录时通知其任何重复项。但是实时运行会更好。


使用MD5哈希只能帮助您找到完全相同的两个文档。如果只有一个字符不同,生成的MD5哈希值就会远非相似(这是哈希的一个要点之一)。因此,这对于查找相似文件是行不通的... - Franz
我明白了。这就是为什么我提到了寻找精确匹配而不是相似文件的技巧。 - Treffynnon
2个回答

5
更新:我现在编写了一个名为php_ssdeep的PHP扩展程序,以支持在PHP本地处理模糊哈希和哈希比较。更多信息可以在我的博客中找到。我希望这对人们有所帮助。
我发现了一个名为“模糊哈希”的程序,它由其创建者Jesse Kornblum称之为“Fuzzy Hashing”,基本上它可以对文件进行哈希处理,以便检测相似的文件或完全匹配的文件。
这背后的理论在这里有记录:使用上下文触发分段哈希识别几乎相同的文件 ssdeep是该程序的名称,它可以在Windows或Linux上运行。它旨在用于取证计算,但似乎也适合我们的目的。我在一台老式Pentium 4机器上进行了简短的测试,花费约3秒钟来处理23MB的哈希文件(不到135,000个文件的哈希),以查找两个文件的匹配项。这个时间包括为我正在搜索的两个文件创建哈希的时间。

1

我正在处理web2project中的一个类似问题,在询问和挖掘后,得出结论:“用户并不关心”。拥有重复文档对于用户来说并不重要,只要他们能够按自己的名称找到自己的文档。

话虽如此,这是我采取的方法:

  • 允许用户上传文档,并将其与所需的项目/任务相关联;
  • 文件应更名以防止通过http获取它。或者更好地存储在Web根目录之外。用户仍然可以在系统中看到其文件名,并且如果他们下载它,您可以使用“正确”的文件名设置标题;
  • 在将来的某个时候,处理文档以查看是否存在重复项。但是在此时,我们不会修改文档。毕竟,可能有重要的原因导致空格或大小写发生变化;
  • 如果存在重复项,则删除新文件,然后链接到旧文件;
  • 如果没有重复项,则不执行任何操作;
  • 为搜索词汇索引文件-根据文件格式,有很多选项,甚至适用于Word文档;
在这一切过程中,我们不会告诉用户它是一个重复的文件...他们并不关心。只有我们(开发人员、数据库管理员等)才关心。
而且,即使他们稍后上传了新版本的文件,这种方法也仍然适用。首先,您需要删除对该文件的引用,然后 - 就像在垃圾回收中一样 - 只有当没有任何引用时,才能删除旧文件。

有趣的想法。但我们的系统中不能有重复文件, 因为这些文件会在许多不同的站点上使用,而这些站点必须同时更新。我并未建议修改文档本身。只是让哈希匹配尽可能地匹配相似的文档。如果有匹配,则要求用户接受当前可用的文件或使用他们正在上传的新文件更新它或者将其添加为他们绝对需要的另一个文件。我无法删除旧文件,因为这对于用户来说并不透明。 - Treffynnon
抱歉,我的回答措辞有点不太准确。我的意思是,在比较文档之前对其进行修改,这意味着你实际上并没有在比较文档...而是在比较修改后的文档。例如,“Hello, my name is keith”和“Hello, my name is Keith”是相同的句子吗?从概念上讲,它们是相同的,但在第一个句子中没有将我的名字大写可能是一个打字错误。您提出的想法会将这些文档视为相同,并标记其中一个为重复。 - CaseySoftware
这正是我希望做的。 :) 它们本质上是相同的句子,只是其中一个有错别字。因此,我希望他们更新现有文档,而不是上传新文档。 - Treffynnon

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