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); }
public void WhenNoTestsChosen_ShouldReturnFalse() { const string kevin = "kevin"; var options = new FuzzyStringComparisonOptions[0]; Assert.False(kevin.ApproximatelyEquals(kevin, FuzzyStringComparisonTolerance.Weak, options)); }
public void WhenNoTestsChosen_ShouldReturnOne() { const string kevin = "kevin"; var options = new FuzzyStringComparisonOptions[0]; var result = kevin.CalculateComparisonAverage(kevin, options); Assert.Equal(1, result); }
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); }
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); }
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); }
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); }
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; }
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; } }