如何衡量人类可读文本文件(许可证文件)之间的相似度或距离?

如何衡量人类可读文本文件(许可证文件)之间的相似度或距离?

我想找出源树拥有哪个许可证。计算机应该提出哪些许可证文件紧密匹配的建议。然后我想将文本与meld手动进行比较。

在典型的源代码树中,我有可以包含任何类型(许可证)文本的文本文件,并且希望将其与/licenses/*.

该指标应强调人类可读文本的内容。

  • 单个额外单词的权重较低
  • 拼写错误权重较低
  • 空白的最小权重

如何将文件与 Linux 工具进行比较?

$> supertool unknown.txt /licenses/*  # example of an imaginary solution

0.10 gmap.txt
0.12 gnuplot.txt
0.14 GOG-EULA.txt
0.25 google-chrome.txt
0.13 Google-TOS.txt
0.87 GPL-1.txt
0.95 GPL-1+.txt
0.99 GPL-2.txt
0.56 GPL-2+.txt
0.60 GPL-3.txt
0.78 GPL-3+.txt

我的一个想法是计算许可证的熵,然后连接unknown.txt许可证并再次计算熵ent。具有最小附加熵的文件是相似的。还有更好的想法吗?

答案1

有专门的工具可以实现这一点,您正在寻找一个开源许可合规性工具。可用工具的几个示例:

示例输出可能如下所示。大多数工具还会扫描源文件标头以获取许可证,因此您需要将扫描限制为仅扫描许可证文件。

Directory                       File            License            Confidence  Size
------------------------------------------------------------------------------------
/home/vtrefny/projects/blivet/  COPYING         GPL-2.0-or-later   99.47%      17.7K
/home/vtrefny/projects/blivet/  COPYING.LESSER  LGPL-2.1-or-later  99.63%      25.9K
------------------------------------------------------------------------------------

还有更多,您应该能够找到适合您使用的工具。如果您需要一些非常具体的东西,其中一些还提供库/API。

答案2

作为(可能有偏见的)维护者https://github.com/nexB/scancode-toolkit我想说这是最好的选择好吧:D

特别是,它的方法与此处列出的或其他可用的大多数其他工具不同。它使用多种技术,最终在您的文本和约 30,000 个许可文本和通知之间进行比较(如 OP 引用的融合)。诀窍是让它足够快。使用 diff 可以提供更高的准确性:它现在是该领域的行业领先工具,并且被大多数认真对待开源许可证检测的工具和组织所使用。

相关内容