public void Spellcheck([DefaultValue(2)] int maxMiss)
        {
            var engine = new GrammarEngine(ConfigurationManager.AppSettings["GrammarPath"]);

            Console.WriteLine("Enter misspelled word to find its forms");
            while (true)
            {
                Console.Write("> ");
                string line = Console.ReadLine()?.Trim();
                if (string.IsNullOrEmpty(line))
                {
                    break;
                }

                var proj = engine.ProjectMisspelledWord(line, maxMiss);
                if (proj.Count == 0)
                {
                    Console.WriteLine("Nothing found!");
                    continue;
                }

                foreach (var projection in proj)
                {
                    Console.WriteLine(projection.Entry.Name);
                    foreach (var pair in projection.Pairs)
                    {
                        Console.WriteLine($"\t{pair.CoordCode}: {pair.StateCode}");
                    }
                }
            }
        }
Exemple #2
0
        public AnalysisResults AnalyzeSyntax(string _phrase, int id_language)
        {
            IntPtr          hPack = GrammarEngine.sol_SyntaxAnalysis(_hEngine, _phrase, 0, 0, 60000, id_language);
            AnalysisResults res   = new AnalysisResults(this, hPack);

            return(res);
        }
Exemple #3
0
        /// <summary>
        /// Пример: Восстановление предложения из грамматических характеристик каждого слова
        /// с использованием функций частей речи.
        /// </summary>

        /*
         * private string RestoreSentence(SentenceMap sentence)
         * {
         *      var sb = new StringBuilder();
         *      for (int i = 0; i < sentence.Capasity; i++)
         *      {
         *              var wmap = sentence.GetWordByOrder(i);
         *              string word = wmap.EntryName;
         *              var tok_buf = new StringBuilder(GrammarEngine.sol_MaxLexemLen(hEngine));
         *              int rc_res = -1;
         *              if (wmap.xPart.CanMorph)
         *              {
         *                      switch (wmap.xPart.MorphAs)
         *                      {
         *                              case Gren.GrenPart.NOUN_ru:
         *                                      rc_res = GrammarEngine.sol_GetNounForm(
         *                                                              hEngine,
         *                                                              wmap.ID_Entry,
         *                                                              wmap.GetPropertyValue(Gren.GrenProperty.NUMBER_ru),
         *                                                              wmap.GetPropertyValue(Gren.GrenProperty.CASE_ru),
         *                                                              tok_buf
         *                                                              );
         *                                      break;
         *                              case Gren.GrenPart.VERB_ru:
         *                                      rc_res = GrammarEngine.sol_GetVerbForm(
         *                                                              hEngine,
         *                                                              wmap.ID_Entry,
         *                                                              wmap.GetPropertyValue(Gren.GrenProperty.NUMBER_ru),
         *                                                              wmap.GetPropertyValue(Gren.GrenProperty.GENDER_ru),
         *                                                              wmap.GetPropertyValue(Gren.GrenProperty.TENSE_ru),
         *                                                              wmap.GetPropertyValue(Gren.GrenProperty.PERSON_ru),
         *                                                              tok_buf
         *                                                          );
         *                                      break;
         *                              case Gren.GrenPart.ADJ_ru:
         *                                      int rc_subj = GrammarEngine.sol_GetAdjectiveForm(
         *                                                              hEngine,
         *                                                              wmap.ID_Entry,
         *                                                              wmap.GetPropertyValue(Gren.GrenProperty.NUMBER_ru),
         *                                                              wmap.GetPropertyValue(Gren.GrenProperty.GENDER_ru),
         *                                                              wmap.GetPropertyValue(Gren.GrenProperty.CASE_ru),
         *                                                              wmap.GetPropertyValue(Gren.GrenProperty.FORM_ru),
         *                                                              wmap.GetPropertyValue(Gren.GrenProperty.SHORTNESS_ru),
         *                                                              wmap.GetPropertyValue(Gren.GrenProperty.COMPAR_FORM_ru),
         *                                                              tok_buf
         *                                                              );
         *                                      break;
         *                      }
         *                      word = tok_buf.ToString();
         *              }
         *              sb.Append(word);
         *              sb.Append(" ");
         *      }
         *
         *      return sb.ToString();
         * } */

        /// <summary>
        /// Разбивка текста на предложении.
        /// </summary>
        public List <string> SeparateIt(string text)
        {
            if (!IsReady)
            {
                return(null); //"Ошибка загрузки словаря.";
            }
            var outlist = new List <string>();

            // эту строку будет делить на предложения с помощью сегментатора
            // http://www.solarix.ru/api/ru/sol_CreateSentenceBrokerMem.shtml
            IntPtr hSegmenter = GrammarEngine.sol_CreateSentenceBrokerMemW(hEngine, text, GrammarEngineAPI.RUSSIAN_LANGUAGE);

            while (GrammarEngine.sol_FetchSentence(hSegmenter) >= 0)
            {
                // извлекаем очередное предложение...
                string sentence = GrammarEngine.sol_GetFetchedSentenceFX(hSegmenter);
                if (sentence.Length > 0)
                {
                    outlist.Add(sentence);
                }
            }

            // закончили извлекать предложения из текста - удаляем объект сегментатора
            // http://www.solarix.ru/api/ru/sol_DeleteSentenceBroker.shtml
            GrammarEngine.sol_DeleteSentenceBroker(hSegmenter);

            return(outlist);
        }
