灵活实施DIFF的启发式方法


12

我创建了一个DIFF实现,以比较工作中的文档修订。它基于O(ND)差分算法及其变体

变得很重要的一件事是获取更改列表并将其解释为人类可读的文本。尽管当前算法非常有效,但它是如此之大,以至于难以扩展。

简短问题

我当时正在考虑尝试使用A *和一种启发式方法,该方法会增加“转弯”的惩罚。想法是消除不必要的“添加,删除,添加,删除,添加,删除”,以便更轻松地解析为人类可以阅读的内容。基本上,将我的最短路径问题变成最简单的路径问题。

当然,不要创建始终为“删除所有内容,添加所有内容 ”的输出

听起来合理吗?

在DIFF实现中使用启发式算法是否有优先权?什么是启发式?

问题:

如果删除了一个长句子,又删除了另一个长句子,但它们确实共享至少一个单词,请说“与”。不理会常见单词(不要同时添加和删除它)将创建最短路径。但是,这实际上只是使尝试混淆更改打印内容的人感到困惑。

当前DIFF的示例:

  • 旧文本: 清洁:用力洗净并用车间空气吹干。
  • 新文本: 清洁:用丙酮和无绒布擦拭。
  • 变更单清单:
    • 将“强力清洗并吹干”更改为“用丙酮擦拭”
    • 将“商店空气”更改为“丙酮和无绒布”

注意:使用“更改”代替 “删除'购买空气',添加'丙酮'”

如您所见,第二个注释失去了所有上下文,并且在没有查看完整的旧文本和新文本集的情况下,您无法理解其含义。

关于标点符号的注意事项:

我将标点符号分隔为单独的“单词”,这样我就可以

  • 添加“(”

代替

  • 将“修复”更改为“((修复)

因为这令人讨厌。但是,这意味着如果两个文本中甚至有一个逗号(与前面示例中的单词“ with”相对),就会发生相同的情况。

可能的解决方案:

我认为我可以使用不同的路径查找算法,从而使我能够灵活地为可能对人更有意义的不同更改“路径”增加权重。也许,我什至可以使旅行到包含标点符号的节点的权重很小(不确定这将如何影响其他事情)。

然后,我可以得到前面的示例以列出以下内容:

  • 变更单清单:
    • 将“ Powerwash并用商店空气吹干”更改为“用丙酮和不起毛的布擦拭”

看到!更清晰!

我知道我会在性能上受到打击,并且可能必须对程序进行大刀阔斧的检修,但是获得所需的最终结果更为重要。

底线:

同样,在DIFF实现中使用启发式方法是否有优先次序,这是什么?

其他想法?合理的时间投入?还有其他想法吗?其他算法?

提前致谢!

编辑:

我试图澄清/巩固我的问题,并推广我的问题,以在我的算法中添加启发式方法,而不是使用A *。在这种情况下,基本上是相同的事情,但是我现在仍然认为更准确。 这篇文章很有见地。

Answers:


1

您可以在类似vimdiff的版本中进行操作:

步骤1:识别添加,删除和修改的句子。

步骤2:对于每个修改的句子,找到第一个和最后一个更改的单词,然后切掉这两个单词之间的所有内容。

如果你需要保持连贯更语法结构,看看内部的http://www.languagetool.org/上显示或其他这篇文章

关于陈述:您可以一句话一句地介绍该句子的两个版本。您可能希望显示每个更改的上下文。为了获得启发,请查看latexdiff,它可以在最终文本的最后位置将蓝色添加的文本打印为蓝色,在脚注中删除已删除的文本(甚至与兼容\usepackage[para]{footmisc})。


这仅解决显示问题,而不是启发式匹配的主要问题。
亚当·祖克曼

你读过我的第二段吗?
user2987828 2014年

是的 您能否扩展您要解释的内容?我第一次(和第二次)阅读它使我认为您仍在描述如何显示信息,而不是对其进行处理。
亚当·祖克曼

我目前能够使用html格式化添加和删除,stackexchange编辑查看器是我的灵感来源。这不是我的问题。
ptpaterson 2014年

1
我需要更好地了解如何使用不同的图搜索方法来找到差异。我最初创建的原始图有效地创建了所有边的权重相等的图形,并执行深度优先搜索以查找所有添加/删除/保持移动到最后。我正在考虑将不同的权重添加到边缘并添加启发式。
ptpaterson 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.