static Pullenti.Semantic.Utils.ControlModelItem FindControlItem(Pullenti.Ner.MetaToken mt, Pullenti.Semantic.Utils.DerivateGroup gr) { if (gr == null) { return(null); } if (mt is Pullenti.Ner.Core.NounPhraseToken) { Pullenti.Ner.Token t = (mt as Pullenti.Ner.Core.NounPhraseToken).Noun.EndToken; foreach (Pullenti.Semantic.Utils.ControlModelItem m in gr.Model.Items) { if (m.Word != null) { if (t.IsValue(m.Word, null)) { return(m); } } } foreach (Pullenti.Semantic.Utils.DerivateWord w in gr.Words) { if (w.Attrs.IsVerbNoun) { if (t.IsValue(w.Spelling, null)) { return(gr.Model.FindItemByTyp(Pullenti.Semantic.Utils.ControlModelItemType.Noun)); } } } return(null); } if (mt is Pullenti.Ner.Core.VerbPhraseItemToken) { Pullenti.Ner.Core.VerbPhraseItemToken ti = mt as Pullenti.Ner.Core.VerbPhraseItemToken; bool rev = ti.IsVerbReversive || ti.IsVerbPassive; foreach (Pullenti.Semantic.Utils.ControlModelItem it in gr.Model.Items) { if (rev && it.Typ == Pullenti.Semantic.Utils.ControlModelItemType.Reflexive) { return(it); } else if (!rev && it.Typ == Pullenti.Semantic.Utils.ControlModelItemType.Verb) { return(it); } } } return(null); }
public static Pullenti.Semantic.SemObject CreateVerbGroup(Pullenti.Semantic.SemGraph gr, Pullenti.Ner.Core.VerbPhraseToken vpt) { List <Pullenti.Semantic.SemObject> sems = new List <Pullenti.Semantic.SemObject>(); List <Pullenti.Semantic.SemAttribute> attrs = new List <Pullenti.Semantic.SemAttribute>(); List <Pullenti.Semantic.SemObject> adverbs = new List <Pullenti.Semantic.SemObject>(); for (int i = 0; i < vpt.Items.Count; i++) { Pullenti.Ner.Core.VerbPhraseItemToken v = vpt.Items[i]; if (v.IsAdverb) { AdverbToken adv = AdverbToken.TryParse(v.BeginToken); if (adv == null) { continue; } if (adv.Typ != Pullenti.Semantic.SemAttributeType.Undefined) { attrs.Add(new Pullenti.Semantic.SemAttribute() { Not = adv.Not, Typ = adv.Typ, Spelling = adv.Spelling }); continue; } Pullenti.Semantic.SemObject adverb = CreateAdverb(gr, adv); if (attrs.Count > 0) { adverb.Attrs.AddRange(attrs); attrs.Clear(); } adverbs.Add(adverb); continue; } if (v.Normal == "БЫТЬ") { int j; for (j = i + 1; j < vpt.Items.Count; j++) { if (!vpt.Items[j].IsAdverb) { break; } } if (j < vpt.Items.Count) { continue; } } Pullenti.Semantic.SemObject sem = new Pullenti.Semantic.SemObject(gr); gr.Objects.Add(sem); sem.Tokens.Add(v); v.Tag = sem; _setMorph(sem, v.VerbMorph); sem.Morph.NormalCase = (sem.Morph.NormalFull = v.Normal); if (v.IsParticiple || v.IsDeeParticiple) { sem.Typ = Pullenti.Semantic.SemObjectType.Participle; sem.Morph.NormalFull = v.EndToken.GetNormalCaseText(Pullenti.Morph.MorphClass.Verb, Pullenti.Morph.MorphNumber.Undefined, Pullenti.Morph.MorphGender.Undefined, false) ?? sem.Morph.NormalCase; sem.Morph.NormalCase = v.EndToken.GetNormalCaseText(Pullenti.Morph.MorphClass.Adjective, Pullenti.Morph.MorphNumber.Undefined, Pullenti.Morph.MorphGender.Undefined, false); if (sem.Morph.NormalCase == sem.Morph.NormalFull && v.Normal.EndsWith("Й")) { List <Pullenti.Semantic.Utils.DerivateGroup> grs2 = Pullenti.Semantic.Utils.DerivateService.FindDerivates(v.Normal, true, null); if (grs2 != null) { foreach (Pullenti.Semantic.Utils.DerivateGroup g in grs2) { foreach (Pullenti.Semantic.Utils.DerivateWord w in g.Words) { if (w.Lang == v.EndToken.Morph.Language && w.Class.IsVerb && !w.Class.IsAdjective) { sem.Morph.NormalFull = w.Spelling; break; } } } } } else if (sem.Morph.NormalCase == sem.Morph.NormalFull && v.IsParticiple && sem.Morph.NormalFull.EndsWith("Ь")) { foreach (Pullenti.Morph.MorphBaseInfo it in v.EndToken.Morph.Items) { Pullenti.Morph.MorphWordForm wf = it as Pullenti.Morph.MorphWordForm; if (wf == null) { continue; } if (wf.NormalCase.EndsWith("Й") || ((wf.NormalFull != null && wf.NormalFull.EndsWith("Й")))) { sem.Morph.NormalCase = wf.NormalFull ?? wf.NormalCase; break; } } if (sem.Morph.NormalCase == sem.Morph.NormalFull) { List <Pullenti.Semantic.Utils.DerivateGroup> grs2 = Pullenti.Semantic.Utils.DerivateService.FindDerivates(sem.Morph.NormalCase, true, null); if (grs2 != null) { foreach (Pullenti.Semantic.Utils.DerivateGroup g in grs2) { foreach (Pullenti.Semantic.Utils.DerivateWord w in g.Words) { if (w.Lang == v.EndToken.Morph.Language && w.Class.IsVerb && w.Class.IsAdjective) { sem.Morph.NormalCase = w.Spelling; break; } } break; } } } } } else { sem.Typ = Pullenti.Semantic.SemObjectType.Verb; } if (v.VerbMorph != null && v.VerbMorph.ContainsAttr("возвр.", null)) { if (sem.Morph.NormalFull.EndsWith("СЯ") || sem.Morph.NormalFull.EndsWith("СЬ")) { sem.Morph.NormalFull = sem.Morph.NormalFull.Substring(0, sem.Morph.NormalFull.Length - 2); } } List <Pullenti.Semantic.Utils.DerivateGroup> grs = Pullenti.Semantic.Utils.DerivateService.FindDerivates(sem.Morph.NormalFull, true, null); if (grs != null && grs.Count > 0) { sem.Concept = grs[0]; if (v.VerbMorph != null && v.VerbMorph.Misc.Aspect == Pullenti.Morph.MorphAspect.Imperfective) { foreach (Pullenti.Semantic.Utils.DerivateWord w in grs[0].Words) { if (w.Class.IsVerb && !w.Class.IsAdjective) { if (w.Aspect == Pullenti.Morph.MorphAspect.Perfective) { sem.Morph.NormalFull = w.Spelling; break; } } } } } sem.Not = v.Not; sems.Add(sem); if (attrs.Count > 0) { sem.Attrs.AddRange(attrs); attrs.Clear(); } if (adverbs.Count > 0) { foreach (Pullenti.Semantic.SemObject a in adverbs) { gr.AddLink(Pullenti.Semantic.SemLinkType.Detail, sem, a, "как", false, null); } } adverbs.Clear(); } if (sems.Count == 0) { return(null); } if (attrs.Count > 0) { sems[sems.Count - 1].Attrs.AddRange(attrs); } if (adverbs.Count > 0) { Pullenti.Semantic.SemObject sem = sems[sems.Count - 1]; foreach (Pullenti.Semantic.SemObject a in adverbs) { gr.AddLink(Pullenti.Semantic.SemLinkType.Detail, sem, a, "как", false, null); } } for (int i = sems.Count - 1; i > 0; i--) { gr.AddLink(Pullenti.Semantic.SemLinkType.Detail, sems[i - 1], sems[i], "что делать", false, null); } return(sems[0]); }
public static List <Pullenti.Semantic.Utils.DerivateGroup> FindDerivates(Pullenti.Ner.Token t) { List <Pullenti.Semantic.Utils.DerivateGroup> res = null; Pullenti.Morph.MorphClass cla = null; if (t is Pullenti.Ner.Core.NounPhraseToken) { t = (t as Pullenti.Ner.Core.NounPhraseToken).Noun.EndToken; cla = Pullenti.Morph.MorphClass.Noun; } if (t is Pullenti.Ner.TextToken) { foreach (Pullenti.Morph.MorphBaseInfo f in t.Morph.Items) { if (f is Pullenti.Morph.MorphWordForm) { if (cla != null) { if (((cla & f.Class)).IsUndefined) { continue; } } res = Pullenti.Semantic.Utils.DerivateService.FindDerivates((f as Pullenti.Morph.MorphWordForm).NormalFull ?? (f as Pullenti.Morph.MorphWordForm).NormalCase, true, null); if (res != null && res.Count > 0) { return(res); } } } return(null); } if (t is Pullenti.Ner.Core.VerbPhraseToken) { return(FindDerivates((t as Pullenti.Ner.Core.VerbPhraseToken).LastVerb)); } if (t is Pullenti.Ner.Core.VerbPhraseItemToken) { Pullenti.Ner.Core.VerbPhraseItemToken vpt = t as Pullenti.Ner.Core.VerbPhraseItemToken; if (vpt.VerbMorph != null) { res = Pullenti.Semantic.Utils.DerivateService.FindDerivates(vpt.VerbMorph.NormalCase, true, t.Morph.Language); if (res == null || (res.Count == 0 && vpt.VerbMorph.NormalFull != null && vpt.VerbMorph.NormalCase != vpt.VerbMorph.NormalFull)) { res = Pullenti.Semantic.Utils.DerivateService.FindDerivates(vpt.VerbMorph.NormalFull, true, t.Morph.Language); } } return(res); } if (t is Pullenti.Ner.NumberToken) { if ((t as Pullenti.Ner.NumberToken).Value == "1") { return(Pullenti.Semantic.Utils.DerivateService.FindDerivates("ОДИН", true, Pullenti.Morph.MorphLang.RU)); } } if (t is Pullenti.Ner.MetaToken) { return(FindDerivates((t as Pullenti.Ner.MetaToken).EndToken)); } return(null); }