Ejemplo n.º 1
0
        protected bool FindFuzzyEnum(string name, out string correctName, out FuzzyStringComparisonOptions correctValue)
        {
            name         = name.StartsWith("Use") ? name : "Use" + name;
            correctValue = 0;
            correctName  = string.Empty;
            var type  = typeof(FuzzyStringComparisonOptions);
            var names = Enum.GetNames(type);

            if (names.Contains(name, StringComparer.InvariantCultureIgnoreCase))
            {
                correctName = names.Single(x => StringComparer.InvariantCultureIgnoreCase.Compare(name, x) == 0);
            }
            else if (names.Contains(name + "Distance", StringComparer.InvariantCultureIgnoreCase))
            {
                correctName = names.Single(x => StringComparer.InvariantCultureIgnoreCase.Compare(name + "Distance", x) == 0);
            }
            else if (names.Count(x => x.StartsWith(name, StringComparison.InvariantCultureIgnoreCase)) == 1)
            {
                correctName = names.Single(x => x.StartsWith(name, StringComparison.InvariantCultureIgnoreCase));
            }
            else
            {
                return(false);
            }

            correctValue = (FuzzyStringComparisonOptions)Enum.Parse(type, correctName);

            return(true);
        }
Ejemplo n.º 2
0
        public void WhenNoTestsChosen_ShouldReturnFalse()
        {
            const string kevin = "kevin";

            var options = new FuzzyStringComparisonOptions[0];

            Assert.False(kevin.ApproximatelyEquals(kevin, FuzzyStringComparisonTolerance.Weak, options));
        }
Ejemplo n.º 3
0
        public void WhenNoTestsChosen_ShouldReturnOne()
        {
            const string kevin = "kevin";

            var options = new FuzzyStringComparisonOptions[0];

            var result = kevin.CalculateComparisonAverage(kevin, options);

            Assert.Equal(1, result);
        }
Ejemplo n.º 4
0
        public void WhenMatchingStrings_AndSingleComparisonOption_ShouldReturnExpectedValue(
            FuzzyStringComparisonOptions fuzzyStringComparisonOption, double expectedValue)
        {
            const string kevin = "kevin";

            var options = new[]
            {
                fuzzyStringComparisonOption,
            };

            var result = kevin.CalculateComparisonAverage(kevin, options);

            Assert.Equal(expectedValue, result);
        }
Ejemplo n.º 5
0
        public void WhenSimilarString_ShouldReturnExpectedValue(FuzzyStringComparisonOptions fuzzyStringComparisonOption, FuzzyStringComparisonTolerance fuzzyStringComparisonTolerance, bool expectedValue)
        {
            const string kevin = "kevin";
            const string kevyn = "kevyn";

            var options = new[]
            {
                fuzzyStringComparisonOption,
            };

            var result = kevin.ApproximatelyEquals(kevyn, fuzzyStringComparisonTolerance, options);

            Assert.Equal(expectedValue, result);
        }
Ejemplo n.º 6
0
        public void WhenDifferentString_AndSingleComparisonOption_ShouldReturnExpectedValue(
            FuzzyStringComparisonOptions fuzzyStringComparisonOption, double expectedValue)
        {
            const string kevin     = "kevin";
            const string abcxyz123 = "abcxyz123";

            var options = new[]
            {
                fuzzyStringComparisonOption,
            };

            var result = kevin.CalculateComparisonAverage(abcxyz123, options);

            Assert.Equal(expectedValue, result);
        }
Ejemplo n.º 7
0
        static void Main(string[] args)
        {
            string kevin = "kevin";
            string kevyn = "kevyn";

            var options = new FuzzyStringComparisonOptions[]
            {
                FuzzyStringComparisonOptions.UseJaccardDistance,
                FuzzyStringComparisonOptions.UseNormalizedLevenshteinDistance,
                FuzzyStringComparisonOptions.UseOverlapCoefficient,
                FuzzyStringComparisonOptions.UseLongestCommonSubsequence,
                FuzzyStringComparisonOptions.CaseSensitive
            };

            Console.WriteLine(kevin.ApproximatelyEquals(kevyn, FuzzyStringComparisonTolerance.Weak, options));
            Console.WriteLine(kevin.ApproximatelyEquals(kevyn, FuzzyStringComparisonTolerance.Normal, options));
            Console.WriteLine(kevin.ApproximatelyEquals(kevyn, FuzzyStringComparisonTolerance.Strong, options));

            Console.ReadLine();
        }
        public FuzzyStringComparisonOptions[] getComparisonOptions(String options)
        {
            var optlist     = sdistOpts.opts;
            var optionNames = sdistOpts.optnames;
            var opts        = options.Split(',');

            FuzzyStringComparisonOptions[] parsedOptions = null;
            if (opts[0].ToLower() == "all")
            {
                parsedOptions = new FuzzyStringComparisonOptions[13];
                for (int i = 0; i < 13; i++)
                {
                    parsedOptions[i] = optlist[optionNames[i]];
                }
            }
            else if (opts.Length > 1)
            {
                const List <FuzzyStringComparisonOptions> temp = null;
                for (int i = 0; i < opts.Length; i++)
                {
                    if (optlist.ContainsKey(opts[i]))
                    {
                        temp.Add(optlist[opts[i]]);
                    }
                }
                temp.CopyTo(parsedOptions);
            }
            else if (opts.Length == 1)
            {
                if (optlist.ContainsKey(opts[0]))
                {
                    parsedOptions[0] = optlist[opts[0]];
                }
            }
            else
            {
                parsedOptions[0] = optlist["jaroWinkler"];
            }
            return(parsedOptions);
        }
