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}"); } } } }
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); }
/// <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); }
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); }
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); }
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); }
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++; } } } } } }
protected virtual void Dispose(bool disposing) { if (hObject != IntPtr.Zero) { GrammarEngine.sol_DeleteSentenceBroker(hObject); hObject = IntPtr.Zero; } }
protected virtual void Dispose(bool disposing) { if (_hList != IntPtr.Zero) { GrammarEngine.sol_DeleteProjections(_hList); _hList = IntPtr.Zero; } }
protected virtual void Dispose(bool disposing) { if (_hEngine != IntPtr.Zero) { GrammarEngine.sol_DeleteGrammarEngine(_hEngine); _hEngine = IntPtr.Zero; } }
/// <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 string ReadSentence() { if (GrammarEngine.sol_FetchSentence(hObject) >= 0) { return(GrammarEngine.sol_GetFetchedSentenceFX(hObject)); } else { return(null); } }
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()); }
/// <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 GetDictVersion() { string result = "Ошибка загрузки словаря."; if (IsReady) { Int32 r = GrammarEngine.sol_DictionaryVersion(hEngine); if (r != -1) { result = r.ToString(); } } return(result); }
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}'") });
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; } }
/// <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; }
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); }
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); }
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); }
/// <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); }
// Number of versions of morphological analysis public int VersionCount() { return(GrammarEngine.sol_GetNodeVersionCount(gren.GetEngineHandle(), hNode)); }
public int GetLinkType(int LeafIndex) { return(GrammarEngine.sol_GetLeafLinkType(hNode, LeafIndex)); }
public int GetVersionEntryID(int version_index) { return(GrammarEngine.sol_GetNodeVerIEntry(gren.GetEngineHandle(), hNode, version_index)); }
public int GetEntryID() { return(GrammarEngine.sol_GetNodeIEntry(gren.GetEngineHandle(), hNode)); }
public int GetCoordState(int CoordID) { return(GrammarEngine.sol_GetNodeCoordState(hNode, CoordID)); }