示例#1
0
        static List <SentItem> ParseSubsent(Pullenti.Ner.Core.NounPhraseToken npt, Pullenti.Ner.Token t1, int lev, List <SentItem> prev)
        {
            bool ok = false;

            if (prev != null)
            {
                for (int i = prev.Count - 1; i >= 0; i--)
                {
                    SentItem it = prev[i];
                    if (it.Typ == SentItemType.Conj || it.Typ == SentItemType.Delim)
                    {
                        ok = true;
                        break;
                    }
                    if (it.Typ == SentItemType.Verb)
                    {
                        break;
                    }
                }
            }
            if (!ok)
            {
                return(null);
            }
            List <Sentence> sents  = Sentence.ParseVariants(npt.EndToken.Next, t1, lev + 1, 20, SentItemType.SubSent) ?? new List <Sentence>();
            List <int>      endpos = new List <int>();
            List <SentItem> res    = new List <SentItem>();

            foreach (Sentence s in sents)
            {
                s.Items.Insert(0, new SentItem(npt));
                s.CalcCoef(true);
                s.TruncOborot(false);
                int end = s.Items[s.Items.Count - 1].EndToken.EndChar;
                if (endpos.Contains(end))
                {
                    continue;
                }
                endpos.Add(end);
                s.CalcCoef(false);
                SentItem part = new SentItem(npt);
                part.Typ      = SentItemType.SubSent;
                part.SubTyp   = SentItemSubtype.Wich;
                part.SubSent  = s;
                part.Result   = s.Items[0].Result;
                part.EndToken = s.Items[s.Items.Count - 1].EndToken;
                res.Add(part);
            }
            return(res);
        }
示例#2
0
 public void CopyFrom(SentItem it)
 {
     Source         = it.Source;
     Typ            = it.Typ;
     SubTyp         = it.SubTyp;
     Prep           = it.Prep;
     ParticipleCoef = it.ParticipleCoef;
     DrGroups       = it.DrGroups;
     DrGroups2      = it.DrGroups2;
     PartVerbTyp    = it.PartVerbTyp;
     m_BeginToken   = it.m_BeginToken;
     m_EndToken     = it.m_EndToken;
     Plural         = it.Plural;
     SubSent        = it.SubSent;
     Quant          = it.Quant;
     Attrs          = it.Attrs;
     CanBeQuestion  = it.CanBeQuestion;
     Result         = it.Result;
     ResultList     = it.ResultList;
     ResultListOr   = it.ResultListOr;
     ResultVerbLast = it.ResultVerbLast;
     ResGraph       = it.ResGraph;
     ResFrag        = it.ResFrag;
 }
