Пример #1
0
 public static IList <T> FindClosestForms <T>(IEnumerable itemsToSearch,
                                              GetStringDelegate <T> itemFormExtractor,
                                              string notNormalizedFormToMatch,
                                              ApproximateMatcherOptions options)
 {
     return(FindClosestForms(itemsToSearch, itemFormExtractor, notNormalizedFormToMatch, options, 999));
 }
Пример #2
0
 /// <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)));
 }
Пример #3
0
        // 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);
        }
Пример #4
0
 public static IList <string> FindClosestForms(IEnumerable forms,
                                               string notNormalizedFormToMatch,
                                               ApproximateMatcherOptions options)
 {
     return(FindClosestForms <string>(forms, Self, notNormalizedFormToMatch, options));
 }