- CSharp
- http://yandex.ru/yandsearch?te...- http://habrahabr.ru/blogs/net/...- http://ya.topbot.ru/post/Lucen...- http://www.google.by/url?sa=t&...- http://ya.topbloger.ru/post/Lu...
Please wait, it may take some time...
Copy Source | Copy HTMLnamespace Lucene.Net.Analysis.Morphology { using LEMMATIZERLib;//морфология using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Diagnostics; using System.IO; using System.Text; using System.Text.RegularExpressions; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; /// <summary> /// Работа с морфологией для анг. и русского языка /// </summary> public class MorphENRU { /// <summary> /// Регулярное выражение для определения английских слов /// </summary> private Regex rWordEn = new Regex(@"[a-z0-9]+", RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.ExplicitCapture); /// <summary>Анализатор английских слов</summary> private ILemmatizer Lemmatizer_en; /// <summary> /// Анализатор русских слов /// </summary> private ILemmatizer Lemmatizer_ru; public MorphENRU() { //в конструкторе нужно загрузить морфологию try { Lemmatizer_ru = new LemmatizerRussianClass(); Lemmatizer_ru.LoadDictionariesRegistry(); Lemmatizer_en = new LemmatizerEnglishClass(); Lemmatizer_en.LoadDictionariesRegistry(); Debug.WriteLine("Загрузка морфологи успешно завершена."); } catch (Exception e) { Debug.WriteLine("Ошибка при открытиии морфологического словаря: " + e.Message); //ошибка может быть по многим причинам - например, //кто-то удалил файлы словарей или истекла лицензия, //тогда игнорируем морфологию Lemmatizer_ru = null; Lemmatizer_en = null; } } /// <summary> /// Делаем слово морфологически инвариантным /// </summary> /// <param name="word"></param> /// <returns></returns> public List<string> NormalizeWord(string word) { List<string> WordList = null; if (Lemmatizer_ru != null && Lemmatizer_en != null) { //если ошибка в словарях, то пропускаем обработку int weight = -1; bool isEng = this.rWordEn.Match(word).Success;//английское или русское слово // ищем варианты в словаре IParadigmCollection ParadigmCollection = isEng ? Lemmatizer_en.CreateParadigmCollectionFromForm(word, 1, 1) : Lemmatizer_ru.CreateParadigmCollectionFromForm(word, 1, 1); // выбираем наиболее тяжелое по весу for (int j = 0; j < ParadigmCollection.Count; j++) { if (ParadigmCollection[j].WordWeight > weight) { if (ParadigmCollection[j].Norm == "ДЛИТЬ") continue; //будем брать всего одно самое весовое слово для морфологии if (WordList == null) { WordList = new List<string>(); WordList.Add(ParadigmCollection[j].Norm.ToLower()); } else { WordList[0] = ParadigmCollection[j].Norm.ToLower(); } weight = ParadigmCollection[j].WordWeight; //графемы нам не нужны //gramma = this.ParadigmCollection[j].SrcAncode; } } } return WordList; } } }