Example #1
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);
                }
            }
        }
Example #2
0
        public string MakeNRestoreSentence(string phrase)
        {
            string result = "Ошибка загрузки словаря.";

            if (!IsReady)
            {
                return(result);
            }
            var sb   = new StringBuilder();
            var sent = new SentenceMap();

            // http://www.solarix.ru/api/ru/sol_Tokenize.shtml
            string[] tokens = GrammarEngine.sol_TokenizeFX(hEngine, phrase, GrammarEngineAPI.RUSSIAN_LANGUAGE);
            // http://www.solarix.ru/api/ru/sol_CountStrings.shtml
            int ntok = tokens.Length;

            sb.Append("Токенов : " + ntok + "\r\n");
            sb.Append(new String('-', 32) + "\r\n");

            int     iorder = 0;
            WordMap wmap   = null;

            foreach (var token in tokens)
            {
                // http://www.solarix.ru/api/ru/sol_ProjectWord.shtml
                IntPtr hProjs = GrammarEngine.sol_ProjectWord(hEngine, token, 0);
                int    nprojs = GrammarEngine.sol_CountProjections(hProjs);
                for (int i = 0; i < nprojs; i++)
                {
                    int id_entry        = GrammarEngine.sol_GetIEntry(hProjs, i);
                    int id_partofspeech = GrammarEngine.sol_GetEntryClass(hEngine, id_entry);

                    wmap           = new WordMap(id_entry, id_partofspeech);
                    wmap.EntryName = GrammarEngine.sol_GetEntryNameFX(hEngine, id_entry);

                    // Определение типа класса по 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_GetProjCoordState(hEngine, hProjs, i, CoordID);
                            wmap.AddPair(CoordID, state);
                        }
                    }

                    /*
                     * //Перебор всех пар характеристик
                     * // http://www.solarix.ru/api/ru/sol_GetNodePairsCount.shtml
                     * int PairsCount = GrammarEngine.sol_GetNodePairsCount(hNode);
                     * for (int i = 0; i < PairsCount; i++)
                     * {
                     *      // http://www.solarix.ru/api/ru/sol_GetNodePairCoord.shtml
                     *      int Coord = GrammarEngine.sol_GetNodePairCoord(hNode, i);
                     *      // http://www.solarix.ru/api/ru/sol_GetNodePairState.shtml
                     *      int State = GrammarEngine.sol_GetNodePairState(hNode, i);
                     * }*/

                    sent.AddWord(iorder++, wmap);
                }
            }

            sb.Append(RestoreSentenceOnePass(sent));
            result = sb.ToString();
            return(result);
        }