Exemple #4
0
        public AnalysisResults AnalyzeMorphology(string phrase, int id_language)
        {
            IntPtr          hPack = GrammarEngine.sol_MorphologyAnalysis(_hEngine, phrase, 0, 0, 0, id_language);
            AnalysisResults res   = new AnalysisResults(this, hPack);

            return(res);
        }
Exemple #5
0
        public System.Collections.Generic.List <string> GenerateWordforms(int EntryID, System.Collections.Generic.List <int> CoordID, System.Collections.Generic.List <int> StateID)
        {
            int npairs = CoordID.Count;

            int[] pairs = new int[npairs * 2];
            for (int i = 0, j = 0; i < npairs; ++i)
            {
                pairs[j++] = (int)CoordID[i];
                pairs[j++] = (int)StateID[i];
            }

            System.Collections.Generic.List <string> res = new System.Collections.Generic.List <string>();
            IntPtr hStr = GrammarEngine.sol_GenerateWordforms(_hEngine, EntryID, npairs, pairs);

            if (hStr != (IntPtr)0)
            {
                int nstr = GrammarEngine.sol_CountStrings(hStr);
                for (int k = 0; k < nstr; ++k)
                {
                    res.Add(GrammarEngine.sol_GetStringFX(hStr, k));
                }

                GrammarEngine.sol_DeleteStrings(hStr);
            }

            return(res);
        }
Exemple #6
0
        public AnalysisResults AnalyzeSyntax(string phrase, int id_language, SolarixGrammarEngineNET.GrammarEngine.MorphologyFlags morph_flags, SolarixGrammarEngineNET.GrammarEngine.SyntaxFlags syntax_flags, int constraints)
        {
            IntPtr          hPack = GrammarEngine.sol_SyntaxAnalysis(_hEngine, phrase, morph_flags, syntax_flags, constraints, id_language);
            AnalysisResults res   = new AnalysisResults(this, hPack);

            return(res);
        }
