public ICommand GetCommand(byte[] request) { intCommand = null; var buf = new ByteBuffer(request); var message = Message.GetRootAsMessage(buf); command = message.Comtype; switch (command) { case ComType.GetChildrenConts: { intCommand = new CommandGetchildrenContainers(message.DbID); break; } case ComType.SavePara: { var senttlist = SentenceMap.BuildFromMessage(message); var docID = -1; // TODO docID надо передавать в первом элементе таблицы documents сообщения intCommand = new CommandSaveParagraph(message.DbID, docID, senttlist); break; } case ComType.ReadPara: { var ParagraphID = message.DbID; intCommand = new CommandReadParagraph(message.DbID); break; } case ComType.GetWord: { Param?par = message.Params(0); var strParam = ""; if (par.HasValue) { strParam = par.Value.Value; } intCommand = new CommandGetWord(strParam); break; } case ComType.SaveLex: { Param?par = message.Params(0); var strParam = ""; if (par.HasValue) { strParam = par.Value.Value; } intCommand = new CommandSaveLex(strParam); break; } default: break; } return(intCommand); }
public byte[] GetResultBytes() { var builder = new FlatBufferBuilder(1); var paramName = builder.CreateString("ParagraphID"); // TODO здесь надо передавать результат выполнения операции var paramVal = builder.CreateString(ParagraphID.ToString()); var parms = new Offset <Param> [1]; parms[0] = Param.CreateParam(builder, paramName, paramVal); var paracol = Message.CreateParamsVector(builder, parms); VectorOffset sentscol = default(VectorOffset); sentscol = SentenceMap.BuildSentOffsetFromSentStructList(builder, this.sentlist); Message.StartMessage(builder); Message.AddMessType(builder, MessType.mReplay); Message.AddServerType(builder, ServType.svSUBD); Message.AddComtype(builder, command); Message.AddParams(builder, paracol); Message.AddSentences(builder, sentscol); Message.AddDbID(builder, ParagraphID); var req = Message.EndMessage(builder); builder.Finish(req.Value); return(builder.SizedByteArray()); }
private void btMakeSynAn_Click(object sender, EventArgs e) { var sentlistRep = store.MorphMakeSyntan(memoInp.Text); if (sentlistRep == null || sentlistRep.Count == 0) { return; } sent = sentlistRep[0]; this.para.AddSentStruct(5, sent); var sb = new StringBuilder(); for (int i = 0; i < sent.Capasity; i++) { var word = sent.GetWordByOrder(i); sb.Append(word.EntryName + " " + word.RealWord + "\r\n"); } // Отображение синт связей var ordlist = sent.GetTreeList(); foreach (var x in ordlist) { sb.Append(new String('\t', x.Level) + String.Format("{0} Level {1} link {2} \r\n", sent.GetWordByOrder(x.index).EntryName, x.Level, x.linktype)); } memoOut.Text = sb.ToString(); }
public string GetSynInfo(string phrase) { string result = "Ошибка загрузки словаря."; if (!IsReady) { return(result); } SentenceMap sent = GetSynInfoMap(phrase); StringBuilder sb = new StringBuilder(); sb.Append(RestoreSentenceOnePass(sent)); sb.Append("\r\n"); sb.Append(PrintGraf(sent)); /*/ Распечатаем этот граф * StringBuilder sb = new StringBuilder(); * result = ""; * 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); * PrintNode(hNode, sb, IntPtr.Zero, j); * sb.Append(" "); * } */ result = sb.ToString(); return(result); }
public static SentenceAsm Convert(SentenceMap smap) { var asm = new SentenceAsm(); for (int i = 0; i < smap.Capasity; i++) { var wmap = smap.GetWordByOrder(i); var wasm = new WordAsm(wmap.ID_Entry, wmap.ID_PartOfSpeech); wasm.xPart = wmap.xPart; wasm.EntryName = wmap.EntryName; wasm.Order = wmap.order; wasm.RealWord = wmap.RealWord; wasm.rcind = wmap.rcind; // Чтение граммем var Grammems = wmap.GetPairs(); foreach (var g in Grammems) { var asmgramm = new GrammemAsm(g.Key, g.Value); wasm.AddGrammem(asmgramm); } asm.AddWord(i, wasm); } var mapNodes = smap.GetTreeList(); foreach (var node in mapNodes) { var asmgsynt = new SyntNodeAsm(-1, node.linktype, node.Level, -1, node.index, node.parentind); asm.AddNode(asmgsynt); } return(asm); }
/// <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()); }
public void SendStruct(SentenceMap sentstr) { this.sentstr = sentstr; var builder = SetReq(); var buf = builder.SizedByteArray(); replay = SendMess(new ZFrame(buf)); this.sentstr = null; }
public ICommand GetCommand(byte[] request) { intCommand = null; var buf = new ByteBuffer(request); var message = Message.GetRootAsMessage(buf); command = message.Comtype; switch (command) { case ComType.Synt: { Param?par = message.Params(0); var strParam = ""; if (par.HasValue) { strParam = par.Value.Value; } intCommand = new CommandSyntAn(strParam); break; } case ComType.Separ: { Param?par = message.Params(0); var strParam = ""; if (par.HasValue) { strParam = par.Value.Value; } intCommand = new CommandSepar(strParam); break; } case ComType.Repar: { SentenceMap sentence = null; var sentlist = SentenceMap.BuildFromMessage(message); if (sentlist.Count > 0) { sentence = sentlist[0]; } intCommand = new CommandRepar(sentence); break; } case ComType.Morph: break; default: break; } return(intCommand); }
/// <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); } } }
/// <summary> /// Получение списка структур предложений из сообщения. /// </summary> public List <SentenceMap> GetSentenceStructList() { List <SentenceMap> sentlist = new List <SentenceMap>(); if (replay != null) { replay.Position = 0; var bufrep = replay.Read(); var buf = new ByteBuffer(bufrep); var message = Message.GetRootAsMessage(buf); sentlist = SentenceMap.BuildFromMessage(message); } return(sentlist); }
/// <summary> /// Восстановление предложения по формам слов, хранящимся в структурах WordMap /// </summary> private string RestorePhrase(SentenceMap sentstruct) { var sb = new StringBuilder(); for (int i = 0; i < sentstruct.Capasity; i++) { var wmap = sentstruct.GetWordByOrder(i); if (i > 0 && i < sentstruct.Capasity && wmap.ID_PartOfSpeech != PUNCTUATION_class) { sb.Append(" "); } sb.Append(wmap.RealWord); } return(sb.ToString()); }
private string PrintGraf(SentenceMap sent) { StringBuilder sb = new StringBuilder(); var ordlist = sent.GetTreeList(); foreach (tNode x in ordlist) { sb.Append(new String('\t', x.Level) + String.Format("{0} Level {1} link {2} \r\n", sent.GetWordByOrder(x.index).EntryName, x.Level, Gren.sgAPI.GetLinkTypeStr(x.linktype))); } return(sb.ToString()); }
public byte[] GetResultBytes() { var builder = new FlatBufferBuilder(1); // Синтаксический анализ - выполняется для одного предложения var senttlist = new List <SentenceMap>(); senttlist.Add(this.sentence); VectorOffset sentscol = SentenceMap.BuildSentOffsetFromSentStructList(builder, senttlist); Message.StartMessage(builder); Message.AddMessType(builder, MessType.mReplay); Message.AddServerType(builder, ServType.svMorph); Message.AddComtype(builder, command); Message.AddSentences(builder, sentscol); var req = Message.EndMessage(builder); builder.Finish(req.Value); return(builder.SizedByteArray()); }
/// <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); }
private void btMakeDoc_Click(object sender, EventArgs e) { var sb = new StringBuilder(); // Tockenize var sents = store.MorphGetSeparatedSentsList(memoInp.Text); int i = 0; foreach (var sentstr in sents) { sb.Append(sentstr + "\r\n"); // SynAn var sentlistRep = store.MorphMakeSyntan(sentstr); if (sentlistRep == null || sentlistRep.Count == 0) { sb.Append("SynAn error" + "\r\n"); continue; } this.sent = sentlistRep[0]; this.para.AddSentStruct(i, this.sent); // Отображение синт связей var ordlist = sent.GetTreeList(); foreach (var x in ordlist) { sb.Append(new String('\t', x.Level) + String.Format("{0} Level {1} link {2} \r\n", sent.GetWordByOrder(x.index).EntryName, x.Level, x.linktype)); } i++; } var ContID = 2; var DocumentID = store.SaveDocumentBD("tDoc", ContID); this.para.DocumentID = Convert.ToInt64(DocumentID[0].Value); var paramlist = store.SaveParagraphBD(this.para); memoOut.Text = sb.ToString(); }
private FlatBufferBuilder SetReq(string requestText = "") { var builder = new FlatBufferBuilder(1); VectorOffset paracol = default(VectorOffset); VectorOffset sentscol = default(VectorOffset); switch (command) { case ComType.Separ: case ComType.Synt: { // Синтаксический анализ - выполняется для одного предложения var paramName = builder.CreateString("phrase"); var paramVal = builder.CreateString(requestText); var parms = new Offset <Param> [1]; parms[0] = Param.CreateParam(builder, paramName, paramVal); paracol = Message.CreateParamsVector(builder, parms); break; } case ComType.Repar: { // Восстановление из структуры выполняется для одного предложения var senttlist = new List <SentenceMap>(); senttlist.Add(this.sentstr); sentscol = SentenceMap.BuildSentOffsetFromSentStructList(builder, senttlist); break; } case ComType.GetWord: case ComType.SaveLex: { var paramName = builder.CreateString("word"); var paramVal = builder.CreateString(requestText); var parms = new Offset <Param> [1]; parms[0] = Param.CreateParam(builder, paramName, paramVal); paracol = Message.CreateParamsVector(builder, parms); break; } case ComType.SavePara: { var innersents = parastr.GetParagraphSents(); var senttlist = innersents .OrderBy(y => y.order) .Select(x => x.sentstruct).ToList(); sentscol = SentenceMap.BuildSentOffsetFromSentStructList(builder, senttlist); dbID = parastr.ParagraphID; break; } case ComType.ReadPara: { dbID = parastr.ParagraphID; break; } case ComType.GetParags: { break; } case ComType.GetChildrenConts: { // dbID установлено break; } } Message.StartMessage(builder); Message.AddMessType(builder, MessType.mRequest); Message.AddServerType(builder, this.servType); Message.AddComtype(builder, this.command); Message.AddParams(builder, paracol); Message.AddSentences(builder, sentscol); Message.AddDbID(builder, dbID); var req = Message.EndMessage(builder); builder.Finish(req.Value); return(builder); }
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); }
public void Execute(GrenHelper gren) { sentence = gren.GetSynInfoMap(param); }
public CommandRepar(SentenceMap sentence) { this.sentence = sentence; }