在两堆文档之间查找相似的文档

在两堆文档之间查找相似的文档

我正在寻找在两组文本文档之间查找相似文档的方法。我知道比较两个文件的方法。但我正在寻找在两组文件之间进行比较的方法。

假设第 1 组有 100,000 篇文档,第 2 组有 5,000 篇文档。我想知道第 2 组中是否有任何文档与第 1 组中的文档相似,以及相似度得分。

谢谢您的任何建议。

答案1

我假设您关心文件“内容”。确定相同的文件很容易,任何重复查找器都可以做到这一点:

  1. GNU/Linux:find . ! -empty -type f -exec md5sum {} + | sort | uniq -w32 -dD
  2. GNU/Linux:重复项(通常与 一起提供sudo apt install fdupes
  3. GNU/Linux:达夫(通常与sudo apt install duff
  4. 视窗:CCleaner
  5. 视窗:dupeGuru[1]
  6. 视窗:重复文件删除器

对于“类似”文件,一般来说,查找会更困难——困难很多。如果您正在寻找类似的照片/图片,请查看如何在非常庞大的数据池(数十到数百GB)中找到重复的照片?.dupeGuru上面有一个图像相似性搜索,有些人认为这个搜索还不错,但它会漏掉一些你可能认为几乎相同(或相同)的图像。事实上,速记改变的图像在你看来是相同的,但在文件比较算法看来却不是。一些图像处理 AI 可以很好地处理这些,但我假设你不想构建其中之一。

现在来看看真正的坏消息:如果您想查找各种“相似”但不完全相同的文件,例如文本文件、PDF、ZIP 文件等,您将必须为每种文件找到特定的处理程序,而且即使经过大量工作,您也可能对结果不满意。

为什么?让我们以两个 Microsoft Word 文档为例:一个包含“Hello World”,另一个包含“Hello world!”(添加了“W”->“w”和“!”)。我认为您希望它们具有非常高的相似度得分。不幸的是,如果一个版本来自 1997 年,另一个版本来自 2007 年,或者元信息不同,或者格式已更改,则它们可能会完全不同(>90% 的字节)。但是,如果您有一个仅从文件中提取文本的过程,那么您将能够更好地处理这个问题,您只需处理文本差异的复杂性(将所有内容小写,删除标点符号和空格,然后进行比较?)。

同样地,如果你有两个完全相同的PDF 文件就打开时的外观而言,如果一个文件嵌入了字体、添加了所有元信息和嵌入了图像预览,而另一个文件仅保留了打印所需的内容并假定系统拥有所有字体,则它们在字节级别上仍然可能存在 90% 以上的差异。

最后一个例子:任何类型的压缩文件。对于许多常用算法,文件中的微小变化(尤其是文件开头的变化)可能会对写入磁盘的字节产生巨大影响。因此,在这里,您也必须解压缩文件(可能以递归方式),然后进行比较。在这种情况下,您想要报告压缩文件比较结果还是未压缩文件比较结果中包含的信息?请注意,许多文件格式在部分或全部文件中使用了有损或无损压缩。

简而言之,除非你有近几千个文件,格式相同你可能正在看一个非常长期的项目。

相关内容