Exemple #7
0
        public AnalysisResults AnalyzeMorphology(string phrase, int id_language, SolarixGrammarEngineNET.GrammarEngine.MorphologyFlags flags, int constraints)
        {
            IntPtr          hPack = GrammarEngine.sol_MorphologyAnalysis(_hEngine, phrase, flags, 0, constraints, id_language);
            AnalysisResults res   = new AnalysisResults(this, hPack);

            return(res);
        }
        public IReadOnlyCollection <SentenceElement> Parse(string text)
        {
            var hPack = IntPtr.Zero;

            try
            {
                hPack = GrammarEngine.sol_SyntaxAnalysis(
                    _engineHandle,
                    text,
                    GrammarEngine.MorphologyFlags.SOL_GREN_MODEL,
                    GrammarEngine.SyntaxFlags.DEFAULT,
                    (20 << 22) | 30000,
                    GrammarEngineAPI.RUSSIAN_LANGUAGE);

                if (hPack == IntPtr.Zero)
                {
                    throw new InvalidOperationException($"Could parse text: {text}. {DescribeError()}");
                }

                var ngrafs = GrammarEngine.sol_CountGrafs(hPack);
                if (ngrafs <= 0)
                {
                    throw new InvalidOperationException($"No graphs were parsed from the text: {text}.");
                }

                return(_postProcessor(
                           Enumerable.Range(1, GrammarEngine.sol_CountRoots(hPack, 0) - 2)
                           .Select(i => CreateSentenceElement(GrammarEngine.sol_GetRoot(hPack, 0, i)))
                           .AsImmutable()));
            }
            finally
            {
                GrammarEngine.sol_DeleteResPack(hPack);
            }
        }
        public void MorphologyTest(string path)
        {
            var engine = new GrammarEngine(ConfigurationManager.AppSettings["GrammarPath"]);

            using (var reader = new StreamReader(path))
            {
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    string trimmed = line.Trim();
                    if (string.IsNullOrEmpty(trimmed))
                    {
                        continue;
                    }

                    long cnt       = 0;
                    var  sentences = engine.SplitSentences(trimmed);

                    foreach (var sentence in sentences)
                    {
                        using (var morph = engine.AnalyzeMorphology(sentence, Languages.RUSSIAN_LANGUAGE, MorphologyFlags.SOL_GREN_MODEL | MorphologyFlags.SOL_GREN_MODEL_ONLY))
                        {
                            for (int i = 0; i < morph.Nodes.Length; i++)
                            {
                                cnt++;
                            }
                        }
                    }
                }
            }
        }
Exemple #10
0
 protected virtual void Dispose(bool disposing)
 {
     if (hObject != IntPtr.Zero)
     {
         GrammarEngine.sol_DeleteSentenceBroker(hObject);
         hObject = IntPtr.Zero;
     }
 }
Exemple #11
0
 protected virtual void Dispose(bool disposing)
 {
     if (_hList != IntPtr.Zero)
     {
         GrammarEngine.sol_DeleteProjections(_hList);
         _hList = IntPtr.Zero;
     }
 }
Exemple #12
0
 protected virtual void Dispose(bool disposing)
 {
     if (_hEngine != IntPtr.Zero)
     {
         GrammarEngine.sol_DeleteGrammarEngine(_hEngine);
         _hEngine = IntPtr.Zero;
     }
 }
Exemple #13
0
        /// <summary>
        /// Восстановление предложения из грамматических характеристик каждого слова
        /// с использованием обобщённой функции sol_GenerateWordformsFX.
        /// </summary>
        public string RestoreSentenceOnePass(SentenceMap sentence)
        {
            if (sentence == null)
            {
                return("");
            }

            // Перечень характеристик, нужных для восстановления слова по словоформе
            var props = new GrenProperty[] { GrenProperty.NUMBER_ru, GrenProperty.CASE_ru,
                                             GrenProperty.GENDER_ru, GrenProperty.TENSE_ru, GrenProperty.PERSON_ru,
                                             GrenProperty.FORM_ru, GrenProperty.SHORTNESS_ru, GrenProperty.COMPAR_FORM_ru };
            var sb     = new StringBuilder();
            var coords = new ArrayList();
            var states = new ArrayList();

            for (int i = 0; i < sentence.Capasity; i++)
            {
                var wmap = sentence.GetWordByOrder(i);
                coords.Clear();
                states.Clear();

                foreach (var prop in props)
                {
                    var val = wmap.GetPropertyValue(prop);
                    if (val > -1)
                    {
                        coords.Add((int)prop);
                        states.Add((int)val);
                    }
                }

                // Проверка ID_Entry (В БД не хранится ID_Entry)
                int entry_id = GrammarEngine.sol_FindEntry(hEngine, wmap.EntryName, wmap.ID_PartOfSpeech, GrammarEngineAPI.RUSSIAN_LANGUAGE);
                //if( entry_id==-1 )
                string    word = "";
                ArrayList fx   = GrammarEngine.sol_GenerateWordformsFX(hEngine, entry_id, coords, states);
                //ArrayList fx = GrammarEngine.sol_GenerateWordformsFX(hEngine, wmap.ID_Entry, coords, states);
                if (fx != null && fx.Count > 0)
                {
                    word = (fx[0] as String).ToLower();
                }

                if (word != "")
                {
                    if (i == 0)
                    {
                        word = char.ToUpper(word[0]) + word.Substring(1);
                    }
                    if (i > 0 && i < sentence.Capasity && wmap.ID_PartOfSpeech != GrammarEngineAPI.PUNCTUATION_class)
                    {
                        sb.Append(" ");
                    }
                    sb.Append(word);
                }
            }

            return(sb.ToString());
        }
