Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Levenshtein在不更改数字的情况下比较字符串_C#_Levenshtein Distance - Fatal编程技术网

C# Levenshtein在不更改数字的情况下比较字符串

C# Levenshtein在不更改数字的情况下比较字符串,c#,levenshtein-distance,C#,Levenshtein Distance,我正在寻找一种找到类似符号名的方法,这些名称通常是文本和数字的组合,如“value1”、“_value2”、“test_5”等 现在,为了找到类似的名称,我尝试使用Levenshtein距离,但对于算法而言,“\u value1”和“.value1”之间的差异与“\u value1”和“\u value8”之间的差异相同。 有没有一种方法可以在不允许更改数字的情况下比较字符串 我当前使用的代码来自 提前谢谢 你可以给任何涉及数字的不相等比较一个很长的距离,比如200。这将在“_text1”和“.

我正在寻找一种找到类似符号名的方法,这些名称通常是文本和数字的组合,如“value1”、“_value2”、“test_5”等

现在,为了找到类似的名称,我尝试使用Levenshtein距离,但对于算法而言,“\u value1”和“.value1”之间的差异与“\u value1”和“\u value8”之间的差异相同。 有没有一种方法可以在不允许更改数字的情况下比较字符串

我当前使用的代码来自


提前谢谢

你可以给任何涉及数字的不相等比较一个很长的距离,比如200。这将在“_text1”和“.text1”之间保持1的距离(类似),但在“text1”和“text10”之间保持200的距离(非常不同)

你可以通过改变第二步来做到这一点

// Step 2
d[0, 0] = 0;

for (int i = 1; i <= n; i++);
{
    if('0' <= s[i - 1] && s[i - 1] <= '9')
        d[i, 0] = d[i-1, 0] + 200;
    else
        d[i, 0] = d[i-1, 0] + 1;
}


for (int j = 1; j <= m; j++)
{
    if('0' <= t[j - 1] && t[j - 1] <= '9')
        d[0, j] = d[0, j-1] + 200;
    else
        d[0, j] = d[0, j-1] + 1;
}
//步骤2
d[0,0]=0;

