我正在朱莉娅用Wagner-Fischer算法研究Levenshtein距离。
从矩阵的右下角回溯时,很容易获得最佳值,但有点难以获得最佳操作序列,如插入或删除。
我可以记录每个d [i] [j]的指针信息,但它可能会给我三个方向回到d [i-1] [j-1]进行替换,d [i-1] [j]用于删除,d [i] [j-1]用于插入。所以我试图获得给我最佳Levenshtein距离的所有操作组合。
似乎我可以将一个操作集存储在一个数组中,但我不知道所有组合的总数以及长度,所以我很难定义一个数组来存储枚举过程中设置的操作。如何在存储前者时生成数组?或者我应该使用Dataframe?
答案 0 :(得分:1)
如果您实施Wagner-Fischer算法,在某些时候,您可以选择最少三种替代方案(请参阅Wikipedia伪代码)。此时,您将所选的替代项保存在另一个矩阵中。使用如下语句:
c[i,j] = indmin([d[i-1,j]+1,d[i,j-1]+1,d[i-1,j-1]+1])
# indmin returns the index of the minimum element in a collection.
现在c[i,j]
根据删除,插入或替换包含1,2或3。
在计算结束时,您有最终d
矩阵元素达到最小距离,然后向后按c
矩阵并在每一步读取操作。跟踪i
和j
可以通过查看当前步骤中i
中的string1和j
处的string2来查找确切的替换。保持像c
这样的矩阵是无法避免的,因为在算法结束时,有关中间选择的信息(由min
完成)将会丢失。
答案 1 :(得分:0)
我不确定我是否提出了您的问题,但无论如何,Julia中的vectors
是动态数据结构,因此您始终可以使用适当的函数来增长它,例如pull!()
,{{1 }},append!()
也可以将preapend!()
结果向量转换为所需大小的数组
但是使用reshape()
矩阵可以获得上述情况的一种特殊方法:
sparse()
我喜欢这种方法,因为对于大型文本,你可以拥有许多零元素。我还以正向方式填充数据结构并通过反转创建结果。