/// <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); } } }
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); }