Как я могу реализовать ввод списка массивов для алгоритма подобия строк?

Я реализовал алгоритм jarowinkler. В этом алгоритме я взял источник строки и цель строки. Строковая цель, принимаемая в качестве входной строки, исходная строка принимается в качестве массива, такого как источник [0]. Как можно реализовать алгоритм jarowinkler в качестве ввода списка массивов? Пожалуйста, смотрите код ниже

public static class JaroWinklerDistance
{
private static readonly double mWeightThreshold = 0.7;

private static readonly int mNumChars = 4;



public static double distance(string source, string target)
{
    return 1.0 - proximity(source, target);
}


public static double proximity(string aString1, string aString2)
{
    int lLen1 = aString1.Length;
    int lLen2 = aString2.Length;
    if (lLen1 == 0)
        return lLen2 == 0 ? 1.0 : 0.0;

    int lSearchRange = Math.Max(0, Math.Max(lLen1, lLen2) / 2 - 1);

    bool[] lMatched1 = new bool[lLen1];
    bool[] lMatched2 = new bool[lLen2];

    int lNumCommon = 0;
    for (int i = 0; i < lLen1; ++i)
    {
        int lStart = Math.Max(0, i - lSearchRange);
        int lEnd = Math.Min(i + lSearchRange + 1, lLen2);
        for (int j = lStart; j < lEnd; ++j)
        {
            if (lMatched2[j]) continue;
            if (aString1[i] != aString2[j])
                continue;
            lMatched1[i] = true;
            lMatched2[j] = true;
            ++lNumCommon;
            break;
        }
    }
    if (lNumCommon == 0) return 0.0;

    int lNumHalfTransposed = 0;
    int k = 0;
    for (int i = 0; i < lLen1; ++i)
    {
        if (!lMatched1[i]) continue;
        while (!lMatched2[k]) ++k;
        if (aString1[i] != aString2[k])
            ++lNumHalfTransposed;
        ++k;
    }
    int lNumTransposed = lNumHalfTransposed / 2;
  double lNumCommonD = lNumCommon;
    double lWeight = (lNumCommonD / lLen1
                     + lNumCommonD / lLen2
                     + (lNumCommon - lNumTransposed) / lNumCommonD) / 3.0;

    if (lWeight <= mWeightThreshold) return lWeight;
    int lMax = Math.Min(mNumChars, Math.Min(aString1.Length, aString2.Length));
    int lPos = 0;
    while (lPos < lMax && aString1[lPos] == aString2[lPos])
        ++lPos;
    if (lPos == 0) return lWeight;
    return lWeight + 0.1 * lPos * (1.0 - lWeight);

}

}

Приведенный выше код представляет собой статический класс, который необходимо реализовать как список массивов для этого класса. Список массивов должен сравниваться в соответствии с алгоритмом Яро Винклера. В приведенном ниже коде я публикую свой основной класс.

 class Program
{

    static void Main(string[] args)
    {
        string target;
        string[] source1 = new string[]
            {
                "xyz technology solutions"
            };


        while (true)
        {

            Console.Write("Please enter target string: ");
            target = Console.ReadLine();
            numbersInput.Add(target);


            Console.WriteLine("jarowinkler::{0}%", JaroWinklerDistance.proximity(source1[0].ToLower(), target.ToLower()) * 100);



        }
    }
}}

поэтому мне нужно реализовать список массивов для этого кода, принимающего входные данные от arraylist. Разделите этот список на слова. Слова сравнения должны сравнивать источник и цель, а затем дают процент совпадения.


person karakkayala charan tej    schedule 09.08.2018    source источник
comment
Пожалуйста, подробно опишите, что вы пробовали, где застряли и что именно вызывает у вас проблемы. Также «я реализовал» — это очень причудливый способ сказать «я скопировал» алгоритм Джаро-Винклера из наверное здесь.   -  person Milster    schedule 09.08.2018
comment
Милстер, я видел ссылку выше, которую ты разместил. но он реализован как вышеприведенный код. Я спрашиваю о том, как реализовать список массивов для приведенного выше кода. как сравнить с jarowinkler эти источники и цели arraylist.   -  person karakkayala charan tej    schedule 09.08.2018


Ответы (1)


Вам необходимо предоставить желаемый пример использования. Насколько я понял, вам нужно что-то вроде:

ArrayList targets = new ArrayList();
targets.Add("word1");
targets.Add("word2");
targets.Add("word3");
double distPercentage = JaroWinklerDistance.meanProximity("sourceWord", targets);

В этом случае вы должны просто перебирать элементы ArrayList и вызывать «.proximity» для каждого элемента, преобразованного в строку.

Кстати, лучше использовать

List<string> 

вместо ArrayList, потому что вы имеете дело именно со строками

person Andrey Thygmunt    schedule 09.08.2018