public static IList <T> FindClosestForms <T>(IEnumerable itemsToSearch, GetStringDelegate <T> itemFormExtractor, string notNormalizedFormToMatch, ApproximateMatcherOptions options) { return(FindClosestForms(itemsToSearch, itemFormExtractor, notNormalizedFormToMatch, options, 999)); }
/// <summary> /// Gets a ResultSet containing entries whose lexical form is similar to lexicalForm /// sorted by the lexical form in the given writingsystem. /// Use "Form" to access the lexical form in a RecordToken. /// </summary> /// <returns></returns> public ResultSet <LexEntry> GetEntriesWithSimilarLexicalForm(string lexicalForm, WritingSystemDefinition writingSystemDefinition, ApproximateMatcherOptions matcherOptions) { if (lexicalForm == null) { throw new ArgumentNullException("lexicalForm"); } if (writingSystemDefinition == null) { throw new ArgumentNullException("writingSystemDefinition"); } return(new ResultSet <LexEntry>(this, ApproximateMatcher.FindClosestForms <RecordToken <LexEntry> >( GetAllEntriesSortedByLexicalForm(writingSystemDefinition), GetFormForMatchingStrategy, lexicalForm, matcherOptions))); }
// would like to have IEnumerable<T> but IBindingList isn't strong typed public static IList <T> FindClosestForms <T>(IEnumerable itemsToSearch, GetStringDelegate <T> itemFormExtractor, string notNormalizedFormToMatch, ApproximateMatcherOptions options, int maxDistance) { string formToMatch = notNormalizedFormToMatch.Normalize(NormalizationForm.FormD); bool includeNextClosest = (options & ApproximateMatcherOptions.IncludeNextClosestForms) == ApproximateMatcherOptions.IncludeNextClosestForms; bool includeApproximatePrefixedForms = (options & ApproximateMatcherOptions.IncludePrefixedForms) == ApproximateMatcherOptions.IncludePrefixedForms; List <T> bestMatches = new List <T>(); List <T> secondBestMatches = new List <T>(); int bestEditDistance = int.MaxValue; int secondBestEditDistance = int.MaxValue; foreach (T item in itemsToSearch) { string originalForm = itemFormExtractor(item); if (!string.IsNullOrEmpty(originalForm)) { string form = originalForm.Normalize(NormalizationForm.FormD); if (!string.IsNullOrEmpty(form)) { int editDistance; editDistance = EditDistance(formToMatch, form, secondBestEditDistance, includeApproximatePrefixedForms); if (editDistance > maxDistance) { continue; } if (editDistance < bestEditDistance) { if (includeNextClosest && bestEditDistance != int.MaxValue) { // best becomes second best secondBestMatches.Clear(); secondBestMatches.AddRange(bestMatches); secondBestEditDistance = bestEditDistance; } bestMatches.Clear(); bestEditDistance = editDistance; } else if (includeNextClosest && editDistance > bestEditDistance && editDistance < secondBestEditDistance) { secondBestEditDistance = editDistance; secondBestMatches.Clear(); } if (editDistance == bestEditDistance) { bestMatches.Add(item); } else if (includeNextClosest && editDistance == secondBestEditDistance) { secondBestMatches.Add(item); } Debug.Assert(bestEditDistance != secondBestEditDistance); } } } if (includeNextClosest) { bestMatches.AddRange(secondBestMatches); } return(bestMatches); }
public static IList <string> FindClosestForms(IEnumerable forms, string notNormalizedFormToMatch, ApproximateMatcherOptions options) { return(FindClosestForms <string>(forms, Self, notNormalizedFormToMatch, options)); }