/// <summary> /// Произвести морфологический анализ текста. Если используете морфологию в составе лингвистического процессора из /// ProcessorService, то эту функцию явно вызывать не придётся. /// </summary> /// <param name="text">исходный текст</param> /// <param name="lang">базовый язык (если null, то будет определён автоматически)</param> /// <param name="progress">это для бегунка</param> /// <return>последовательность результирующих лексем MorphToken</return> public static List <MorphToken> Process(string text, MorphLang lang = null, ProgressChangedEventHandler progress = null) { if (string.IsNullOrEmpty(text)) { return(null); } List <MorphToken> res = m_Morph.Run(text, false, lang, false, progress); if (res != null) { foreach (MorphToken r in res) { if (r.WordForms == null) { r.WordForms = m_EmptyWordForms; } foreach (MorphWordForm wf in r.WordForms) { if (wf.Misc == null) { wf.Misc = m_EmptyMisc; } } } } return(res); }
/// <summary> /// Инициализация внутренних словарей. /// Можно не вызывать, но тогда будет автоматически вызвано при первом обращении к морфологии, /// и соответственно первый разбор отработает на несколько секунд дольше. /// Если используете Sdk.Initialize() или ProcessorService.Initialize(), то тогда эту функцию вызывать не нужно, /// так как там внутри это делается. /// </summary> /// <param name="langs">по умолчанию, русский и английский</param> public static void Initialize(MorphLang langs = null) { Pullenti.Morph.Internal.UnicodeInfo.Initialize(); if (langs == null || langs.IsUndefined) { langs = MorphLang.RU | MorphLang.EN; } m_Morph.LoadLanguages(langs, LazyLoad); }
/// <summary> /// Получить для словоформы род\число\падеж /// </summary> /// <param name="word">словоформа</param> /// <param name="lang">возможный язык</param> /// <param name="isCaseNominative">исходное слово в именительном падеже (иначе считается падеж любым)</param> /// <param name="inDictOnly">при true не строить гипотезы для несловарных слов</param> /// <return>базовая морфологическая информация</return> public static MorphWordForm GetWordBaseInfo(string word, MorphLang lang = null, bool isCaseNominative = false, bool inDictOnly = false) { List <MorphToken> mt = m_Morph.Run(word, false, lang, false, null); MorphWordForm bi = new MorphWordForm(); MorphClass cla = new MorphClass(); if (mt != null && mt.Count > 0) { for (int k = 0; k < 2; k++) { bool ok = false; foreach (MorphWordForm wf in mt[0].WordForms) { if (k == 0) { if (!wf.IsInDictionary) { continue; } } else if (wf.IsInDictionary) { continue; } if (isCaseNominative) { if (!wf.Case.IsNominative && !wf.Case.IsUndefined) { continue; } } cla.Value |= wf.Class.Value; bi.Gender |= wf.Gender; bi.Case |= wf.Case; bi.Number |= wf.Number; if (wf.Misc != null && bi.Misc == null) { bi.Misc = wf.Misc; } ok = true; } if (ok || inDictOnly) { break; } } } bi.Class = cla; return(bi); }
/// <summary> /// Получить все варианты словоформ для нормальной формы слова /// </summary> /// <param name="lang">язык (по умолчанию, русский)</param> /// <return>список словоформ MorphWordForm</return> public static List <MorphWordForm> GetAllWordforms(string word, MorphLang lang = null) { List <MorphWordForm> res = m_Morph.GetAllWordforms(word, lang); if (res != null) { foreach (MorphWordForm r in res) { if (r.Misc == null) { r.Misc = m_EmptyMisc; } } } return(res); }
public void CopyFrom(MorphBaseInfo src) { MorphClass cla = new MorphClass(); cla.Value = src.Class.Value; Class = cla; Gender = src.Gender; Number = src.Number; MorphCase cas = new MorphCase(); cas.Value = src.Case.Value; Case = cas; MorphLang lng = new MorphLang(); lng.Value = src.Language.Value; Language = lng; }
/// <summary> /// Преобразовать из строки /// </summary> public static bool TryParse(string str, out MorphLang lang) { lang = new MorphLang(); while (!string.IsNullOrEmpty(str)) { int i; for (i = 0; i < m_Names.Length; i++) { if (str.StartsWith(m_Names[i], StringComparison.OrdinalIgnoreCase)) { break; } } if (i >= m_Names.Length) { break; } lang.Value |= ((short)(1 << i)); for (i = 2; i < str.Length; i++) { if (char.IsLetter(str[i])) { break; } } if (i >= str.Length) { break; } str = str.Substring(i); } if (lang.IsUndefined) { return(false); } return(true); }
internal static MorphLang GetWordLang(string word) { int cyr = 0; int lat = 0; int undef = 0; foreach (char ch in word) { Pullenti.Morph.Internal.UnicodeInfo ui = Pullenti.Morph.Internal.UnicodeInfo.AllChars[(int)ch]; if (ui.IsLetter) { if (ui.IsCyrillic) { cyr++; } else if (ui.IsLatin) { lat++; } else { undef++; } } } if (undef > 0) { return(MorphLang.Unknown); } if (cyr == 0 && lat == 0) { return(MorphLang.Unknown); } if (cyr == 0) { return(MorphLang.EN); } if (lat > 0) { return(MorphLang.Unknown); } MorphLang lang = (MorphLang.UA | MorphLang.RU | MorphLang.BY) | MorphLang.KZ; foreach (char ch in word) { Pullenti.Morph.Internal.UnicodeInfo ui = Pullenti.Morph.Internal.UnicodeInfo.AllChars[(int)ch]; if (ui.IsLetter) { if (ch == 'Ґ' || ch == 'Є' || ch == 'Ї') { lang.IsRu = false; lang.IsBy = false; } else if (ch == 'І') { lang.IsRu = false; } else if (ch == 'Ё' || ch == 'Э') { lang.IsUa = false; lang.IsKz = false; } else if (ch == 'Ы') { lang.IsUa = false; } else if (ch == 'Ў') { lang.IsRu = false; lang.IsUa = false; } else if (ch == 'Щ') { lang.IsBy = false; } else if (ch == 'Ъ') { lang.IsBy = false; lang.IsUa = false; lang.IsKz = false; } else if ((((ch == 'Ә' || ch == 'Ғ' || ch == 'Қ') || ch == 'Ң' || ch == 'Ө') || ((ch == 'Ұ' && word.Length > 1)) || ch == 'Ү') || ch == 'Һ') { lang.IsBy = false; lang.IsUa = false; lang.IsRu = false; } else if ((ch == 'В' || ch == 'Ф' || ch == 'Ц') || ch == 'Ч' || ch == 'Ь') { lang.IsKz = false; } } } return(lang); }
/// <summary> /// Выгрузить язык(и), если они больше не нужны /// </summary> /// <param name="langs">выгружаемые языки</param> public static void UnloadLanguages(MorphLang langs) { m_Morph.UnloadLanguages(langs); }
/// <summary> /// Загрузить язык(и), если они ещё не загружены /// </summary> /// <param name="langs">загружаемые языки</param> public static void LoadLanguages(MorphLang langs) { m_Morph.LoadLanguages(langs, LazyLoad); }
/// <summary> /// Попробовать откорретировать одну букву словоформы, чтобы получилось словарное слово /// </summary> /// <param name="word">искаженное слово</param> /// <param name="lang">возможный язык</param> /// <return>откорректированное слово или null при невозможности</return> public static string CorrectWord(string word, MorphLang lang = null) { return(m_Morph.CorrectWordByMorph(word, lang)); }