簡體   English   中英

如何在C#中計算兩個字符串之間的相似度?

[英]How can I calculate similarity between two strings in C#?

我希望評估兩個字符串之間的相似性(包括大小寫),並提供介於0和1之間的值。

我嘗試了Levenshtein距離實現,但它僅給出整數,並且不比較內部字母。

例如,比較“ ABCD”和“ Abcd”的距離為3,而“ AOOO”也給出的距離為3,但顯然“ Abcd”比“ AOOO”更好地匹配。

因此,與“ ABCD”相比,我希望“ ABcd”最相似,然后是“ Abcd”,然后是“ AOOO”,然后是“ AOOOO”

我也在這里看過但我沒有在尋找可變長度算法。

謝謝

試試這個

double d = (LevenshteinDist(s, t) + LevenshteinDist(s.ToLower(), t.ToLower())) /
           2.0 * Math.Max(s.Length, t.Length);

如果您不希望區分大小寫而不是字母差異,則可以對術語賦予不同的權重

double d = (0.15*LevenshteinDist(s, t) + 
            0.35*LevenshteinDist(s.ToLower(), t.ToLower())) /
           Math.Max(s.Length, t.Length);

請注意,權重總和為0.5,因此使除以2.0已過時。

    bool check(string[] a, string s)
    {
        for (int i = 0; i < a.Length; i++)
            if (s == a[i])
                return true;
        return false;
    }

    public double simi(string string1, string string2)
    {
        int sub1 = 0;
        int sub2 = 0;
        string[] sp1 = new string[string1.Length - 1];
        string[] sp2 = new string[string2.Length - 1];
        string[] sp3 = new string[string1.Length - 1];
        string[] sp4 = new string[string2.Length - 1];
        for (int i = 0; i < string1.Length - 1; i++)
        {
            string x = "";
            x = string1.Substring(i, 2);

            sp1[sub1] = x;
            ++sub1;
        }
        for (int i = 0; i < string2.Length - 1; i++)
        {
            string x = "";
            x = string2.Substring(i, 2);
            sp2[sub2] = x;
            ++sub2;
        }


        int j = 0, k = 0;

        for (int i = 0; i < sp1.Length; i++)
            if (check(sp3, sp1[i]) == true)
            {

                continue;
            }
            else
            {
                sp3[j] = sp1[i];
                j++;

            }

        for (int i = 0; i < sp2.Length; i++)
            if (check(sp4, sp2[i]) == true)
            {

                continue;
            }
            else
            {
                sp4[k] = sp2[i];
                k++;


            }

        Array.Resize(ref sp3, j);
        Array.Resize(ref sp4, k);

        Array.Sort<string>(sp3);
        Array.Sort<string>(sp4);

        int n = 0;


        for (int i = 0; i < sp3.Length; i++)
        {

            if (check(sp4, sp3[i]))
            {

                n++;
            }


        }

        double resulte;

        int l1 = sp3.Length;
        int l2 = sp4.Length;

        resulte = ((2.0 * Convert.ToDouble(n)) / Convert.ToDouble(l1 + l2)) * 100;

        return resulte;
    }

用自定義表T調整Levenshtein距離。設插入成本=1。刪除成本也為1。設T(c,d)表示用d代替c的代價。 T(c,c)應該= 0.T(c,d)應該<= 2。

將Max(n,m)定義為長度為n和m的字符串的最大理論距離。 顯然,Max(n,m)= n + m。

定義距離(s,t)是將s更改為t的成本除以Max(s,t)。 妳去

在定義T時要小心,以使定義遵循距離公理:

  • 距離(s,s)= 0
  • 距離(s,t)=距離(t,s)
  • 距離(s,t)<=距離(s,u)+距離(u,t)

然后它將在更多情況下更有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM