предварительное сравнение строк C # - PullRequest
3 голосов
/ 11 августа 2011

Есть ли какой-либо класс (функция) в .Net, который может сделать это:

если s1 = " I have a black car" and s2 = "I have a car that is small";<br> int matchingProcentage = matchingFunction(s1,s2);

  matchingProcentage == 70% <-- just as an example value :)

Ответы [ 7 ]

12 голосов
/ 11 августа 2011

Вот хороший способ сделать это!

Расстояние Левенштейна

6 голосов
/ 11 августа 2011

Функция, подобная следующей, должна работать, она была написана на скорую руку, поэтому смело вносите изменения:

Использование:

GetStringPercentage("I have a black car", "I have a car that is small");

Метод:

public static decimal GetStringPercentage(string s1, string s2)
{
     decimal matches = 0.0m;
     List<string> s1Split = s1.Split(' ').ToList();
     List<string> s2Split = s2.Split(' ').ToList();

     if (s1Split.Count() > s2Split.Count())
     {
         foreach (string s in s1Split)
             if (s2Split.Any(st => st == s))
                 matches++;

             return (matches / s1Split.Count());
     }
     else
     {
         foreach (string s in s2Split)
             if (s1Split.Any(st => st == s))
                  matches++;

         return (matches / s2Split.Count());
     }

}
1 голос
/ 11 августа 2011

Вы можете использовать Алгоритм Левенштейна

0 голосов
/ 08 ноября 2013

Используя код, найденный в http://www.dotnetperls.com/levenshtein в качестве базы, я изменил его, чтобы он возвращал% вместо числа:

    public static int Compute(string word1, string word2)
    {
        int n = word1.Length;
        int m = word2.Length;
        int[,] d = new int[n + 1, m + 1];

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

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

        // Step 2
        for (int i = 0; i <= n; d[i, 0] = i++)
        {
        }

        for (int j = 0; j <= m; d[0, j] = j++)
        {
        }

        // Step 3
        for (int i = 1; i <= n; i++)
        {
            //Step 4
            for (int j = 1; j <= m; j++)
            {
                // Step 5
                int cost = (word2[j - 1] == word1[i - 1]) ? 0 : 1;

                // Step 6
                d[i, j] = Math.Min(
                    Math.Min(d[i - 1, j] + 1, d[i, j - 1] + 1),
                    d[i - 1, j - 1] + cost);
            }
        }
        // Step 7
        decimal changesRequired = d[n, m];

        //Find the longest word and calculate the percentage equality
        if (word1.Length > word2.Length)
            return Convert.ToInt32(100 - (changesRequired / word1.Length) * 100);
        else
            return Convert.ToInt32(100 - (changesRequired / word2.Length) * 100);
    }

Надеюсь, это поможет.

0 голосов
/ 12 августа 2011

попробуйте это:

public static int MatchingFunction(string s1, string s2, bool duplicate, bool keySensitive)
{

    if (!keySensitive)
    {
        s1 = s1.ToLower();
        s2 = s2.ToLower();
    }

    List<string> ls1 = null;
    s2 = s2.Trim();

    if (duplicate)
    {
        ls1 = s1.Trim().Split(' ').ToList();
    }
    else
    {
        ls1 = new List<string>();
        string[] as1 = s1.Trim().Split(' ');
        foreach (string s in as1)
            if (!ls1.Contains(s))
                ls1.Add(s);

        string[] as2 = s2.Trim().Split(' ');
        s2 = string.Empty;
        foreach (string s in as2)
            if (!s2.Contains(s))
                s2 = string.Format("{0} {1}", s2, s);
    }


    int has = 0;
    s2 = string.Format("@{0}@", s2.Replace(' ', '@');
    foreach (string s in ls1)
        has += s2.Contains(string.Format("@{0}@", s)) ? 1 : 0;

    return (has * 100 / ls1.Count());
}


string s1 =  " I have a black car";
string s2 = "I have a car that is small";

int p = MatchingFunction(s1, s2, false, false);
0 голосов
/ 11 августа 2011

Просто предложение, но сможете ли вы взять обе строки и сравнить символ с символом и определить процент на основе количества совпадающих символов?

0 голосов
/ 11 августа 2011

Нет, нет. Вы должны реализовать свой собственный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...