Example #1
0
        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);
        }
Example #2
0
 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);
 }
Example #3
0
        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);
        }
Example #4
0
 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);
             }
         }
     }
 }
Example #5
0
            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
                });
            }
Example #6
0
        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);
        }