示例#3
0
        public static List <Subsent> CreateSubsents(Sentence sent)
        {
            if (sent.Items.Count == 0)
            {
                return(null);
            }
            List <Subsent> res   = new List <Subsent>();
            int            begin = sent.Items[0].BeginToken.BeginChar;
            int            end   = sent.Items[sent.Items.Count - 1].EndToken.EndChar;

            byte[] map = new byte[(int)((end + 1) - begin)];
            if (sent.BestVar != null)
            {
                foreach (NGSegmentVariant seg in sent.BestVar.Segs)
                {
                    if (seg != null)
                    {
                        foreach (NGLink li in seg.Links)
                        {
                            if (li != null && li.Typ == NGLinkType.List)
                            {
                                for (int i = (li.To == null ? li.ToVerb.BeginChar : li.To.Source.BeginToken.BeginChar); i <= li.From.Source.EndToken.EndChar; i++)
                                {
                                    int po = i - begin;
                                    if (po >= 0 && (po < map.Length))
                                    {
                                        map[po] = 1;
                                    }
                                }
                            }
                        }
                    }
                }
            }
            Subsent ss      = new Subsent();
            bool    hasVerb = false;

            for (int i = 0; i < sent.Items.Count; i++)
            {
                SentItem it    = sent.Items[i];
                bool     delim = false;
                if (it.Typ == SentItemType.Delim)
                {
                    delim = true;
                }
                else if (it.Typ == SentItemType.Conj && map[it.BeginToken.BeginChar - begin] == 0)
                {
                    delim = true;
                    if ((it.Source as Pullenti.Ner.Core.ConjunctionToken).Typ == Pullenti.Ner.Core.ConjunctionType.Comma)
                    {
                        if (!hasVerb)
                        {
                            delim = false;
                        }
                    }
                }
                if (!delim)
                {
                    if (it.Typ == SentItemType.Verb)
                    {
                        hasVerb = true;
                    }
                    ss.Items.Add(it);
                    continue;
                }
                if (ss.Items.Count == 0)
                {
                    ss.Delims.Add(it.Source);
                    continue;
                }
                if (ss.Items.Count > 0)
                {
                    res.Add(ss);
                }
                ss      = new Subsent();
                hasVerb = false;
                ss.Delims.Add(it.Source);
            }
            if (ss.Items.Count > 0)
            {
                res.Add(ss);
            }
            for (int i = 0; i < res.Count; i++)
            {
                Subsent r = res[i];
                int     j;
                if (r.Check(DelimType.If))
                {
                    bool hasThen = false;
                    bool hasElse = false;
                    for (j = i + 1; j < res.Count; j++)
                    {
                        if (res[j].Check(DelimType.Then))
                        {
                            if (hasThen)
                            {
                                break;
                            }
                            res[j].Owner     = r;
                            res[j].Question  = "если";
                            res[j].Typ       = Pullenti.Semantic.SemFraglinkType.IfThen;
                            hasThen          = true;
                            r.IsThenElseRoot = true;
                        }
                        else if (res[j].Check(DelimType.Else))
                        {
                            if (hasElse)
                            {
                                break;
                            }
                            res[j].Owner     = r;
                            res[j].Question  = "иначе";
                            res[j].Typ       = Pullenti.Semantic.SemFraglinkType.IfElse;
                            hasElse          = true;
                            r.IsThenElseRoot = true;
                        }
                        else if (res[j].Check(DelimType.If))
                        {
                            if (res[j].Check(DelimType.And))
                            {
                                res[j].Owner = r;
                            }
                            else
                            {
                                break;
                            }
                        }
                    }
                    if (!hasThen && i > 0)
                    {
                        if (res[0].Owner == null && res[0].OnlyConj())
                        {
                            res[0].Owner     = r;
                            res[0].Question  = "если";
                            r.IsThenElseRoot = true;
                            res[0].Typ       = Pullenti.Semantic.SemFraglinkType.IfThen;
                        }
                        else if (res[0].Owner != null)
                        {
                            r.Owner    = res[0];
                            r.Question = "если";
                            r.Typ      = Pullenti.Semantic.SemFraglinkType.IfThen;
                        }
                    }
                    continue;
                }
                if (r.Check(DelimType.Because))
                {
                    bool hasThen = false;
                    for (j = i + 1; j < res.Count; j++)
                    {
                        if (res[j].Check(DelimType.Then))
                        {
                            if (hasThen)
                            {
                                break;
                            }
                            res[j].Owner     = r;
                            res[j].Question  = "по причине";
                            res[j].Typ       = Pullenti.Semantic.SemFraglinkType.Because;
                            hasThen          = true;
                            r.IsThenElseRoot = true;
                        }
                    }
                    if (!hasThen && i > 0)
                    {
                        if (res[0].Owner == null && res[0].OnlyConj())
                        {
                            res[0].Owner     = r;
                            res[0].Question  = "по причине";
                            r.IsThenElseRoot = true;
                            res[0].Typ       = Pullenti.Semantic.SemFraglinkType.Because;
                            continue;
                        }
                    }
                    if (!hasThen && ((i + 1) < res.Count))
                    {
                        if (res[i + 1].Owner == null && res[i + 1].OnlyConj())
                        {
                            res[i + 1].Owner    = r;
                            res[i + 1].Question = "по причине";
                            r.IsThenElseRoot    = true;
                            res[i + 1].Typ      = Pullenti.Semantic.SemFraglinkType.Because;
                            continue;
                        }
                    }
                    continue;
                }
                if (r.Check(DelimType.But))
                {
                    if (i > 0)
                    {
                        if (res[i - 1].Owner == null && res[i - 1].OnlyConj())
                        {
                            res[i - 1].Owner    = r;
                            res[i - 1].Question = "но";
                            r.IsThenElseRoot    = true;
                            res[i - 1].Typ      = Pullenti.Semantic.SemFraglinkType.But;
                            continue;
                        }
                    }
                }
                if (r.Check(DelimType.What))
                {
                    if (i > 0)
                    {
                        if (res[i - 1].Owner == null && res[i - 1].OnlyConj())
                        {
                            res[i - 1].Owner    = r;
                            res[i - 1].Question = "что";
                            r.IsThenElseRoot    = true;
                            res[i - 1].Typ      = Pullenti.Semantic.SemFraglinkType.What;
                            continue;
                        }
                    }
                }
                if (r.Check(DelimType.For))
                {
                    if ((i + 1) < res.Count)
                    {
                        if (res[i + 1].Owner == null && res[i + 1].OnlyConj())
                        {
                            res[i + 1].Owner    = r;
                            res[i + 1].Question = "чтобы";
                            r.IsThenElseRoot    = true;
                            res[i + 1].Typ      = Pullenti.Semantic.SemFraglinkType.For;
                            continue;
                        }
                    }
                    if (i > 0)
                    {
                        if (res[i - 1].Owner == null && res[i - 1].OnlyConj())
                        {
                            res[i - 1].Owner    = r;
                            res[i - 1].Question = "чтобы";
                            r.IsThenElseRoot    = true;
                            res[i - 1].Typ      = Pullenti.Semantic.SemFraglinkType.For;
                            continue;
                        }
                    }
                }
            }
            for (int i = 1; i < res.Count; i++)
            {
                Subsent r = res[i];
                if (!r.Check(DelimType.And) || r.Owner != null)
                {
                    continue;
                }
                for (int j = i - 1; j >= 0; j--)
                {
                    Subsent rr = res[j];
                    if (rr.CanBeNextInList(r) && ((rr.Owner == null || ((rr.OwnerRoot != null && rr.OwnerRoot.CanBeNextInList(r))))))
                    {
                        if (r.CheckOr())
                        {
                            rr.IsOr = true;
                        }
                        rr.Items.AddRange(r.Items);
                        res.RemoveAt(i);
                        i--;
                        break;
                    }
                }
            }
            return(res);
        }