Exemple #14
0
 public string ReadSentence()
 {
     if (GrammarEngine.sol_FetchSentence(hObject) >= 0)
     {
         return(GrammarEngine.sol_GetFetchedSentenceFX(hObject));
     }
     else
     {
         return(null);
     }
 }
Exemple #15
0
        public string TokenizeIt(string phrase)
        {
            string result = "Ошибка загрузки словаря.";

            if (!IsReady)
            {
                return(result);
            }

            DateTime t0             = DateTime.Now;
            int      sentence_count = 0;
            int      word_count     = 0;
            string   text           = phrase;

            // эту строку будет делить на предложения с помощью сегментатора
            // http://www.solarix.ru/api/ru/sol_CreateSentenceBrokerMem.shtml
            IntPtr hSegmenter = GrammarEngine.sol_CreateSentenceBrokerMemW(hEngine, text, GrammarEngineAPI.RUSSIAN_LANGUAGE);

            StringBuilder sb = new StringBuilder();

            while (GrammarEngine.sol_FetchSentence(hSegmenter) >= 0)
            {
                // извлекаем очередное предложение...
                string sentence = GrammarEngine.sol_GetFetchedSentenceFX(hSegmenter);

                if (sentence.Length > 0)
                {
                    sentence_count++;

                    // разбиваем его на слова с помощью токенизатора
                    // http://www.solarix.ru/api/ru/sol_Tokenize.shtml
                    string[] tokens = GrammarEngine.sol_TokenizeFX(hEngine, sentence, SolarixGrammarEngineNET.GrammarEngineAPI.RUSSIAN_LANGUAGE);
                    word_count += tokens.Length;
                    foreach (string token in tokens)
                    {
                        // каждое слово печатаем на отдельной строке
                        sb.Append(token + "\r\n");
                    }
                    // это разделитель слов в разных предложениях
                    sb.Append(new String('-', 32) + "\r\n");
                }
            }

            // закончили извлекать предложения из текста - удаляем объект сегментатора
            // http://www.solarix.ru/api/ru/sol_DeleteSentenceBroker.shtml
            GrammarEngine.sol_DeleteSentenceBroker(hSegmenter);

            DateTime t1          = DateTime.Now;
            double   elapsed_sec = (t1 - t0).TotalSeconds;

            MessageBox.Show(String.Format(" {0} sentences, {1} words DONE.\n Elapsed time: {0} sec", sentence_count, word_count, elapsed_sec));

            return(sb.ToString());
        }
