static bool _processLinks(Pullenti.Semantic.SemGraph gr) { bool ret = false; for (int i = 0; i < gr.Objects.Count; i++) { Pullenti.Semantic.SemObject obj = gr.Objects[i]; for (int j = obj.LinksFrom.Count - 1; j >= 0; j--) { Pullenti.Semantic.SemLink li = obj.LinksFrom[j]; if (li.Typ != Pullenti.Semantic.SemLinkType.Pacient) { continue; } bool exi = false; foreach (Pullenti.Semantic.SemLink ll in obj.LinksFrom) { if (ll != li && ll.Typ == Pullenti.Semantic.SemLinkType.Agent && ll.Target == li.Target) { exi = true; } } if (exi) { if (obj.BeginChar > li.Target.BeginChar) { gr.RemoveLink(li); ret = true; } } } } return(ret); }
public static bool ProcessAnafors(List <Pullenti.Semantic.SemObject> objs) { for (int i = objs.Count - 1; i >= 0; i--) { Pullenti.Semantic.SemObject it = objs[i]; if (it.Typ == Pullenti.Semantic.SemObjectType.PersonalPronoun) { } else if (it.Morph.NormalFull == "КОТОРЫЙ" && it.LinksFrom.Count == 0) { } else { continue; } List <AnaforLink> vars = new List <AnaforLink>(); for (int j = i - 1; j >= 0; j--) { AnaforLink a = AnaforLink.TryCreate(it, objs[j]); if (a == null) { continue; } vars.Add(a); a.Correct(); } if (vars.Count < 1) { continue; } AnaforLink.Sort(vars); if (vars[0].Coef <= 0.1) { continue; } if (vars[0].TargetList != null) { foreach (Pullenti.Semantic.SemObject tgt in vars[0].TargetList) { it.Graph.AddLink(Pullenti.Semantic.SemLinkType.Anafor, it, tgt, null, false, null); } } else { Pullenti.Semantic.SemLink li = it.Graph.AddLink(Pullenti.Semantic.SemLinkType.Anafor, it, vars[0].Target, null, false, null); if (vars.Count > 1 && vars[0].Coef <= (vars[1].Coef * 2) && vars[1].TargetList == null) { Pullenti.Semantic.SemLink li1 = it.Graph.AddLink(Pullenti.Semantic.SemLinkType.Anafor, it, vars[1].Target, null, false, null); li1.AltLink = li; li.AltLink = li1; } } } return(false); }
static bool _collapseAnafors(Pullenti.Semantic.SemGraph gr) { bool ret = false; for (int i = 0; i < gr.Objects.Count; i++) { Pullenti.Semantic.SemObject obj = gr.Objects[i]; if (obj.Typ == Pullenti.Semantic.SemObjectType.PersonalPronoun || obj.Morph.NormalFull == "КОТОРЫЙ") { } else { continue; } if (obj.Attrs.Count > 0 || obj.Quantity != null) { continue; } if (obj.LinksFrom.Count == 1 && obj.LinksFrom[0].Typ == Pullenti.Semantic.SemLinkType.Anafor) { } else if (obj.LinksFrom.Count == 2 && obj.LinksFrom[0].Typ == Pullenti.Semantic.SemLinkType.Anafor && obj.LinksFrom[0].AltLink == obj.LinksFrom[1]) { } else { continue; } Pullenti.Semantic.SemLink alink = obj.LinksFrom[0]; foreach (Pullenti.Semantic.SemLink li in obj.LinksTo) { Pullenti.Semantic.SemLink nli = gr.AddLink(li.Typ, li.Source, alink.Target, li.Question, li.IsOr, li.Preposition); if (alink.AltLink != null) { Pullenti.Semantic.SemLink nli2 = gr.AddLink(li.Typ, li.Source, alink.AltLink.Target, li.Question, li.IsOr, li.Preposition); nli2.AltLink = nli; nli.AltLink = nli2; } } gr.RemoveObject(obj); i--; ret = true; } return(ret); }
public static void Optimize(Pullenti.Semantic.SemDocument doc, Pullenti.Semantic.SemProcessParams pars) { foreach (Pullenti.Semantic.SemBlock blk in doc.Blocks) { foreach (Pullenti.Semantic.SemFragment fr in blk.Fragments) { _optimizeGraph(fr.Graph); } List <Pullenti.Semantic.SemObject> objs = new List <Pullenti.Semantic.SemObject>(); objs.AddRange(blk.Graph.Objects); foreach (Pullenti.Semantic.SemFragment fr in blk.Fragments) { objs.AddRange(fr.Graph.Objects); } foreach (Pullenti.Semantic.SemFragment fr in blk.Fragments) { for (int i = fr.Graph.Links.Count - 1; i >= 0; i--) { Pullenti.Semantic.SemLink li = fr.Graph.Links[i]; if (!objs.Contains(li.Source) || !objs.Contains(li.Target)) { fr.Graph.RemoveLink(li); } } _processParticiples(fr.Graph); _processLinks(fr.Graph); } _sortObjects(objs); _processPointers(objs); _processFormulas(objs); if (pars.DontCreateAnafor) { } else { AnaforHelper.ProcessAnafors(objs); foreach (Pullenti.Semantic.SemFragment fr in blk.Fragments) { _collapseAnafors(fr.Graph); } } } }
public static AnaforLink TryCreate(Pullenti.Semantic.SemObject src, Pullenti.Semantic.SemObject tgt) { if (tgt.Typ != Pullenti.Semantic.SemObjectType.Noun) { return(null); } if (((src.Morph.Number & Pullenti.Morph.MorphNumber.Plural)) == Pullenti.Morph.MorphNumber.Plural) { if (((tgt.Morph.Number & Pullenti.Morph.MorphNumber.Plural)) != Pullenti.Morph.MorphNumber.Undefined) { return new AnaforLink() { Coef = 1, Target = tgt } } ; AnaforLink res = new AnaforLink() { Coef = 0.5, Target = tgt }; res.TargetList = new List <Pullenti.Semantic.SemObject>(); foreach (Pullenti.Semantic.SemLink li in tgt.LinksTo) { Pullenti.Semantic.SemObject frm = li.Source; for (int i = 0; i < frm.LinksFrom.Count; i++) { res.TargetList.Clear(); Pullenti.Semantic.SemLink li0 = frm.LinksFrom[i]; if (li0.Target.Typ != Pullenti.Semantic.SemObjectType.Noun) { continue; } res.TargetList.Add(li0.Target); for (int j = i + 1; j < frm.LinksFrom.Count; j++) { Pullenti.Semantic.SemLink li1 = frm.LinksFrom[j]; if (li1.Typ == li0.Typ && li1.Preposition == li0.Preposition && li1.Target.Typ == li0.Target.Typ) { res.TargetList.Add(li1.Target); } } if (res.TargetList.Count > 1) { return(res); } } } return(null); } if (tgt.Morph.Number != Pullenti.Morph.MorphNumber.Undefined && ((tgt.Morph.Number & Pullenti.Morph.MorphNumber.Singular)) == Pullenti.Morph.MorphNumber.Undefined) { return(null); } if (tgt.Morph.Gender != Pullenti.Morph.MorphGender.Undefined) { if (((tgt.Morph.Gender & src.Morph.Gender)) == Pullenti.Morph.MorphGender.Undefined) { return(null); } return(new AnaforLink() { Coef = 1, Target = tgt }); } return(new AnaforLink() { Coef = 0.1, Target = tgt }); }
static bool _processParticiples(Pullenti.Semantic.SemGraph gr) { bool ret = false; for (int i = 0; i < gr.Objects.Count; i++) { Pullenti.Semantic.SemObject obj = gr.Objects[i]; if (obj.Typ != Pullenti.Semantic.SemObjectType.Participle) { continue; } Pullenti.Semantic.SemLink own = null; bool has = false; foreach (Pullenti.Semantic.SemLink li in obj.LinksTo) { if (li.Typ == Pullenti.Semantic.SemLinkType.Participle) { own = li; } else { has = true; } } if (!has) { continue; } if (own == null) { Pullenti.Semantic.SemObject dum = new Pullenti.Semantic.SemObject(gr) { Typ = Pullenti.Semantic.SemObjectType.Noun }; if (obj.Morph != null) { dum.Morph = new Pullenti.Morph.MorphWordForm() { Class = Pullenti.Morph.MorphClass.Noun, Number = obj.Morph.Number, Gender = obj.Morph.Gender, Case = obj.Morph.Case } } ; gr.Objects.Add(dum); own = gr.AddLink(Pullenti.Semantic.SemLinkType.Participle, dum, obj, "какой", false, null); ret = true; } for (int j = obj.LinksTo.Count - 1; j >= 0; j--) { Pullenti.Semantic.SemLink li = obj.LinksTo[j]; if (li.Typ == Pullenti.Semantic.SemLinkType.Participle) { continue; } bool exi = false; foreach (Pullenti.Semantic.SemLink ll in li.Source.LinksFrom) { if (ll.Target == own.Source) { exi = true; } } if (exi) { gr.RemoveLink(li); } else { obj.LinksTo.RemoveAt(j); li.m_Target = own.Source; } ret = true; } } return(ret); }