Exemple #1
0
 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);
 }
Exemple #2
0
        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]);
        }
Exemple #3
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);
        }