我需要弄清楚特定文件路径的接近程度,Levenshtein距离算法的效果很好,但是我需要以某种方式对目录树中较高的目录进行加权。
例如:
我的来源是“ x:/ t / c / d”
我的两个目标是:
我需要第二个目标将其标识为更接近,即使“作为字符串”它的编辑距离更大(因为目标两个与源在同一父目录“ 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;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句