Exemple #16
0
        /// <summary>
        /// Рекурсивное сохранени структуры слова и синт.инфы в структуру предложения.
        /// </summary>
        /// <param name="hNode">Указатель на сохраняемый узел/param>
        /// <param name="sent">структура предложения</param>
        /// <param name="Level">Уровень вложенности</param>
        /// <param name="hParentNode">Указатель на родительский узел/param>
        /// <param name="LeafIndex">порядковый номер сохраняемого узла</param>
        /// <returns></returns>
        private void SaveNodeReq(IntPtr hNode, SentenceMap sent, int Level, IntPtr hParentNode, int LeafIndex)
        {
            WordMap wmap           = null;
            int     ParentPosition = -1;
            int     Position       = GrammarEngine.sol_GetNodePosition(hNode);

            if (Position > -1)
            {
                int id_entry        = GrammarEngine.sol_GetNodeIEntry(hEngine, hNode);
                int id_partofspeech = GrammarEngine.sol_GetEntryClass(hEngine, id_entry);
                wmap           = new WordMap(id_entry, id_partofspeech);
                wmap.RealWord  = GrammarEngine.sol_GetNodeContentsFX(hNode);
                wmap.EntryName = GrammarEngine.sol_GetEntryNameFX(hEngine, id_entry);
                if (wmap.EntryName == "???")
                {
                    wmap.rcind = 1;
                }
                if (wmap.EntryName == "number_")
                {
                    wmap.rcind = 2;
                }
                // Определение типа класса по ID части речи
                var xType = Gren.sgAPI.GetTypeClassByID((GrenPart)id_partofspeech);
                if (xType != null)
                {
                    // Создание класса части речи
                    var xPart = Activator.CreateInstance(xType) as HasDict;
                    wmap.xPart = xPart;
                    //Перебор пар характеристик, относящихся к данной части речи
                    foreach (var CoordID in xPart.dimensions)
                    {
                        int state = GrammarEngine.sol_GetNodeCoordState(hNode, CoordID);
                        wmap.AddPair(CoordID, state);
                    }

                    int linktype = -1;
                    if (hParentNode != IntPtr.Zero)
                    {
                        linktype       = GrammarEngine.sol_GetLeafLinkType(hParentNode, LeafIndex);
                        ParentPosition = GrammarEngine.sol_GetNodePosition(hParentNode);
                    }
                    sent.AddWord(Position, wmap);
                    sent.AddNode(Position, Level, linktype, ParentPosition);
                }
                Int32 n_leaf = GrammarEngine.sol_CountLeafs(hNode);
                for (int ileaf = 0; ileaf < n_leaf; ileaf++)
                {
                    IntPtr hLeaf = GrammarEngine.sol_GetLeaf(hNode, ileaf);
                    SaveNodeReq(hLeaf, sent, Level + 1, hNode, ileaf);
                }
            }
        }
Exemple #17
0
        public string GetDictVersion()
        {
            string result = "Ошибка загрузки словаря.";

            if (IsReady)
            {
                Int32 r = GrammarEngine.sol_DictionaryVersion(hEngine);
                if (r != -1)
                {
                    result = r.ToString();
                }
            }
            return(result);
        }
