Пример #1
0
        /// <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);
        }
Пример #2
0
 /// <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);
 }
Пример #3
0
        /// <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);
        }
Пример #4
0
        /// <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);
        }
Пример #5
0
        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;
        }
Пример #6
0
 /// <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);
 }
Пример #7
0
        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);
        }
Пример #8
0
 /// <summary>
 /// Выгрузить язык(и), если они больше не нужны
 /// </summary>
 /// <param name="langs">выгружаемые языки</param>
 public static void UnloadLanguages(MorphLang langs)
 {
     m_Morph.UnloadLanguages(langs);
 }
Пример #9
0
 /// <summary>
 /// Загрузить язык(и), если они ещё не загружены
 /// </summary>
 /// <param name="langs">загружаемые языки</param>
 public static void LoadLanguages(MorphLang langs)
 {
     m_Morph.LoadLanguages(langs, LazyLoad);
 }
Пример #10
0
 /// <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));
 }