Python 有效地确定;“如何分类”;一个列表是,例如,Levenshtein距离

Python 有效地确定;“如何分类”;一个列表是,例如,Levenshtein距离,python,sorting,permutation,levenshtein-distance,ranking-functions,Python,Sorting,Permutation,Levenshtein Distance,Ranking Functions,我正在做一些排名算法的研究,我想,给定一个排序列表和该列表的一些排列,计算两个排列之间的距离。对于Levenshtein距离的情况,这对应于计算序列和该序列的排序副本之间的距离。例如,还有一个“反演距离”,这是一个详细的线性时间算法,我正在努力实现它 有人知道现有的python实现的反转距离和/或Levenshtein距离的优化吗?我是在50000到200000个元素的序列上计算的,所以O(n^2)太慢了,但是O(n log(n))或者更好的应该足够了 还将赞赏用于排列相似性的其他度量 为未来

我正在做一些排名算法的研究,我想,给定一个排序列表和该列表的一些排列,计算两个排列之间的距离。对于Levenshtein距离的情况,这对应于计算序列和该序列的排序副本之间的距离。例如,还有一个“反演距离”,这是一个详细的线性时间算法,我正在努力实现它

有人知道现有的python实现的反转距离和/或Levenshtein距离的优化吗?我是在50000到200000个元素的序列上计算的,所以O(n^2)太慢了,但是O(n log(n))或者更好的应该足够了

还将赞赏用于排列相似性的其他度量


为未来的人编辑:

基于;这不是Levenshtein或倒置距离,而是“格式塔模式匹配”:P

在糟糕的桌面上运行约6秒钟

Edit2:如果你可以强制你的序列变成[1..n]的排列,那么曼哈顿度量的变化非常快,并且有一些有趣的结果

manhattan = lambda l: sum(abs(a - i) for i, a in enumerate(l)) / (0.5 * len(l) ** 2)
rankings = list(range(100000))
random.shuffle(rankings)
manhattan(rankings) # ~ 0.6665, < 1 second
manhattan=lambda l:sum(abs(a-i)表示i,a表示枚举(l))/(0.5*len(l)**2)
排名=列表(范围(100000))
随机。洗牌(排名)
曼哈顿(排名)#~0.6665,<1秒
标准化因子在技术上是近似值;它对于偶数大小的列表是正确的,但是对于奇数大小的列表应该是
(0.5*(len(l)**2-1))


Edit3:还有其他几种检查列表相似性的算法!排名系数和排名系数。这些函数的实现在库中以
scipy.stats.kendalltau
scipy.stats.rspearman
的形式提供,并将返回秩和相关的p值。

Levenshtein距离是一个O(n**2)算法,因此如果您想走得更快,请使用中的替代快速算法。该方法计算两个序列之间的相似性度量

如果您必须坚持使用Levenshtein,ASPN Python食谱中有一个Python食谱:


另一个Python脚本位于:

规范的DP-Levenshtein算法是O(n2),但我知道许多用例允许更快的算法,例如使用。我拼凑了一个O(n2)算法的实现,它看起来与那些配方相当,但不幸的是对于我正在做的事情来说太慢了。同时,我会查看difflib,谢谢!
manhattan = lambda l: sum(abs(a - i) for i, a in enumerate(l)) / (0.5 * len(l) ** 2)
rankings = list(range(100000))
random.shuffle(rankings)
manhattan(rankings) # ~ 0.6665, < 1 second