对于(int i=1;i你可以给任何涉及数字的不相等比较一个很长的距离,比如200。这将在“_text1”和“.text1”之间保持1(类似)的距离,但在“text1”和“text10”之间保持200(非常不同)的距离

你可以通过改变第二步来做到这一点

// Step 2
d[0, 0] = 0;

for (int i = 1; i <= n; i++);
{
    if('0' <= s[i - 1] && s[i - 1] <= '9')
        d[i, 0] = d[i-1, 0] + 200;
    else
        d[i, 0] = d[i-1, 0] + 1;
}


for (int j = 1; j <= m; j++)
{
    if('0' <= t[j - 1] && t[j - 1] <= '9')
        d[0, j] = d[0, j-1] + 200;
    else
        d[0, j] = d[0, j-1] + 1;
}
//步骤2
d[0,0]=0;

对于(inti=1;i关于Kittsil的答案,这里是我的完整解决方案。 我不确定它是否完全正确,但它似乎对我有用

        ushort n = (ushort)s.Length;
        ushort m = (ushort)t.Length;
        ushort[,] d = new ushort[n + 1, m + 1];

        // Step 1
        if (n == 0)
        {
            return m;
        }

        if (m == 0)
        {
            return n;
        }

        // Step 2
        d[0, 0] = 0;
        for (int i = 1; i <= n; i++)
        {
            if ('0' <= s[i - 1] && s[i - 1] <= '9')
                d[i, 0] = (ushort)(d[i - 1, 0] + 200);
            else
                d[i, 0] = (ushort)(d[i - 1, 0] + 1);
        }


        for (int j = 1; j <= m; j++)
        {
            if ('0' <= t[j - 1] && t[j - 1] <= '9')
                d[0, j] = (ushort)(d[0, j - 1] + 200);
            else
                d[0, j] = (ushort)(d[0, j - 1] + 1);
        }

        // Step 3
        for (int i = 1; i <= n; i++)
        {
            //Step 4
            for (int j = 1; j <= m; j++)
            {
                // Step 5
                bool isIdentical = t[j - 1] == s[i - 1];
                bool isNumber = ('0' <= t[j - 1] && t[j - 1] <= '9') || ('0' <= s[i - 1] && s[i - 1] <= '9');

                int cost1 = isIdentical ? 0 : (isNumber ? 200 : 1);
                int cost2 = isNumber ? 200 : 1;

                // Step 6
                d[i, j] = (ushort)(Math.Min(Math.Min(d[i - 1, j] + cost2, d[i, j - 1] + cost2), d[i - 1, j - 1] + cost1));
            }
        }
        // Step 7
        return d[n, m];
ushort n=(ushort)s.Length;
ushort m=(ushort)t.长度;
ushort[,]d=新的ushort[n+1,m+1];
//第一步
如果(n==0)
{
返回m;
}
如果(m==0)
{
返回n;
}
//步骤2
d[0,0]=0;

对于(inti=1;i关于Kittsil的答案,这里是我的完整解决方案。 我不确定它是否完全正确,但它似乎对我有用

        ushort n = (ushort)s.Length;
        ushort m = (ushort)t.Length;
        ushort[,] d = new ushort[n + 1, m + 1];

        // Step 1
        if (n == 0)
        {
            return m;
        }

        if (m == 0)
        {
            return n;
        }

        // Step 2
        d[0, 0] = 0;
        for (int i = 1; i <= n; i++)
        {
            if ('0' <= s[i - 1] && s[i - 1] <= '9')
                d[i, 0] = (ushort)(d[i - 1, 0] + 200);
            else
                d[i, 0] = (ushort)(d[i - 1, 0] + 1);
        }


        for (int j = 1; j <= m; j++)
        {
            if ('0' <= t[j - 1] && t[j - 1] <= '9')
                d[0, j] = (ushort)(d[0, j - 1] + 200);
            else
                d[0, j] = (ushort)(d[0, j - 1] + 1);
        }

        // Step 3
        for (int i = 1; i <= n; i++)
        {
            //Step 4
            for (int j = 1; j <= m; j++)
            {
                // Step 5
                bool isIdentical = t[j - 1] == s[i - 1];
                bool isNumber = ('0' <= t[j - 1] && t[j - 1] <= '9') || ('0' <= s[i - 1] && s[i - 1] <= '9');

                int cost1 = isIdentical ? 0 : (isNumber ? 200 : 1);
                int cost2 = isNumber ? 200 : 1;

                // Step 6
                d[i, j] = (ushort)(Math.Min(Math.Min(d[i - 1, j] + cost2, d[i, j - 1] + cost2), d[i - 1, j - 1] + cost1));
            }
        }
        // Step 7
        return d[n, m];
ushort n=(ushort)s.Length;
ushort m=(ushort)t.长度;
ushort[,]d=新的ushort[n+1,m+1];
//第一步
如果(n==0)
{
返回m;
}
如果(m==0)
{
返回n;
}
//步骤2
d[0,0]=0;

对于(int i=1;你好,Kottsil,谢谢你的快速回复!这几乎是我一直在寻找的解决方案,除了最后一个“Math.Min(…)”之外,例如“var_3”和“var_1”之间的最终差异是2,这仍然很低……但我可能自己就能解决这个问题。顺便说一句:你的第一个“for(int i…)”需要从“i=1”开始您好Kottsil,感谢您的快速回复!这几乎就是我一直在寻找的解决方案,除了上一个“Math.Min(…)”之外,例如“var_3”和“var_1”之间的最终差异是2,这仍然很低……但我可能自己就能解决这个问题。顺便说一句:您的第一个“for(int I…)”需要从“I=1”开始