在上一篇文章中,我们介绍了简言翻译记忆的原理(二):用动态规划算法求解最短编辑距离,相比我之前写的文章,这篇文章的阅读数唰得一下就下来了,可见这篇文章“又臭又长”
对于文科背景的同学来说,这篇确实不是那种适合休闲阅读的文章,但如果想知道翻译记忆的原理,还是得耐心阅读,好好理解这背后的道理。
今天的这篇文章恐怕读者人数就更少啦,因为我要介绍如何编写自动计算最小编辑距离的程序,让计算机自动计算出两个字符串之间的最小编辑距离,进而计算翻译工具中常见的“翻译记忆匹配率”。
同时附赠一个新鲜出炉的网站,供大家在线感受如何计算最短编辑距离:
http://translation.education/bied
正文
在上一篇文章中我们说计算最小编辑距离要用“动态规划”算法,然后我画了一张表格,用这个表格来计算“EXECUTION”和“INTENTION”之间的最小编辑距离,如下:
所谓的“动态规划”,直白来说就是先找到并解决子问题,然后用子问题的结果推导大问题的结果。
在上图中,我们从表格的左上角开始算,然后向表格的右下角来推导。如果我们希望计算机来做这件事儿,计算机也应该是这样来完成。
以下是我们给计算机发出的一系列指令:
注:以下程序均是用PHP写的,如果大家想跟着一起操作,可以前往以下网址:
https://c.runoob.com/compile/1
第一步:接收两个待计算的字符串
<?php $source = "EXECUTION";$target = "INTENTION";?>
如下图:
第二步:将上面的那个字符串放到一个网格中。
如果我们想用代码生成一个像下图中的网格:
我们一般不会直接把这个表格显示出来,而是将这个表格“存储”在计算机之中,但我们可以将其脑补成上面这种表格。
在PHP中,我们会用“数组”的形式来构建这样的表格,我们称这种表格为“矩阵”(Matrix)。
先举一个简单的例子:
<?php $matrix = array();$matrix[0][0] = 1;$matrix[0][1] = 2;$matrix[1][0] = 3;$matrix[1][1] = 4;?>
我们上面这5行代码创建了一个2x2的矩阵,可以想象成这是一个包含有4个单元格的表格,如下:
上面两个图是我把实际的数据用形象的方式给画了出来,并不是说上面的代码产生了这两张图。
上面的图是为了告诉大家[0][0]、[0][1]、[1][0]、[1][1]对应的位置,第一次接触这个东西的人会无法理解为什么左上角的单元格是[0][0]而不是[1][1]。
我们说一个表格有行有列,其中行是自上而下的,列是自左到右的。最左上角的那个单元格就是:第一行第一列,但是在程序语言中,都是从0开始数,所以这个单元格是:第0行第0列。
右上角的单元格是:第0行第1列;
左下角的单元格是:第1行第0列;
右下角的单元格是:第1行第1列。