Search code examples
c#.netmodel-view-controllergenetic-algorithmstring-algorithm

How can I implement array list input for string similarity algorithm?


I implemented jarowinkler algorithm. In that algorithm I have taken string source and string target. String target taking as input string source taking as array like source[0]. How can implement jarowinkler algorithm as array list input? Please see below code

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);

}

}

The above code is static class need to implement as array list for that class. Array list must compare as per jaro winkler algorithm. The below code I posting my main class.

 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);



        }
    }
}}

so i need to implement array list for this code take input from arraylist. Split that list to words. Words compare must compare source and target then it give matching percentage.


Solution

  • You need to provide desired usage example. From what I understood You would like something like:

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

    In this case You should just iterate over ArrayList elements and call ".proximity" for each item transformed into string.

    By the way, it's better to use

    List<string> 
    

    instead of ArrayList because You are dealing specifically with strings