示例#4
0
        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);
        }
示例#5
0
        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);
        }
示例#6
0
        public static List <NGSegment> CreateSegments(Sentence s)
        {
            List <NGSegment> res = new List <NGSegment>();

            for (int i = 0; i < s.Items.Count; i++)
            {
                SentItem it = s.Items[i];
                if (it.Typ == SentItemType.Verb || it.Typ == SentItemType.Delim)
                {
                    continue;
                }
                NGSegment seg = new NGSegment();
                NGItem    nit = new NGItem()
                {
                    Source = it
                };
                for (int j = i - 1; j >= 0; j--)
                {
                    it = s.Items[j];
                    if (it.Typ == SentItemType.Verb)
                    {
                        seg.BeforeVerb = it.Source as Pullenti.Ner.Core.VerbPhraseToken;
                        break;
                    }
                    if (it.Typ == SentItemType.Delim)
                    {
                        break;
                    }
                    if (it.CanBeCommaEnd)
                    {
                        if ((it.Source as Pullenti.Ner.Core.ConjunctionToken).Typ == Pullenti.Ner.Core.ConjunctionType.Comma)
                        {
                            nit.CommaBefore = true;
                        }
                        else
                        {
                            nit.AndBefore = true;
                            if ((it.Source as Pullenti.Ner.Core.ConjunctionToken).Typ == Pullenti.Ner.Core.ConjunctionType.Or)
                            {
                                nit.OrBefore = true;
                            }
                        }
                    }
                    if (it.Typ == SentItemType.Conj || it.CanBeNoun)
                    {
                        break;
                    }
                }
                bool comma = false;
                bool and   = false;
                bool or    = false;
                for (; i < s.Items.Count; i++)
                {
                    it = s.Items[i];
                    if (it.CanBeCommaEnd)
                    {
                        comma = false;
                        and   = false;
                        or    = false;
                        if ((it.Source as Pullenti.Ner.Core.ConjunctionToken).Typ == Pullenti.Ner.Core.ConjunctionType.Comma)
                        {
                            comma = true;
                        }
                        else
                        {
                            and = true;
                            if ((it.Source as Pullenti.Ner.Core.ConjunctionToken).Typ == Pullenti.Ner.Core.ConjunctionType.Or)
                            {
                                or = true;
                            }
                        }
                        if (seg.Items.Count > 0)
                        {
                            if (comma)
                            {
                                seg.Items[seg.Items.Count - 1].CommaAfter = true;
                            }
                            else
                            {
                                seg.Items[seg.Items.Count - 1].AndAfter = true;
                                if (or)
                                {
                                    seg.Items[seg.Items.Count - 1].OrAfter = true;
                                }
                            }
                        }
                        continue;
                    }
                    if (it.CanBeNoun || it.Typ == SentItemType.Adverb)
                    {
                        nit = new NGItem()
                        {
                            Source = it, CommaBefore = comma, AndBefore = and, OrBefore = or
                        };
                        seg.Items.Add(nit);
                        comma = false;
                        and   = false;
                        or    = false;
                    }
                    else if (it.Typ == SentItemType.Verb || it.Typ == SentItemType.Conj || it.Typ == SentItemType.Delim)
                    {
                        break;
                    }
                }
                for (int j = i; j < s.Items.Count; j++)
                {
                    it = s.Items[j];
                    if (it.Typ == SentItemType.Verb)
                    {
                        seg.AfterVerb = it.Source as Pullenti.Ner.Core.VerbPhraseToken;
                        break;
                    }
                    if ((it.Typ == SentItemType.Conj || it.CanBeNoun || it.Typ == SentItemType.Delim) || it.Typ == SentItemType.Adverb)
                    {
                        break;
                    }
                }
                res.Add(seg);
            }
            foreach (NGSegment ss in res)
            {
                ss.CreateLinks(false);
            }
            return(res);
        }