public SentItem(Pullenti.Ner.MetaToken mt) { Source = mt; if (mt is Pullenti.Ner.Core.NounPhraseToken) { Pullenti.Ner.Core.NounPhraseToken npt = mt as Pullenti.Ner.Core.NounPhraseToken; if (npt.Preposition != null) { Prep = npt.Preposition.Normal; } else { Prep = ""; } Typ = SentItemType.Noun; string Normal = npt.Noun.GetNormalCaseText(Pullenti.Morph.MorphClass.Noun, Pullenti.Morph.MorphNumber.Singular, Pullenti.Morph.MorphGender.Masculine, false); if (Normal != null) { DrGroups = Pullenti.Semantic.Utils.DerivateService.FindDerivates(Normal, true, null); } } else if ((mt is Pullenti.Ner.ReferentToken) || (mt is Pullenti.Ner.Measure.Internal.NumbersWithUnitToken)) { Typ = SentItemType.Noun; } else if (mt is AdverbToken) { Typ = SentItemType.Adverb; } else if (mt is Pullenti.Ner.Core.ConjunctionToken) { Typ = SentItemType.Conj; } else if (mt is DelimToken) { Typ = SentItemType.Delim; } else if (mt is Pullenti.Ner.Core.VerbPhraseToken) { Pullenti.Ner.Core.VerbPhraseToken vpt = mt as Pullenti.Ner.Core.VerbPhraseToken; string Normal = (vpt.FirstVerb.VerbMorph == null ? null : vpt.FirstVerb.VerbMorph.NormalFull ?? vpt.FirstVerb.VerbMorph.NormalCase); if (Normal != null) { DrGroups = Pullenti.Semantic.Utils.DerivateService.FindDerivates(Normal, true, null); } if (vpt.FirstVerb != vpt.LastVerb) { Normal = (vpt.LastVerb.VerbMorph == null ? vpt.GetNormalCaseText(null, Pullenti.Morph.MorphNumber.Undefined, Pullenti.Morph.MorphGender.Undefined, false) : vpt.LastVerb.VerbMorph.NormalFull ?? vpt.LastVerb.VerbMorph.NormalCase); DrGroups2 = Pullenti.Semantic.Utils.DerivateService.FindDerivates(Normal, true, null); } else { DrGroups2 = DrGroups; } Prep = (vpt.Preposition == null ? "" : vpt.Preposition.Normal); Typ = SentItemType.Verb; } }
public static string GetKeyword(Pullenti.Ner.MetaToken mt) { Pullenti.Ner.Core.VerbPhraseToken vpt = mt as Pullenti.Ner.Core.VerbPhraseToken; if (vpt != null) { return(vpt.LastVerb.VerbMorph.NormalFull ?? vpt.LastVerb.VerbMorph.NormalCase); } Pullenti.Ner.Core.NounPhraseToken npt = mt as Pullenti.Ner.Core.NounPhraseToken; if (npt != null) { return(npt.Noun.EndToken.GetNormalCaseText(Pullenti.Morph.MorphClass.Noun, Pullenti.Morph.MorphNumber.Singular, Pullenti.Morph.MorphGender.Undefined, false)); } return(null); }
static List <SemanticLink> _tryCreateInf(Pullenti.Ner.MetaToken master, Pullenti.Ner.Core.VerbPhraseToken vpt2, Pullenti.Semantic.Utils.DerivateGroup gr) { Pullenti.Semantic.Utils.ControlModelItem cit = FindControlItem(master, gr); List <SemanticLink> res = new List <SemanticLink>(); SemanticRole? rol = null; if (cit != null && cit.Links.ContainsKey(Pullenti.Semantic.Utils.ControlModelQuestion.ToDo)) { rol = cit.Links[Pullenti.Semantic.Utils.ControlModelQuestion.ToDo]; } if (rol != null) { res.Add(new SemanticLink() { Rank = (rol.Value != SemanticRole.Common ? 2 : 1), Question = Pullenti.Semantic.Utils.ControlModelQuestion.ToDo }); } return(res); }
static List <SentItem> ParseParticiples(Pullenti.Ner.Core.VerbPhraseToken vb, Pullenti.Ner.Token t1, int lev) { List <Sentence> sents = Sentence.ParseVariants(vb.EndToken.Next, t1, lev + 1, 20, SentItemType.PartBefore) ?? new List <Sentence>(); NGLinkType typ = NGLinkType.Agent; if (vb.FirstVerb.Morph.ContainsAttr("страд.з.", null)) { typ = NGLinkType.Pacient; } else if (vb.FirstVerb.Morph.ContainsAttr("возвр.", null)) { typ = NGLinkType.Pacient; } List <int> endpos = new List <int>(); List <SentItem> res = new List <SentItem>(); bool changed = false; foreach (Sentence s in sents) { if (vb.FirstVerb.IsDeeParticiple) { break; } for (int i = 0; i < s.Items.Count; i++) { SentItem it = s.Items[i]; if (!it.CanBeNoun || it.Typ == SentItemType.Verb) { continue; } if (!string.IsNullOrEmpty(it.Prep)) { continue; } if (it.Typ == SentItemType.PartBefore || it.Typ == SentItemType.PartAfter) { continue; } NGLink li = new NGLink() { Typ = typ, From = new NGItem() { Source = it }, ToVerb = vb }; li.CalcCoef(true); if (li.Coef < 0) { continue; } if (endpos.Contains(it.EndToken.EndChar)) { continue; } Sentence ss = new Sentence() { LastNounToFirstVerb = typ }; ss.Items.Add(new SentItem(vb)); for (int j = 0; j <= i; j++) { SentItem si = new SentItem(null); si.CopyFrom(s.Items[j]); ss.Items.Add(si); } ss.CalcCoef(false); changed = true; if (ss.Coef < 0) { continue; } SentItem part = new SentItem(it.Source); part.Typ = SentItemType.PartAfter; part.SubSent = ss; if (vb.Preposition != null) { part.Prep = vb.Preposition.Normal; } part.BeginToken = vb.BeginToken; part.EndToken = it.Source.EndToken; if ((i + 1) < ss.Items.Count) { part.Result = ss.Items[i + 1].Result; } endpos.Add(it.EndToken.EndChar); res.Add(part); } } endpos.Clear(); if (changed) { sents = Sentence.ParseVariants(vb.EndToken.Next, t1, lev + 1, 20, SentItemType.PartBefore) ?? new List <Sentence>(); } foreach (Sentence s in sents) { s.Items.Insert(0, new SentItem(vb)); s.CalcCoef(true); s.TruncOborot(true); int end = s.Items[s.Items.Count - 1].EndToken.EndChar; endpos.Add(end); s.NotLastNounToFirstVerb = typ; s.CalcCoef(false); SentItem part = new SentItem(vb); part.PartVerbTyp = typ; part.Typ = (vb.FirstVerb.IsDeeParticiple ? SentItemType.Deepart : SentItemType.PartBefore); part.SubSent = s; part.Result = s.Items[0].Result; part.ResultVerbLast = s.Items[0].ResultVerbLast; part.EndToken = s.Items[s.Items.Count - 1].EndToken; res.Add(part); } if (res.Count == 0 && sents.Count == 0) { SentItem part = new SentItem(vb); part.PartVerbTyp = typ; part.Typ = (vb.FirstVerb.IsDeeParticiple ? SentItemType.Deepart : SentItemType.PartBefore); res.Add(part); } return(res); }
public static List <SentItem> ParseNearItems(Pullenti.Ner.Token t, Pullenti.Ner.Token t1, int lev, List <SentItem> prev) { if (lev > 100) { return(null); } if (t == null || t.BeginChar > t1.EndChar) { return(null); } List <SentItem> res = new List <SentItem>(); if (t is Pullenti.Ner.ReferentToken) { res.Add(new SentItem(t as Pullenti.Ner.MetaToken)); return(res); } DelimToken delim = DelimToken.TryParse(t); if (delim != null) { res.Add(new SentItem(delim)); return(res); } Pullenti.Ner.Core.ConjunctionToken conj = Pullenti.Ner.Core.ConjunctionHelper.TryParse(t); if (conj != null) { res.Add(new SentItem(conj)); return(res); } Pullenti.Ner.Core.PrepositionToken prep = Pullenti.Ner.Core.PrepositionHelper.TryParse(t); Pullenti.Ner.Token t111 = (prep == null ? t : prep.EndToken.Next); if ((t111 is Pullenti.Ner.NumberToken) && ((t111.Morph.Class.IsAdjective && !t111.Morph.Class.IsNoun))) { t111 = null; } Pullenti.Ner.Measure.Internal.NumbersWithUnitToken num = (t111 == null ? null : Pullenti.Ner.Measure.Internal.NumbersWithUnitToken.TryParse(t111, null, false, false, false, false)); if (num != null) { if (num.Units.Count == 0) { Pullenti.Ner.Core.NounPhraseToken npt1 = Pullenti.Ner.Core.NounPhraseHelper.TryParse(num.EndToken.Next, m_NptAttrs, 0, null); if (npt1 == null && num.EndToken.Next != null && num.EndToken.Next.IsValue("РАЗ", null)) { npt1 = new Pullenti.Ner.Core.NounPhraseToken(num.EndToken.Next, num.EndToken.Next); npt1.Noun = new Pullenti.Ner.MetaToken(num.EndToken.Next, num.EndToken.Next); } if (npt1 != null && prep != null) { if (npt1.Noun.EndToken.IsValue("РАЗ", null)) { npt1.Morph.RemoveItems(prep.NextCase); } else if (((npt1.Morph.Case & prep.NextCase)).IsUndefined) { npt1 = null; } else { npt1.Morph.RemoveItems(prep.NextCase); } } if ((npt1 != null && npt1.EndToken.IsValue("ОНИ", null) && npt1.Preposition != null) && npt1.Preposition.Normal == "ИЗ") { npt1.Morph = new Pullenti.Ner.MorphCollection(num.EndToken.Morph); npt1.Preposition = null; string nn = num.ToString(); SentItem si1 = new SentItem(npt1); if (nn == "1" && (num.EndToken is Pullenti.Ner.NumberToken) && (num.EndToken as Pullenti.Ner.NumberToken).EndToken.IsValue("ОДИН", null)) { Pullenti.Semantic.SemAttribute a = new Pullenti.Semantic.SemAttribute() { Typ = Pullenti.Semantic.SemAttributeType.OneOf, Spelling = (num.EndToken as Pullenti.Ner.NumberToken).EndToken.GetNormalCaseText(null, Pullenti.Morph.MorphNumber.Singular, Pullenti.Morph.MorphGender.Undefined, false) }; SemAttributeEx aex = new SemAttributeEx(num) { Attr = a }; si1.Attrs = new List <SemAttributeEx>(); si1.Attrs.Add(aex); } else { si1.Quant = new Pullenti.Semantic.SemQuantity(nn, num.BeginToken, num.EndToken); } if (prep != null) { si1.Prep = prep.Normal; } res.Add(si1); return(res); } if (npt1 != null) { SentItem si1 = new SentItem(npt1) { Quant = new Pullenti.Semantic.SemQuantity(num.ToString(), num.BeginToken, num.EndToken) }; if (prep != null) { si1.Prep = prep.Normal; } if (npt1.EndToken.IsValue("РАЗ", null)) { si1.Typ = SentItemType.Formula; } if (((npt1.Morph.Number & Pullenti.Morph.MorphNumber.Plural)) == Pullenti.Morph.MorphNumber.Undefined && si1.Quant.Spelling != "1") { bool ok = false; if (si1.Quant.Spelling.EndsWith("1")) { ok = true; } else if (si1.Typ == SentItemType.Formula) { ok = true; } else if (si1.Quant.Spelling.EndsWith("2") && npt1.Morph.Case.IsGenitive) { ok = true; } else if (si1.Quant.Spelling.EndsWith("3") && npt1.Morph.Case.IsGenitive) { ok = true; } else if (si1.Quant.Spelling.EndsWith("4") && npt1.Morph.Case.IsGenitive) { ok = true; } if (ok) { npt1.Morph = new Pullenti.Ner.MorphCollection(); npt1.Morph.Number = Pullenti.Morph.MorphNumber.Plural; } } res.Add(si1); return(res); } } num.BeginToken = t; num.Morph = new Pullenti.Ner.MorphCollection(num.EndToken.Morph); SentItem si = new SentItem(num); if (prep != null) { si.Prep = prep.Normal; } res.Add(si); if (si.Prep == "НА") { AdverbToken aa = AdverbToken.TryParse(si.EndToken.Next); if (aa != null && ((aa.Typ == Pullenti.Semantic.SemAttributeType.Less || aa.Typ == Pullenti.Semantic.SemAttributeType.Great))) { si.AddAttr(aa); si.EndToken = aa.EndToken; } } return(res); } Pullenti.Morph.MorphClass mc = t.GetMorphClassInDictionary(); AdverbToken adv = AdverbToken.TryParse(t); Pullenti.Ner.Core.NounPhraseToken npt = Pullenti.Ner.Core.NounPhraseHelper.TryParse(t, m_NptAttrs, 0, null); if (npt != null && (npt.EndToken is Pullenti.Ner.TextToken) && (npt.EndToken as Pullenti.Ner.TextToken).Term == "БЫЛИ") { npt = null; } if (npt != null && adv != null) { if (adv.EndChar > npt.EndChar) { npt = null; } else if (adv.EndChar == npt.EndChar) { res.Add(new SentItem(npt)); res.Add(new SentItem(adv)); return(res); } } if (npt != null && npt.Adjectives.Count == 0) { if (npt.EndToken.IsValue("КОТОРЫЙ", null) && t.Previous != null && t.Previous.IsCommaAnd) { List <SentItem> res1 = ParseSubsent(npt, t1, lev + 1, prev); if (res1 != null) { return(res1); } } if (npt.EndToken.IsValue("СКОЛЬКО", null)) { Pullenti.Ner.Token tt1 = npt.EndToken.Next; if (tt1 != null && tt1.IsValue("ВСЕГО", null)) { tt1 = tt1.Next; } Pullenti.Ner.Core.NounPhraseToken npt1 = Pullenti.Ner.Core.NounPhraseHelper.TryParse(tt1, Pullenti.Ner.Core.NounPhraseParseAttr.No, 0, null); if (npt1 != null && !npt1.Morph.Case.IsUndefined && prep != null) { if (((prep.NextCase & npt1.Morph.Case)).IsUndefined) { npt1 = null; } else { npt1.Morph.RemoveItems(prep.NextCase); } } if (npt1 != null) { npt1.BeginToken = npt.BeginToken; npt1.Preposition = npt.Preposition; npt1.Adjectives.Add(new Pullenti.Ner.MetaToken(npt.EndToken, npt.EndToken)); npt = npt1; } } if (npt.EndToken.Morph.Class.IsAdjective) { if (Pullenti.Ner.Core.VerbPhraseHelper.TryParse(t, true, false, false) != null) { npt = null; } } } Pullenti.Ner.Core.VerbPhraseToken vrb = null; if (npt != null && npt.Adjectives.Count > 0) { vrb = Pullenti.Ner.Core.VerbPhraseHelper.TryParse(t, true, false, false); if (vrb != null && vrb.FirstVerb.IsParticiple) { npt = null; } } else if (adv == null || npt != null) { vrb = Pullenti.Ner.Core.VerbPhraseHelper.TryParse(t, true, false, false); } if (npt != null) { res.Add(new SentItem(npt)); } if (vrb != null && !vrb.FirstVerb.IsParticiple && !vrb.FirstVerb.IsDeeParticiple) { List <Pullenti.Morph.MorphWordForm> vars = new List <Pullenti.Morph.MorphWordForm>(); foreach (Pullenti.Morph.MorphBaseInfo wf in vrb.FirstVerb.Morph.Items) { if (wf.Class.IsVerb && (wf is Pullenti.Morph.MorphWordForm) && (wf as Pullenti.Morph.MorphWordForm).IsInDictionary) { vars.Add(wf as Pullenti.Morph.MorphWordForm); } } if (vars.Count < 2) { res.Add(new SentItem(vrb)); } else { vrb.FirstVerb.VerbMorph = vars[0]; res.Add(new SentItem(vrb)); for (int i = 1; i < vars.Count; i++) { vrb = Pullenti.Ner.Core.VerbPhraseHelper.TryParse(t, false, false, false); if (vrb == null) { break; } vrb.FirstVerb.VerbMorph = vars[i]; res.Add(new SentItem(vrb)); } if (vars[0].Misc.Mood == Pullenti.Morph.MorphMood.Imperative && vars[1].Misc.Mood != Pullenti.Morph.MorphMood.Imperative) { SentItem rr = res[0]; res[0] = res[1]; res[1] = rr; } } return(res); } if (vrb != null) { List <SentItem> res1 = ParseParticiples(vrb, t1, lev + 1); if (res1 != null) { res.AddRange(res1); } } if (res.Count > 0) { return(res); } if (adv != null) { if (adv.Typ == Pullenti.Semantic.SemAttributeType.Other) { Pullenti.Ner.Core.NounPhraseToken npt1 = Pullenti.Ner.Core.NounPhraseHelper.TryParse(adv.EndToken.Next, m_NptAttrs, 0, null); if (npt1 != null && npt1.EndToken.IsValue("ОНИ", null) && npt1.Preposition != null) { SentItem si1 = new SentItem(npt1); Pullenti.Semantic.SemAttribute a = new Pullenti.Semantic.SemAttribute() { Typ = Pullenti.Semantic.SemAttributeType.Other, Spelling = adv.EndToken.GetNormalCaseText(null, Pullenti.Morph.MorphNumber.Undefined, Pullenti.Morph.MorphGender.Undefined, false) }; SemAttributeEx aex = new SemAttributeEx(num) { Attr = a }; si1.Attrs = new List <SemAttributeEx>(); si1.Attrs.Add(aex); if (prep != null) { si1.Prep = prep.Normal; } res.Add(si1); return(res); } for (int i = prev.Count - 1; i >= 0; i--) { if (prev[i].Attrs != null) { foreach (SemAttributeEx a in prev[i].Attrs) { if (a.Attr.Typ == Pullenti.Semantic.SemAttributeType.OneOf) { SentItem si1 = new SentItem(prev[i].Source); Pullenti.Semantic.SemAttribute aa = new Pullenti.Semantic.SemAttribute() { Typ = Pullenti.Semantic.SemAttributeType.Other, Spelling = adv.EndToken.GetNormalCaseText(null, Pullenti.Morph.MorphNumber.Undefined, Pullenti.Morph.MorphGender.Undefined, false) }; SemAttributeEx aex = new SemAttributeEx(adv) { Attr = aa }; si1.Attrs = new List <SemAttributeEx>(); si1.Attrs.Add(aex); if (prep != null) { si1.Prep = prep.Normal; } si1.BeginToken = adv.BeginToken; si1.EndToken = adv.EndToken; res.Add(si1); return(res); } } } } } res.Add(new SentItem(adv)); return(res); } if (mc.IsAdjective) { npt = new Pullenti.Ner.Core.NounPhraseToken(t, t) { Morph = new Pullenti.Ner.MorphCollection(t.Morph) }; npt.Noun = new Pullenti.Ner.MetaToken(t, t); res.Add(new SentItem(npt)); return(res); } 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]); }
static List <SemanticLink> _tryCreateVerb(Pullenti.Ner.Core.VerbPhraseToken vpt1, Pullenti.Ner.MetaToken slave, Pullenti.Semantic.Utils.DerivateGroup gr) { if (slave is Pullenti.Ner.Core.VerbPhraseToken) { return(_tryCreateInf(vpt1, slave as Pullenti.Ner.Core.VerbPhraseToken, gr)); } SemanticAbstractSlave sla2 = slave as SemanticAbstractSlave; List <SemanticLink> res = new List <SemanticLink>(); if (sla2 == null) { return(res); } Pullenti.Semantic.Utils.ControlModelItem cit = FindControlItem(vpt1.LastVerb, gr); string prep = sla2.Preposition; Pullenti.Morph.MorphBaseInfo morph = (Pullenti.Morph.MorphBaseInfo)sla2.Morph; bool isRev1 = vpt1.LastVerb.IsVerbReversive || vpt1.LastVerb.IsVerbPassive; bool noNomin = false; bool noInstr = false; if (prep == null && morph.Case.IsNominative && !vpt1.FirstVerb.IsParticiple) { bool ok = true; bool err = false; Pullenti.Morph.MorphWordForm vm = vpt1.FirstVerb.VerbMorph; if (vm == null) { return(res); } if (vm.Number == Pullenti.Morph.MorphNumber.Singular) { if (morph.Number == Pullenti.Morph.MorphNumber.Plural) { if (!vpt1.FirstVerb.IsVerbInfinitive) { ok = false; } } } if (!CheckMorphAccord(morph, false, vm, false)) { if (!err && !vpt1.FirstVerb.IsVerbInfinitive) { ok = false; } } else if (vm.Misc.Person != Pullenti.Morph.MorphPerson.Undefined) { if (((vm.Misc.Person & Pullenti.Morph.MorphPerson.Third)) == Pullenti.Morph.MorphPerson.Undefined) { if (((vm.Misc.Person & Pullenti.Morph.MorphPerson.First)) == Pullenti.Morph.MorphPerson.First) { if (!morph.ContainsAttr("1 л.", null)) { ok = false; } } if (((vm.Misc.Person & Pullenti.Morph.MorphPerson.Second)) == Pullenti.Morph.MorphPerson.Second) { if (!morph.ContainsAttr("2 л.", null)) { ok = false; } } } } noNomin = true; if (ok) { Pullenti.Semantic.Utils.ControlModelItem cit00 = cit; bool isRev0 = isRev1; if (vpt1.FirstVerb != vpt1.LastVerb && ((vpt1.FirstVerb.IsVerbReversive || vpt1.FirstVerb.IsVerbPassive || vpt1.FirstVerb.Normal == "ИМЕТЬ"))) { cit00 = null; isRev0 = true; List <Pullenti.Semantic.Utils.DerivateGroup> grs = FindDerivates(vpt1.FirstVerb); if (grs != null) { foreach (Pullenti.Semantic.Utils.DerivateGroup gg in grs) { if ((((cit00 = FindControlItem(vpt1.FirstVerb, gg)))) != null) { break; } } } } SemanticLink sl = null; bool addagent = false; if (cit00 == null) { sl = new SemanticLink() { Modelled = true, Role = (isRev0 ? SemanticRole.Pacient : SemanticRole.Agent), Rank = 1, Question = Pullenti.Semantic.Utils.ControlModelQuestion.BaseNominative, IsPassive = isRev0 } } ; else { foreach (KeyValuePair <Pullenti.Semantic.Utils.ControlModelQuestion, SemanticRole> kp in cit00.Links) { Pullenti.Semantic.Utils.ControlModelQuestion q = kp.Key; if (q.Check(null, Pullenti.Morph.MorphCase.Nominative)) { sl = new SemanticLink() { Role = kp.Value, Rank = 2, Question = q, IsPassive = isRev0 }; if (sl.Role == SemanticRole.Agent) { sl.IsPassive = false; } else if (sl.Role == SemanticRole.Pacient && cit00.NominativeCanBeAgentAndPacient && vpt1.LastVerb.IsVerbReversive) { addagent = true; } break; } } } if (sl != null) { if (cit00 == null && morph.Case.IsInstrumental && isRev0) { sl.Rank -= 0.5; } if (morph.Case.IsAccusative) { sl.Rank -= 0.5; } if (sla2.BeginChar > vpt1.BeginChar) { sl.Rank -= 0.5; } if (err) { sl.Rank -= 0.5; } res.Add(sl); if (addagent) { res.Add(new SemanticLink() { Role = SemanticRole.Agent, Rank = sl.Rank, Question = sl.Question }); } } } } if (prep == null && isRev1 && morph.Case.IsInstrumental) { noInstr = true; Pullenti.Semantic.Utils.ControlModelItem cit00 = cit; SemanticLink sl = null; if (cit00 == null) { sl = new SemanticLink() { Modelled = true, Role = SemanticRole.Agent, Rank = 1, Question = Pullenti.Semantic.Utils.ControlModelQuestion.BaseInstrumental, IsPassive = true } } ; else { foreach (KeyValuePair <Pullenti.Semantic.Utils.ControlModelQuestion, SemanticRole> kp in cit00.Links) { Pullenti.Semantic.Utils.ControlModelQuestion q = kp.Key; if (q.Check(null, Pullenti.Morph.MorphCase.Instrumental)) { sl = new SemanticLink() { Role = kp.Value, Rank = 2, Question = q }; if (sl.Role == SemanticRole.Agent) { sl.IsPassive = true; } break; } } } if (sl != null) { if (cit00 == null && morph.Case.IsNominative) { sl.Rank -= 0.5; } if (morph.Case.IsAccusative) { sl.Rank -= 0.5; } if (sla2.BeginChar < vpt1.BeginChar) { sl.Rank -= 0.5; } res.Add(sl); if ((gr != null && gr.Model.Items.Count > 0 && gr.Model.Items[0].Typ == Pullenti.Semantic.Utils.ControlModelItemType.Verb) && gr.Model.Items[0].Links.ContainsKey(Pullenti.Semantic.Utils.ControlModelQuestion.BaseInstrumental)) { sl.Rank = 0; SemanticLink sl0 = new SemanticLink() { Question = sl.Question, Rank = 1, Role = gr.Model.Items[0].Links[Pullenti.Semantic.Utils.ControlModelQuestion.BaseInstrumental] }; res.Insert(0, sl0); } } } if (prep == null && morph.Case.IsDative && ((cit == null || !cit.Links.ContainsKey(Pullenti.Semantic.Utils.ControlModelQuestion.BaseDative)))) { SemanticLink sl = new SemanticLink() { Modelled = cit == null, Role = SemanticRole.Strong, Rank = 1, Question = Pullenti.Semantic.Utils.ControlModelQuestion.BaseDative }; if (morph.Case.IsAccusative || morph.Case.IsNominative) { sl.Rank -= 0.5; } if (vpt1.EndToken.Next != sla2.BeginToken) { sl.Rank -= 0.5; } if (cit != null) { sl.Rank -= 0.5; } res.Add(sl); } _createRoles(cit, prep, morph.Case, res, noNomin, noInstr); if (gr != null && gr.Model.Pacients.Count > 0) { bool ok = false; foreach (string n in gr.Model.Pacients) { if (sla2.Source != null) { if (sla2.Source.EndToken.IsValue(n, null)) { ok = true; break; } } else if (sla2.EndToken.IsValue(n, null)) { ok = true; break; } } if (ok) { if (res.Count == 0) { ok = false; if (prep == null && isRev1 && morph.Case.IsNominative) { ok = true; } else if (prep == null && !isRev1 && morph.Case.IsAccusative) { ok = true; } if (ok) { res.Add(new SemanticLink() { Role = SemanticRole.Pacient, Question = (isRev1 ? Pullenti.Semantic.Utils.ControlModelQuestion.BaseNominative : Pullenti.Semantic.Utils.ControlModelQuestion.BaseAccusative), Idiom = true }); } } else { foreach (SemanticLink r in res) { r.Rank += 4; if (r.Role == SemanticRole.Common) { r.Role = SemanticRole.Strong; } if (vpt1.EndToken.Next == sla2.BeginToken) { r.Rank += 2; } r.Idiom = true; } } } } return(res); }
/// <summary> /// Попробовать создать семантическую связь между элементами. /// Элементом м.б. именная (NounPhraseToken) или глагольная группа (VerbPhraseToken). /// </summary> /// <param name="master">основной элемент</param> /// <param name="slave">стыкуемый элемент (также м.б. SemanticAbstractSlave)</param> /// <param name="onto">дополнительный онтологический словарь</param> /// <return>список вариантов (возможно, пустой)</return> public static List <SemanticLink> TryCreateLinks(Pullenti.Ner.MetaToken master, Pullenti.Ner.MetaToken slave, ISemanticOnto onto = null) { List <SemanticLink> res = new List <SemanticLink>(); Pullenti.Ner.Core.VerbPhraseToken vpt1 = master as Pullenti.Ner.Core.VerbPhraseToken; Pullenti.Ner.Core.VerbPhraseToken vpt2 = slave as Pullenti.Ner.Core.VerbPhraseToken; Pullenti.Ner.Core.NounPhraseToken npt1 = master as Pullenti.Ner.Core.NounPhraseToken; if (slave is Pullenti.Ner.Core.NounPhraseToken) { slave = SemanticAbstractSlave.CreateFromNoun(slave as Pullenti.Ner.Core.NounPhraseToken); } SemanticAbstractSlave sla2 = slave as SemanticAbstractSlave; if (vpt2 != null) { if (!vpt2.FirstVerb.IsVerbInfinitive || !vpt2.LastVerb.IsVerbInfinitive) { return(res); } } List <Pullenti.Semantic.Utils.DerivateGroup> grs = FindDerivates(master); if (grs == null || grs.Count == 0) { List <SemanticLink> rl = (vpt1 != null ? _tryCreateVerb(vpt1, slave, null) : _tryCreateNoun(npt1, slave, null)); if (rl != null) { res.AddRange(rl); } } else { foreach (Pullenti.Semantic.Utils.DerivateGroup gr in grs) { List <SemanticLink> rl = (vpt1 != null ? _tryCreateVerb(vpt1, slave, gr) : _tryCreateNoun(npt1, slave, gr)); if (rl == null || rl.Count == 0) { continue; } res.AddRange(rl); } } if ((npt1 != null && sla2 != null && sla2.Morph.Case.IsGenitive) && sla2.Preposition == null) { if (npt1.Noun.BeginToken.GetMorphClassInDictionary().IsPersonalPronoun) { } else { bool hasGen = false; foreach (SemanticLink r in res) { if (r.Question == Pullenti.Semantic.Utils.ControlModelQuestion.BaseGenetive) { hasGen = true; break; } } if (!hasGen) { res.Add(new SemanticLink() { Modelled = true, Master = npt1, Slave = sla2, Rank = 0.5, Question = Pullenti.Semantic.Utils.ControlModelQuestion.BaseGenetive }); } } } if (onto != null) { string str1 = GetKeyword(master); string str2 = GetKeyword(slave); if (str2 != null) { if (onto.CheckLink(str1, str2)) { if (res.Count > 0) { foreach (SemanticLink r in res) { r.Rank += 3; if (r.Role == SemanticRole.Common) { r.Role = SemanticRole.Strong; } } } else { res.Add(new SemanticLink() { Role = SemanticRole.Strong, Master = master, Slave = slave, Rank = 3 }); } } } } if (npt1 != null) { if (((npt1.Adjectives.Count > 0 && npt1.Adjectives[0].BeginToken.Morph.Class.IsPronoun)) || npt1.Anafor != null) { foreach (SemanticLink r in res) { if (r.Question == Pullenti.Semantic.Utils.ControlModelQuestion.BaseGenetive) { r.Rank -= 0.5; if (r.Role == SemanticRole.Strong) { r.Role = SemanticRole.Common; } } } } } foreach (SemanticLink r in res) { if (r.Role == SemanticRole.Strong) { foreach (SemanticLink rr in res) { if (rr != r && rr.Role != SemanticRole.Strong) { rr.Rank /= 2; } } } } for (int i = 0; i < res.Count; i++) { for (int j = 0; j < (res.Count - 1); j++) { if (res[j].CompareTo(res[j + 1]) > 0) { SemanticLink r = res[j]; res[j] = res[j + 1]; res[j + 1] = r; } } } foreach (SemanticLink r in res) { r.Master = master; r.Slave = slave; } return(res); }