Exemple #18
0
        public SyntaxTreeNode(GrammarEngine2 _gren, IntPtr _hNode)
        {
            gren  = _gren;
            hNode = _hNode;

            int nleaf = GrammarEngine.sol_CountLeafs(hNode);

            leafs = new List <SyntaxTreeNode>();
            for (int i = 0; i < nleaf; ++i)
            {
                leafs.Add(new SyntaxTreeNode(gren, GrammarEngine.sol_GetLeaf(hNode, i)));
            }

            return;
        }
        public string GetNeutralForm(string word)
        {
            var hProjs = GrammarEngine.sol_ProjectWord(_engineHandle, word, 0);
            var result = Enumerable
                         .Range(0, GrammarEngine.sol_CountProjections(hProjs))
                         .Select(i => GrammarEngine.sol_GetEntryNameFX(_engineHandle, GrammarEngine.sol_GetIEntry(hProjs, i)))
                         .Distinct()
                         .AsImmutable();

            GrammarEngine.sol_DeleteProjections(hProjs);
            return(result.Count switch
            {
                0 => throw new InvalidOperationException(
                    $"Could not find neutral form of the word '{word}'"),
                1 => result.Single(),
                _ => throw new InvalidOperationException(
                    $"There are several neutral forms ({string.Join(", ", result)}) of the word '{word}'")
            });
Exemple #20
0
        public void Init()
        {
            var dict = Properties.MorphMQsrvr.Default.DictPath;

            // Загружаем грамматический словарь в ленивом режиме, то есть словарные статьи нам сейчас не нужны сразу все в оперативной памяти.
            // IntPtr hEngine = GrammarEngine.sol_CreateGrammarEngineExW(dict_path, GrammarEngine.SOL_GREN_LAZY_LEXICON);

            // http://www.solarix.ru/api/ru/sol_CreateGrammarEngine.shtml
            hEngine = GrammarEngine.sol_CreateGrammarEngineW(dict);
            if (hEngine == IntPtr.Zero)
            {
                MessageBox.Show("Could not load the dictionary");
            }
            else
            {
                IsReady = true;
            }
        }
Exemple #21
0
        /// <summary>
        /// Connect to the dictionary database using the information in XML configuration file
        /// </summary>
        /// <param name="DictionaryXmlPath">Configuration file path (read about it: http://www.solarix.ru/for_developers/docs/russian-grammatical-dictionary-configuration.shtml)</param>
        /// <param name="LazyLexicon">Word entries are loaded by demand if true</param>
        public void Load(string DictionaryXmlPath, bool LazyLexicon)
        {
            GrammarEngine.EngineInstanceFlags flags = GrammarEngine.EngineInstanceFlags.SOL_GREN_DEFAULT;
            if (LazyLexicon)
            {
                flags = GrammarEngine.EngineInstanceFlags.SOL_GREN_LAZY_LEXICON;
            }

            _hEngine = GrammarEngine.sol_CreateGrammarEngineW("");
            int rc = GrammarEngine.sol_LoadDictionaryExW(_hEngine, DictionaryXmlPath, flags);

            if (_hEngine == IntPtr.Zero)
            {
                string msg = GrammarEngine.sol_GetErrorFX(_hEngine);
                throw new ApplicationException(string.Format("Error has occured when connecting the dictionary database by {0}: {1}", DictionaryXmlPath, msg));
            }

            return;
        }
Exemple #22
0
        public List <CoordPair> GetPairs()
        {
            List <CoordPair> res = new List <CoordPair>();

            int n = GrammarEngine.sol_GetNodePairsCount(hNode);

            if (n > 0)
            {
                for (int i = 0; i < n; ++i)
                {
                    CoordPair p;
                    p.CoordID = GrammarEngine.sol_GetNodePairCoord(hNode, i);
                    p.StateID = GrammarEngine.sol_GetNodePairState(hNode, i);
                    res.Add(p);
                }
            }

            return(res);
        }
Exemple #23
0
        public List <int> GetPhrasalLinks(int id_phrase, int link_type)
        {
            List <int> res = new List <int>();

            IntPtr hList = GrammarEngine.sol_ListLinksTxt(_hEngine, id_phrase, link_type, 1);

            if (hList != IntPtr.Zero)
            {
                int n = GrammarEngine.sol_LinksInfoCount(_hEngine, hList);
                for (int i = 0; i < n; ++i)
                {
                    int id_phrase2 = GrammarEngine.sol_LinksInfoEKey2(_hEngine, hList, i);
                    res.Add(id_phrase2);
                }

                GrammarEngine.sol_DeleteLinksInfo(_hEngine, hList);
            }

            return(res);
        }
Exemple #24
0
        public bool CheckSyn(string wX, string wY)
        {
            IntPtr hCoordX = GrammarEngine.sol_ProjectWord(hEngine, wX, allowDynForms);
            int    pCountX = GrammarEngine.sol_CountProjections(hCoordX);
            IntPtr hCoordY = GrammarEngine.sol_ProjectWord(hEngine, wY, allowDynForms);
            int    pCountY = GrammarEngine.sol_CountProjections(hCoordY);

            for (int i = 0; i < pCountX; i++)
            {
                int eIndexX = GrammarEngine.sol_GetIEntry(hCoordX, i);
                int eClassX = GrammarEngine.sol_GetEntryClass(hEngine, eIndexX);
                for (int j = 0; j < pCountY; j++)
                {
                    int eIndexY = GrammarEngine.sol_GetIEntry(hCoordY, j);
                    int eClassY = GrammarEngine.sol_GetEntryClass(hEngine, eIndexY);
                    if (eClassX != eClassY)
                    {
                        break;
                    }
                    IntPtr hLink = GrammarEngine.sol_SeekThesaurus(hEngine, eIndexY,
                                                                   true, false, false, true, jumpCount);
                    if (hLink.ToInt32() != 0)
                    {
                        int linkCount = GrammarEngine.sol_CountInts(hLink);
                        if (linkCount > 0)
                        {
                            for (int k = 0; k < linkCount; k++)
                            {
                                if (GrammarEngine.sol_GetInt(hLink, k) == eIndexX)
                                {
                                    return(true);
                                }
                            }
                            GrammarEngine.sol_DeleteInts(hLink);
                        }
                    }
                }
            }
            return(false);
        }
Exemple #25
0
        /// <summary>
        /// Выполнение синтаксического анализа предложения.
        /// Получение структуры SentenceMap из предложении.
        /// </summary>
        public SentenceMap GetSynInfoMap(string phrase)
        {
            if (!IsReady)
            {
                return(null); //"Ошибка загрузки словаря."
            }
            // 60000 - это ограничение на время разбора в мсек.
            // 20 - это beam size в ходе перебора вариантов.
            IntPtr hPack = GrammarEngine.sol_SyntaxAnalysis(hEngine, phrase, 0, 0, (60000 | (20 << 22)), GrammarEngineAPI.RUSSIAN_LANGUAGE);

            // Выберем граф с минимальным количеством корневых узлов
            // http://www.solarix.ru/api/ru/sol_CountGrafs.shtml
            int ngrafs = GrammarEngine.sol_CountGrafs(hPack);

            int imin_graf = -1, minv = 2000000;

            for (int i = 0; i < ngrafs; i++)
            {
                // http://www.solarix.ru/api/ru/sol_CountRoots.shtml
                int nroots = GrammarEngine.sol_CountRoots(hPack, i);
                if (nroots < minv)
                {
                    minv      = nroots;
                    imin_graf = i;
                }
            }

            Int32 rCount = GrammarEngine.sol_CountRoots(hPack, imin_graf);
            var   sent   = new SentenceMap();
            int   Level  = 0;

            // Сохранение графа в памяти
            for (int j = 1; j < rCount - 1; j++)
            {
                // http://www.solarix.ru/api/ru/sol_GetRoot.shtml
                IntPtr hNode = GrammarEngine.sol_GetRoot(hPack, imin_graf, j);
                SaveNodeReq(hNode, sent, Level, IntPtr.Zero, j);
            }
            return(sent);
        }
Exemple #26
0
 // Number of versions of morphological analysis
 public int VersionCount()
 {
     return(GrammarEngine.sol_GetNodeVersionCount(gren.GetEngineHandle(), hNode));
 }
Exemple #27
0
 public int GetLinkType(int LeafIndex)
 {
     return(GrammarEngine.sol_GetLeafLinkType(hNode, LeafIndex));
 }
Exemple #28
0
 public int GetVersionEntryID(int version_index)
 {
     return(GrammarEngine.sol_GetNodeVerIEntry(gren.GetEngineHandle(), hNode, version_index));
 }
Exemple #29
0
 public int GetEntryID()
 {
     return(GrammarEngine.sol_GetNodeIEntry(gren.GetEngineHandle(), hNode));
 }
Exemple #30
0
 public int GetCoordState(int CoordID)
 {
     return(GrammarEngine.sol_GetNodeCoordState(hNode, CoordID));
 }