public int MatchTags(SolarixGrammarEngineNET.SyntaxTreeNode token, SolarixGrammarEngineNET.GrammarEngine2 gren) { foreach (TagMatcher m in matchers) { if (m.Match(token, gren)) { return(m.GetId()); } } int entry_id = token.GetEntryID(); int pos_id = gren.GetEntryClass(entry_id); string part_of_speech = gren.GetClassName(pos_id); string tags = string.Join(" ", token.GetPairs().Select(z => string.Format("{0}={1}", gren.GetCoordName(z.CoordID), gren.GetCoordStateName(z.CoordID, z.StateID))).ToArray()); string msg = string.Format("Can not find tag for {0} {{ {1} {2} }}", token.GetWord(), part_of_speech, tags); throw new ApplicationException(msg); }
public FootPrintToken(SolarixGrammarEngineNET.GrammarEngine2 gren, SolarixGrammarEngineNET.SyntaxTreeNode root) { Contract.Ensures(!string.IsNullOrEmpty(this.word)); Contract.Ensures(this.node != null); Contract.Ensures(this.tags != null); this.word = root.GetWord(); this.tags = new List <string>(); this.node = root; this.tags.Add(root.GetWord().ToLower()); if (root.GetWord().Equals("не", StringComparison.OrdinalIgnoreCase)) { this.tags.Add("neg"); } int part_of_speech = gren.GetEntryClass(root.GetEntryID()); switch (part_of_speech) { case SolarixGrammarEngineNET.GrammarEngineAPI.CONJ_ru: this.tags.Add("conj"); break; // союз case SolarixGrammarEngineNET.GrammarEngineAPI.PRONOUN_ru: this.tags.Add("pr"); break; // местоимение Я case SolarixGrammarEngineNET.GrammarEngineAPI.NOUN_ru: this.tags.Add("n"); break; case SolarixGrammarEngineNET.GrammarEngineAPI.ADJ_ru: this.tags.Add("adj"); break; case SolarixGrammarEngineNET.GrammarEngineAPI.VERB_ru: this.tags.Add("v"); break; case SolarixGrammarEngineNET.GrammarEngineAPI.INFINITIVE_ru: this.tags.Add("v"); break; case SolarixGrammarEngineNET.GrammarEngineAPI.GERUND_2_ru: this.tags.AddRange("adv adv_v".Split(' ')); break; case SolarixGrammarEngineNET.GrammarEngineAPI.ADVERB_ru: { this.tags.Add("adv"); if (StringExtender.InCI(word, "очень крайне наиболее наименее чрезвычайно почти".Split())) // модификаторы наречий и прилагательных { this.tags.Add("a_modif"); } string adv_cat = AdverbCategory.GetQuestionWordForAdverb(word); if (!string.IsNullOrEmpty(adv_cat)) { this.tags.Add("adv_" + adv_cat); } break; } case SolarixGrammarEngineNET.GrammarEngineAPI.PREPOS_ru: this.tags.Add("p"); break; case SolarixGrammarEngineNET.GrammarEngineAPI.PRONOUN2_ru: this.tags.Add("pr"); break; default: this.tags.Add("x"); break; } foreach (var p in root.GetPairs()) { if (p.CoordID == SolarixGrammarEngineNET.GrammarEngineAPI.CASE_ru) { switch (p.StateID) { case SolarixGrammarEngineNET.GrammarEngineAPI.NOMINATIVE_CASE_ru: this.tags.Add("nom"); break; case SolarixGrammarEngineNET.GrammarEngineAPI.GENITIVE_CASE_ru: this.tags.Add("gen"); break; case SolarixGrammarEngineNET.GrammarEngineAPI.ACCUSATIVE_CASE_ru: this.tags.Add("acc"); break; case SolarixGrammarEngineNET.GrammarEngineAPI.DATIVE_CASE_ru: this.tags.Add("dat"); break; case SolarixGrammarEngineNET.GrammarEngineAPI.PREPOSITIVE_CASE_ru: this.tags.Add("prep"); break; case SolarixGrammarEngineNET.GrammarEngineAPI.PARTITIVE_CASE_ru: this.tags.Add("part"); break; case SolarixGrammarEngineNET.GrammarEngineAPI.LOCATIVE_CASE_ru: this.tags.Add("loc"); break; case SolarixGrammarEngineNET.GrammarEngineAPI.INSTRUMENTAL_CASE_ru: this.tags.Add("instr"); break; } } if (p.CoordID == SolarixGrammarEngineNET.GrammarEngineAPI.NUMBER_ru) { switch (p.StateID) { case SolarixGrammarEngineNET.GrammarEngineAPI.SINGULAR_NUMBER_ru: this.tags.Add("sing"); break; case SolarixGrammarEngineNET.GrammarEngineAPI.PLURAL_NUMBER_ru: this.tags.Add("pl"); break; } } if (p.CoordID == SolarixGrammarEngineNET.GrammarEngineAPI.TENSE_ru) { switch (p.StateID) { case SolarixGrammarEngineNET.GrammarEngineAPI.PAST_ru: this.tags.Add("past"); break; case SolarixGrammarEngineNET.GrammarEngineAPI.PRESENT_ru: this.tags.Add("pres"); break; case SolarixGrammarEngineNET.GrammarEngineAPI.FUTURE_ru: this.tags.Add("future"); break; } } if (p.CoordID == SolarixGrammarEngineNET.GrammarEngineAPI.FORM_ru) { switch (p.StateID) { case SolarixGrammarEngineNET.GrammarEngineAPI.ANIMATIVE_FORM_ru: this.tags.Add("anim"); break; case SolarixGrammarEngineNET.GrammarEngineAPI.INANIMATIVE_FORM_ru: this.tags.Add("inanim"); break; } } if (p.CoordID == SolarixGrammarEngineNET.GrammarEngineAPI.GENDER_ru) { switch (p.StateID) { case SolarixGrammarEngineNET.GrammarEngineAPI.MASCULINE_GENDER_ru: this.tags.Add("masc"); break; case SolarixGrammarEngineNET.GrammarEngineAPI.FEMININE_GENDER_ru: this.tags.Add("fem"); break; case SolarixGrammarEngineNET.GrammarEngineAPI.NEUTRAL_GENDER_ru: this.tags.Add("neut"); break; } } if (p.CoordID == SolarixGrammarEngineNET.GrammarEngineAPI.PERSON_ru) { switch (p.StateID) { case SolarixGrammarEngineNET.GrammarEngineAPI.PERSON_1_ru: this.tags.Add("1"); break; case SolarixGrammarEngineNET.GrammarEngineAPI.PERSON_2_ru: this.tags.Add("2"); break; case SolarixGrammarEngineNET.GrammarEngineAPI.PERSON_3_ru: this.tags.Add("3"); break; } } if (p.CoordID == SolarixGrammarEngineNET.GrammarEngineAPI.VERB_FORM_ru) { switch (p.StateID) { case SolarixGrammarEngineNET.GrammarEngineAPI.VB_INF_ru: this.tags.Add("vf1"); break; case SolarixGrammarEngineNET.GrammarEngineAPI.VB_ORDER_ru: this.tags.Add("imper"); break; } } } }
public TokenTagsEnumerator(bool IsBoundaryToken, SolarixGrammarEngineNET.SyntaxTreeNode _token, SolarixGrammarEngineNET.GrammarEngine2 gren) { token = _token; list = new List <TokenRecognizer>(); int id_entry = token.GetEntryID(); int id_class = gren.GetEntryClass(id_entry); // Подготовим список измерений и атрибутов. List <SolarixGrammarEngineNET.CoordPair> dims = new List <SolarixGrammarEngineNET.CoordPair>(); List <SolarixGrammarEngineNET.CoordPair> attrs = new List <SolarixGrammarEngineNET.CoordPair>(); List <SolarixGrammarEngineNET.CoordPair> pairs = token.GetPairs(); foreach (SolarixGrammarEngineNET.CoordPair p in pairs) { int t = gren.GetCoordType(id_class, p.CoordID); if (t == 0 || t == 2) { attrs.Add(p); } else if (t == 1) { dims.Add(p); } } // ------------------------------------------------------ // Часть речи - самый общий случай // ------------------------------------------------------ TokenRecognizer tr4 = new TokenRecognizer(id_class, -1); list.Add(tr4); List <TokenRecognizer> more_abstract = new List <TokenRecognizer>(); more_abstract.Add(tr4); // ------------------------------------------------------ // Часть речи и комбинации атрибутов // ------------------------------------------------------ if (attrs.Count > 0) { List <TokenRecognizer> created_recognizers = new List <TokenRecognizer>(); bool[] dim_bit = new bool[attrs.Count]; for (int i = 0; i < attrs.Count; ++i) { dim_bit[i] = false; } while (true) { List <SolarixGrammarEngineNET.CoordPair> selected_pairs = new List <SolarixGrammarEngineNET.CoordPair>(); for (int i = 0; i < attrs.Count; ++i) { if (dim_bit[i]) { selected_pairs.Add(attrs[i]); } } if (selected_pairs.Count > 0) { TokenRecognizer tr3 = new TokenRecognizer(id_class, -1, selected_pairs); tr3.SetMoreAbstract(more_abstract); list.Add(tr3); created_recognizers.Add(tr3); } // Следующая комбинация int carry = 1; for (int ibit = dim_bit.Length - 1; ibit >= 0; --ibit) { if (dim_bit[ibit] == false) { dim_bit[ibit] = true; carry = 0; break; } else { dim_bit[ibit] = false; } } if (carry == 1) { break; } } more_abstract = created_recognizers; } // Лемма - только id словарной статьи. Это боее частный случай, чем указание части речи. TokenRecognizer tr2 = new TokenRecognizer(-1, id_entry); tr2.SetMoreAbstract(more_abstract); list.Add(tr2); more_abstract = new List <TokenRecognizer>(); more_abstract.Add(tr2); if (dims.Count > 0) { List <TokenRecognizer> created_recognizers = new List <TokenRecognizer>(); // ----------------------------------------------------------------------- // Лемма (то есть id словарной статьи) и различные комбинации измерений. // ----------------------------------------------------------------------- bool[] dim_bit = new bool[dims.Count]; for (int i = 0; i < dims.Count; ++i) { dim_bit[i] = false; } while (true) { List <SolarixGrammarEngineNET.CoordPair> selected_pairs = new List <SolarixGrammarEngineNET.CoordPair>(); for (int i = 0; i < dims.Count; ++i) { if (dim_bit[i]) { selected_pairs.Add(dims[i]); } } if (selected_pairs.Count > 0) { TokenRecognizer tr5 = new TokenRecognizer(-1, id_entry, selected_pairs); tr5.SetMoreAbstract(more_abstract); created_recognizers.Add(tr5); list.Add(tr5); } // Следующая комбинация int carry = 1; for (int ibit = dim_bit.Length - 1; ibit >= 0; --ibit) { if (dim_bit[ibit] == false) { dim_bit[ibit] = true; carry = 0; break; } else { dim_bit[ibit] = false; } } if (carry == 1) { break; } } more_abstract = created_recognizers; } // ---------------------------------- // Лексема - самый частный случай. // ---------------------------------- /* * if( !IsBoundaryToken ) * { * TokenRecognizer tr0 = new TokenRecognizer( token.GetWord() ); * tr0.SetMoreAbstract( more_abstract ); * list.Add( tr0 ); * } */ return; }
static string ChangeVerbTo(SolarixGrammarEngineNET.GrammarEngine2 gren, SolarixGrammarEngineNET.SyntaxTreeNode node, string to_person) { List <int> coords = new List <int>(); List <int> states = new List <int>(); coords.Add(SolarixGrammarEngineNET.GrammarEngineAPI.TENSE_ru); states.Add(node.GetCoordState(SolarixGrammarEngineNET.GrammarEngineAPI.TENSE_ru)); if (node.GetCoordState(SolarixGrammarEngineNET.GrammarEngineAPI.TENSE_ru) != SolarixGrammarEngineNET.GrammarEngineAPI.PAST_ru) { if (to_person == "1s") { coords.Add(SolarixGrammarEngineNET.GrammarEngineAPI.NUMBER_ru); states.Add(SolarixGrammarEngineNET.GrammarEngineAPI.SINGULAR_NUMBER_ru); coords.Add(SolarixGrammarEngineNET.GrammarEngineAPI.PERSON_ru); states.Add(SolarixGrammarEngineNET.GrammarEngineAPI.PERSON_1_ru); } else if (to_person == "2s") { coords.Add(SolarixGrammarEngineNET.GrammarEngineAPI.NUMBER_ru); states.Add(SolarixGrammarEngineNET.GrammarEngineAPI.SINGULAR_NUMBER_ru); coords.Add(SolarixGrammarEngineNET.GrammarEngineAPI.PERSON_ru); states.Add(SolarixGrammarEngineNET.GrammarEngineAPI.PERSON_2_ru); } else if (to_person == "3s") { coords.Add(SolarixGrammarEngineNET.GrammarEngineAPI.NUMBER_ru); states.Add(SolarixGrammarEngineNET.GrammarEngineAPI.SINGULAR_NUMBER_ru); coords.Add(SolarixGrammarEngineNET.GrammarEngineAPI.PERSON_ru); states.Add(SolarixGrammarEngineNET.GrammarEngineAPI.PERSON_2_ru); } else { throw new ArgumentException("to_person"); } } foreach (var p in node.GetPairs()) { if (p.CoordID == SolarixGrammarEngineNET.GrammarEngineAPI.TENSE_ru || p.CoordID == SolarixGrammarEngineNET.GrammarEngineAPI.VERB_FORM_ru) { coords.Add(p.CoordID); states.Add(p.StateID); } } string v2 = ""; List <string> fx = SolarixGrammarEngineNET.GrammarEngine.sol_GenerateWordformsFX(gren.GetEngineHandle(), node.GetEntryID(), coords, states); if (fx != null && fx.Count > 0) { v2 = fx[0].ToLower(); } else { v2 = null; } return(v2); }