Java 使用Levenshtein距离比较文件路径

Java 使用Levenshtein距离比较文件路径,java,c#,algorithm,comparison,string-comparison,Java,C#,Algorithm,Comparison,String Comparison,我需要弄清楚特定的文件路径有多近,Levenshtein距离算法非常有效,但我需要以某种方式为目录树上较高的目录赋予权重 例如: var source = "x:/t/c/d"; var targets = new[] { "a:/t/c/d", "x:/t/y/z" }; var separator = '/'; var sourceParts = source.Split(separator); var weight = 10; var match = 100; var scores =

我需要弄清楚特定的文件路径有多近,Levenshtein距离算法非常有效,但我需要以某种方式为目录树上较高的目录赋予权重

例如:

var source = "x:/t/c/d";
var targets = new[] { "a:/t/c/d", "x:/t/y/z" };

var separator = '/';
var sourceParts = source.Split(separator);
var weight = 10;
var match = 100;

var scores = targets.Select(target =>
{
    var score = sourceParts
        .Zip(target.Split(separator), (s, t) => new Tuple<string, string>(s, t))
        .Select(
            (tuple, i) => tuple.Item1 == tuple.Item2
                ? match * GetWeight(i)
                : LevenshteinDistance(tuple.Item1, tuple.Item2) * GetWeight(i)
        ).Sum();

    return new
    {
        Target = target,
        Score = score
    };
});
我的来源是x:/t/c/d

我的两个目标是:

a:/t/c/d x:/t/y/z 我需要第二个目标识别为更接近,即使作为字符串,它的编辑距离更大,因为目标2与源位于同一父目录x中,而第一个目标正在查看目录a

如何为字符串中较早出现的字符赋予权重?

在我看来,完整路径上的Levenshtein距离并不是您想要实现的正确算法

我建议您最终将路径拆分为一个文件夹列表,并在末尾添加一个文件,然后我会比较相应位置的目录名或驱动器,如果它是完美匹配的,则会给它一个高分,随着目录树的深入,分数会降低

如果它不匹配,那么您仍然可以在路径上应用Levenshtein距离,并将其乘以一个权重,该权重将随着您向下移动而减小

而不是总结

例如:

var source = "x:/t/c/d";
var targets = new[] { "a:/t/c/d", "x:/t/y/z" };

var separator = '/';
var sourceParts = source.Split(separator);
var weight = 10;
var match = 100;

var scores = targets.Select(target =>
{
    var score = sourceParts
        .Zip(target.Split(separator), (s, t) => new Tuple<string, string>(s, t))
        .Select(
            (tuple, i) => tuple.Item1 == tuple.Item2
                ? match * GetWeight(i)
                : LevenshteinDistance(tuple.Item1, tuple.Item2) * GetWeight(i)
        ).Sum();

    return new
    {
        Target = target,
        Score = score
    };
});
其中GetWeight类似于:

private static int MaxWeight = 10;
private static int GetWeight(int i) => i < MaxWeight ? MaxWeight - i : 1;

将源和目标usind/分开,然后分别比较它们,这样第二个应该更接近

C代码:


建议分割路径并从后面开始为其赋予反向权重,psuedocode应为:

currPath = null
currMin = int.Max


for (path in paths){ 

    var curr = 0

    var idx = 1;

    for ( x in Inverse( Split ( path ) ) ) { 

        curr+= idx * LevenshteinDistance( x )
        idx++;
    }

    if(idx < currMin)
        currPath = path;        
}

对于所有匹配项都匹配的很长路径,它可能不起作用,但这是任何猜测算法都会遇到的问题,但类似的东西应该可以满足您的需要

为什么有人投了反对票?感觉问题是感性的,这个人查了一下Levenshtein距离并应用了它,所以不确定否决票是为了什么