利用最小编辑距离算法实现文本diff
最近在公司一直在做diff的事情,对于文本的diff。因为一开始维基百科实现文字的diff做得比较不错,所以就调研了下mediawiki的diff实现,但发现mediawiki默认只能diff到行的级别,如果要diff到汉字的级别,是需要更改代码的。所以我就改了该mediawiki的代码,发现可以得到相应的效果。
但待我继续追踪代码发现,其实mediawiki的diff实现并不是很优雅,当然我没有太细看它diff的内容,是在追踪的过程中,发现不如使用最小距离去做diff,这样就可以实现和mediawiki同样的diff效果,而且实现起来比mediawiki的要简单。
下面是我做的一个demo,大家可以访问下看看:
http://clamdemo.sinaapp.com/diff/index.php
可以实现单个汉字级别的diff。
下面是几个diff的截图:
可以较为清晰的diff出相应的内容。
代码比较ugly,我就不上传了。不过我可以贡献下最小编辑距离的实现算法,php本身虽也自带最小编辑距离的函数,但只能给出编辑距离,无法给出编辑过程,这个算法,是可以给出编辑过程的。此算法的产生离不开snowteng(snowteng17@gmail.com)的协助。代码比较ugly,别笑话。。
代码位置:
http://code.google.com/p/clamdemo/downloads/detail?name=MinumDistance.php&can=2&q=#makechanges