Ejemplo n.º 9
0
        public static bool ApproximatelyEquals(this string source, string target, FuzzyStringComparisonOptions options, FuzzyStringComparisonTolerance tolerance)
        {
            List <double> comparisonResults = new List <double>();

            if (!options.HasFlag(FuzzyStringComparisonOptions.CaseSensitive))
            {
                source = source.Capitalize();
                target = target.Capitalize();
            }

            // Min: 0    Max: source.Length = target.Length
            if (options.HasFlag(FuzzyStringComparisonOptions.UseHammingDistance))
            {
                if (source.Length == target.Length)
                {
                    comparisonResults.Add(source.HammingDistance(target) / target.Length);
                }
            }

            // Min: 0    Max: 1
            if (options.HasFlag(FuzzyStringComparisonOptions.UseJaccardDistance))
            {
                comparisonResults.Add(source.JaccardDistance(target));
            }

            // Min: 0    Max: 1
            if (options.HasFlag(FuzzyStringComparisonOptions.UseJaroDistance))
            {
                comparisonResults.Add(source.JaroDistance(target));
            }

            // Min: 0    Max: 1
            if (options.HasFlag(FuzzyStringComparisonOptions.UseJaroWinklerDistance))
            {
                comparisonResults.Add(source.JaroWinklerDistance(target));
            }

            // Min: 0    Max: LevenshteinDistanceUpperBounds - LevenshteinDistanceLowerBounds
            // Min: LevenshteinDistanceLowerBounds    Max: LevenshteinDistanceUpperBounds
            if (options.HasFlag(FuzzyStringComparisonOptions.UseNormalizedLevenshteinDistance))
            {
                comparisonResults.Add(Convert.ToDouble(source.NormalizedLevenshteinDistance(target)) / Convert.ToDouble((Math.Max(source.Length, target.Length) - source.LevenshteinDistanceLowerBounds(target))));
            }
            else if (options.HasFlag(FuzzyStringComparisonOptions.UseLevenshteinDistance))
            {
                comparisonResults.Add(Convert.ToDouble(source.LevenshteinDistance(target)) / Convert.ToDouble(source.LevenshteinDistanceUpperBounds(target)));
            }

            if (options.HasFlag(FuzzyStringComparisonOptions.UseLongestCommonSubsequence))
            {
                comparisonResults.Add(1 - Convert.ToDouble((source.LongestCommonSubsequence(target).Length) / Convert.ToDouble(Math.Min(source.Length, target.Length))));
            }

            if (options.HasFlag(FuzzyStringComparisonOptions.UseLongestCommonSubstring))
            {
                comparisonResults.Add(1 - Convert.ToDouble((source.LongestCommonSubstring(target).Length) / Convert.ToDouble(Math.Min(source.Length, target.Length))));
            }

            // Min: 0    Max: 1
            if (options.HasFlag(FuzzyStringComparisonOptions.UseSorensenDiceDistance))
            {
                comparisonResults.Add(source.SorensenDiceDistance(target));
            }

            // Min: 0    Max: 1
            if (options.HasFlag(FuzzyStringComparisonOptions.UseOverlapCoefficient))
            {
                comparisonResults.Add(1 - source.OverlapCoefficient(target));
            }

            // Min: 0    Max: 1
            if (options.HasFlag(FuzzyStringComparisonOptions.UseRatcliffObershelpSimilarity))
            {
                comparisonResults.Add(1 - source.RatcliffObershelpSimilarity(target));
            }

            if (tolerance == FuzzyStringComparisonTolerance.Strong)
            {
                if (comparisonResults.Average() < 0.25)
                {
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
            else if (tolerance == FuzzyStringComparisonTolerance.Normal)
            {
                if (comparisonResults.Average() < 0.5)
                {
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
            else if (tolerance == FuzzyStringComparisonTolerance.Weak)
            {
                if (comparisonResults.Average() < 0.75)
                {
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
            else if (tolerance == FuzzyStringComparisonTolerance.Manual)
            {
                if (comparisonResults.Average() > 0.6)
                {
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
            else
            {
                return(false);
            }
        }
 public FuzzyStringComparisonOptions[] getComparisonOptions(String options) {
     var optlist = sdistOpts.opts;
     var optionNames = sdistOpts.optnames;
     var opts = options.Split(',');
     FuzzyStringComparisonOptions[] parsedOptions = null;
     if (opts[0].ToLower() == "all") {
         parsedOptions = new FuzzyStringComparisonOptions[13];
         for (int i = 0; i < 13; i++) parsedOptions[i] = optlist[optionNames[i]];
     }
     else if (opts.Length > 1) {
         const List<FuzzyStringComparisonOptions> temp = null;
         for (int i = 0; i < opts.Length; i++) {
             if (optlist.ContainsKey(opts[i])) temp.Add(optlist[opts[i]]);
         }
         temp.CopyTo(parsedOptions);
     }
     else if (opts.Length == 1) {
         if (optlist.ContainsKey(opts[0])) parsedOptions[0] = optlist[opts[0]];
     } else {
         parsedOptions[0] = optlist["jaroWinkler"];
     }
     return parsedOptions;
 }
Ejemplo n.º 11
0
        public static bool ApproximatelyEquals(this string source, string target, FuzzyStringComparisonOptions options, FuzzyStringComparisonTolerance tolerance)
        {
            List<double> comparisonResults = new List<double>();

            if (!options.HasFlag(FuzzyStringComparisonOptions.CaseSensitive))
            {
                source = source.Capitalize();
                target = target.Capitalize();
            }

            // Min: 0    Max: source.Length = target.Length
            if (options.HasFlag(FuzzyStringComparisonOptions.UseHammingDistance))
            {
                if (source.Length == target.Length)
                {
                    comparisonResults.Add(source.HammingDistance(target) / target.Length);
                }
            }

            // Min: 0    Max: 1
            if (options.HasFlag(FuzzyStringComparisonOptions.UseJaccardDistance))
            {
                comparisonResults.Add(source.JaccardDistance(target));
            }

            // Min: 0    Max: 1
            if (options.HasFlag(FuzzyStringComparisonOptions.UseJaroDistance))
            {
                comparisonResults.Add(source.JaroDistance(target));
            }

            // Min: 0    Max: 1
            if (options.HasFlag(FuzzyStringComparisonOptions.UseJaroWinklerDistance))
            {
                comparisonResults.Add(source.JaroWinklerDistance(target));
            }

            // Min: 0    Max: LevenshteinDistanceUpperBounds - LevenshteinDistanceLowerBounds
            // Min: LevenshteinDistanceLowerBounds    Max: LevenshteinDistanceUpperBounds
            if (options.HasFlag(FuzzyStringComparisonOptions.UseNormalizedLevenshteinDistance))
            {
                comparisonResults.Add(Convert.ToDouble(source.NormalizedLevenshteinDistance(target)) / Convert.ToDouble((Math.Max(source.Length, target.Length) - source.LevenshteinDistanceLowerBounds(target))));
            }
            else if (options.HasFlag(FuzzyStringComparisonOptions.UseLevenshteinDistance))
            {
                comparisonResults.Add(Convert.ToDouble(source.LevenshteinDistance(target)) / Convert.ToDouble(source.LevenshteinDistanceUpperBounds(target)));
            }

            if (options.HasFlag(FuzzyStringComparisonOptions.UseLongestCommonSubsequence))
            {
                comparisonResults.Add(1 - Convert.ToDouble((source.LongestCommonSubsequence(target).Length) / Convert.ToDouble(Math.Min(source.Length, target.Length))));
            }

            if (options.HasFlag(FuzzyStringComparisonOptions.UseLongestCommonSubstring))
            {
                comparisonResults.Add(1 - Convert.ToDouble((source.LongestCommonSubstring(target).Length) / Convert.ToDouble(Math.Min(source.Length, target.Length))));
            }

            // Min: 0    Max: 1
            if (options.HasFlag(FuzzyStringComparisonOptions.UseSorensenDiceDistance))
            {
                comparisonResults.Add(source.SorensenDiceDistance(target));
            }

            // Min: 0    Max: 1
            if (options.HasFlag(FuzzyStringComparisonOptions.UseOverlapCoefficient))
            {
                comparisonResults.Add(1 - source.OverlapCoefficient(target));
            }

            // Min: 0    Max: 1
            if (options.HasFlag(FuzzyStringComparisonOptions.UseRatcliffObershelpSimilarity))
            {
                comparisonResults.Add(1 - source.RatcliffObershelpSimilarity(target));
            }

            if (tolerance == FuzzyStringComparisonTolerance.Strong)
            {
                if (comparisonResults.Average() < 0.25)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else if (tolerance == FuzzyStringComparisonTolerance.Normal)
            {
                if (comparisonResults.Average() < 0.5)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else if (tolerance == FuzzyStringComparisonTolerance.Weak)
            {
                if (comparisonResults.Average() < 0.75)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else if (tolerance == FuzzyStringComparisonTolerance.Manual)
            {
                if (comparisonResults.Average() > 0.6)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }