public FullLemmaInfo[] FastFindAllWord(string word) { word = word.ToUpper(); List <FullLemmaInfo> result = new List <FullLemmaInfo>(); if (Lemmas.ContainsKey(word)) { foreach (LemmaInfo li in Lemmas[word].GetItems()) { FlexiaModel flexiaModel = this.FlexiaModels[li.FlexiaModelNo]; FullLemmaInfo fi = new FullLemmaInfo(li.FlexiaModelNo, li.AccentModelNo, li.CommonAncode); fi.CommonLemma = word; fi.CommonMF = flexiaModel.FirstMF; fi.CurrentMF = flexiaModel.FirstMF; result.Add(fi); } } for (int i = 0; i <= word.Length && i < FastFlexia.Length; i++) { string end = word.Substring(word.Length - i); List <int> nos; if (FastFlexia[i].TryGetValue(end, out nos)) { foreach (int iFlexiaModelNo in nos) { FlexiaModel flexiaModel = this.FlexiaModels[iFlexiaModelNo]; MorphologicForm morphForm = flexiaModel.FindMorphologicFormByFlex(end); { if (word.StartsWith(morphForm.PrefixStr)) { string commonWord = word.Substring(morphForm.PrefixStr.Length, word.Length - morphForm.FlexiaStr.Length - morphForm.PrefixStr.Length) + flexiaModel.FirstFlex; if (Lemmas.ContainsKey(commonWord)) { foreach (LemmaInfo li in Lemmas[commonWord].GetItems()) { if (li.FlexiaModelNo == iFlexiaModelNo) { FullLemmaInfo fi = new FullLemmaInfo(li.FlexiaModelNo, li.AccentModelNo, li.CommonAncode); fi.CommonLemma = commonWord; fi.CommonMF = flexiaModel.FirstMF; fi.CurrentMF = morphForm; result.Add(fi); } } } } } } } } return(result.ToArray()); }
//private FullLemmaInfo SlowFindWord(string word) //{ // Set<FullLemmaInfo> result = SlowFindAllWord(word); // if (result.Count == 0) // return FullLemmaInfo.Unknown; // FullLemmaInfo maxFlex = new FullLemmaInfo(); // foreach (FullLemmaInfo fi in result.Keys) // { // if (fi.CurrentMF.FlexiaStr != null // && (maxFlex.CurrentMF.FlexiaStr == null // || fi.CurrentMF.FlexiaStr.Length > maxFlex.CurrentMF.FlexiaStr.Length)) // maxFlex = fi; // } // return maxFlex; //} //private Set<FullLemmaInfo> SlowFindAllWord(string word) //{ // word = word.ToUpper(); // Set<FullLemmaInfo> result = new Set<FullLemmaInfo>(); // if (FlexiaModels != null) // for (int iFlexiaModelNo = 0; iFlexiaModelNo < FlexiaModels.Count; iFlexiaModelNo++) // { // FlexiaModel flexiaModel = this.FlexiaModels[iFlexiaModelNo]; // if (flexiaModel.Flexia != null && flexiaModel.Flexia.Values.Count != 0) // foreach (MorphologicForm morphForm in flexiaModel.Flexia.Values) // { // if (word.EndsWith(morphForm.FlexiaStr) && (word.StartsWith(morphForm.PrefixStr))) // { // string commonWord = word.Substring(morphForm.PrefixStr.Length, word.Length - morphForm.FlexiaStr.Length - morphForm.PrefixStr.Length) + flexiaModel.FirstFlex; // if (Lemmas.ContainsKey(commonWord)) // { // foreach( // if (Lemmas[commonWord].FlexiaModelNo == iFlexiaModelNo) // { // FullLemmaInfo fi = new FullLemmaInfo(Lemmas[commonWord].FlexiaModelNo, // Lemmas[commonWord].AccentModelNo, // Lemmas[commonWord].CommonAncode); // fi.CommonLemma = commonWord; // fi.CommonMF = flexiaModel.FirstMF; // fi.CurrentMF = morphForm; // result.Add(fi); // } // } // } // } // } // return result; //} #endregion #region New/Fast find functions #if ENABLE_FAST_FINDING public FullLemmaInfo FastFindWord(string word) { //Set<FullLemmaInfo> result = FindAllWord(word); FullLemmaInfo[] result = FastFindAllWord(word); if (result.Length == 0) { return(FullLemmaInfo.Unknown); } FullLemmaInfo maxFlex = new FullLemmaInfo(); foreach (FullLemmaInfo fi in result) { if (fi.CurrentMF.FlexiaStr != null && (maxFlex.CurrentMF.FlexiaStr == null || fi.CurrentMF.FlexiaStr.Length > maxFlex.CurrentMF.FlexiaStr.Length)) { maxFlex = fi; } } return(maxFlex); }
public void Add(FullLemmaInfo fullLemmaInfo) { Result.Add(fullLemmaInfo); }