コード例 #1
0
        public static bool CheckKeyword(Pullenti.Ner.Measure.MeasureKind ki, Pullenti.Ner.Token t)
        {
            if (t == null || ki == Pullenti.Ner.Measure.MeasureKind.Undefined)
            {
                return(false);
            }
            if (t is Pullenti.Ner.MetaToken)
            {
                for (Pullenti.Ner.Token tt = (t as Pullenti.Ner.MetaToken).BeginToken; tt != null && tt.EndChar <= t.EndChar; tt = tt.Next)
                {
                    if (CheckKeyword(ki, tt))
                    {
                        return(true);
                    }
                }
                return(false);
            }
            if (!(t is Pullenti.Ner.TextToken))
            {
                return(false);
            }
            string term = t.GetNormalCaseText(Pullenti.Morph.MorphClass.Noun, Pullenti.Morph.MorphNumber.Singular, Pullenti.Morph.MorphGender.Undefined, false);

            foreach (Unit u in Units)
            {
                if (u.Kind == ki)
                {
                    if (u.Keywords.Contains(term))
                    {
                        return(true);
                    }
                }
            }
            if (m_KindsKeywords.ContainsKey(ki))
            {
                if (m_KindsKeywords[ki].Contains(term))
                {
                    return(true);
                }
            }
            return(false);
        }
コード例 #2
0
        void _calcGenetive()
        {
            if (!From.Source.CanBeNoun)
            {
                return;
            }
            if (From.Source.Typ == SentItemType.Formula)
            {
                if (To.Source.Typ != SentItemType.Noun)
                {
                    return;
                }
                Coef = Pullenti.Semantic.SemanticService.Params.TransitiveCoef;
                return;
            }
            Pullenti.Ner.MorphCollection frmorph = FromMorph;
            if (To.Source.Typ == SentItemType.Formula)
            {
                if (From.Source.Typ != SentItemType.Noun)
                {
                    return;
                }
                if (frmorph.Case.IsGenitive)
                {
                    Coef = Pullenti.Semantic.SemanticService.Params.TransitiveCoef;
                }
                else if (frmorph.Case.IsUndefined)
                {
                    Coef = 0;
                }
                return;
            }
            if (From.Source.Source is Pullenti.Ner.Measure.Internal.NumbersWithUnitToken)
            {
                if (From.Order != (To.Order + 1))
                {
                    return;
                }
                Pullenti.Ner.Measure.Internal.NumbersWithUnitToken num = From.Source.Source as Pullenti.Ner.Measure.Internal.NumbersWithUnitToken;
                Pullenti.Ner.Measure.MeasureKind ki = Pullenti.Ner.Measure.Internal.UnitToken.CalcKind(num.Units);
                if (ki != Pullenti.Ner.Measure.MeasureKind.Undefined)
                {
                    if (Pullenti.Ner.Measure.Internal.UnitsHelper.CheckKeyword(ki, To.Source.Source))
                    {
                        Coef = Pullenti.Semantic.SemanticService.Params.NextModel * 3;
                        return;
                    }
                }
                if (To.Source.Source is Pullenti.Ner.Measure.Internal.NumbersWithUnitToken)
                {
                    return;
                }
            }
            bool nonGenText = false;

            if (string.IsNullOrEmpty(FromPrep) && !(From.Source.Source is Pullenti.Ner.Core.VerbPhraseToken))
            {
                if (From.Order != (To.Order + 1))
                {
                    nonGenText = true;
                }
            }
            if (To.Source.DrGroups != null)
            {
                foreach (Pullenti.Semantic.Utils.DerivateGroup gr in To.Source.DrGroups)
                {
                    if (gr.Cm.Transitive && string.IsNullOrEmpty(FromPrep))
                    {
                        bool ok = false;
                        if (To.Source.Source is Pullenti.Ner.Core.VerbPhraseToken)
                        {
                            if (frmorph.Case.IsAccusative)
                            {
                                ok           = true;
                                CanBePacient = true;
                            }
                        }
                        else if (frmorph.Case.IsGenitive && From.Order == (To.Order + 1))
                        {
                            ok = true;
                        }
                        if (ok)
                        {
                            Coef = Pullenti.Semantic.SemanticService.Params.TransitiveCoef;
                            return;
                        }
                    }
                    if (((gr.Cm.Questions & Pullenti.Semantic.Utils.QuestionType.WhatToDo)) != Pullenti.Semantic.Utils.QuestionType.Undefined && (From.Source.Source is Pullenti.Ner.Core.VerbPhraseToken))
                    {
                        Coef = Pullenti.Semantic.SemanticService.Params.TransitiveCoef;
                        return;
                    }
                    if (gr.Cm.Nexts != null)
                    {
                        if (gr.Cm.Nexts.ContainsKey(FromPrep))
                        {
                            Pullenti.Morph.MorphCase cas = gr.Cm.Nexts[FromPrep];
                            if (!((cas & frmorph.Case)).IsUndefined)
                            {
                                if (string.IsNullOrEmpty(FromPrep) && From.Order != (To.Order + 1) && ((cas & frmorph.Case)).IsGenitive)
                                {
                                }
                                else
                                {
                                    Coef = Pullenti.Semantic.SemanticService.Params.NextModel;
                                    return;
                                }
                            }
                        }
                    }
                }
            }
            if (nonGenText || !string.IsNullOrEmpty(FromPrep))
            {
                return;
            }
            Pullenti.Morph.MorphCase cas0 = frmorph.Case;
            if (cas0.IsGenitive || cas0.IsInstrumental || cas0.IsDative)
            {
                if ((To.Source.Source is Pullenti.Ner.Measure.Internal.NumbersWithUnitToken) && cas0.IsGenitive)
                {
                    Coef = Pullenti.Semantic.SemanticService.Params.TransitiveCoef;
                }
                else
                {
                    Coef = Pullenti.Semantic.SemanticService.Params.NgLink;
                    if (cas0.IsNominative || From.Source.Typ == SentItemType.PartBefore)
                    {
                        Coef /= 2;
                    }
                    if (!cas0.IsGenitive)
                    {
                        Coef /= 2;
                    }
                }
            }
            else if (From.Source.Source is Pullenti.Ner.Core.VerbPhraseToken)
            {
                Coef = 0.1;
            }
            if ((To.Source.Source is Pullenti.Ner.Measure.Internal.NumbersWithUnitToken) && To.Source.EndToken.IsValue("ЧЕМ", null))
            {
                Coef = Pullenti.Semantic.SemanticService.Params.TransitiveCoef * 2;
            }
        }
コード例 #3
0
        public List <Pullenti.Ner.ReferentToken> CreateRefenetsTokensWithRegister(Pullenti.Ner.Core.AnalyzerData ad, string name, bool regist = true)
        {
            if (name == "T =")
            {
                name = "ТЕМПЕРАТУРА";
            }
            List <Pullenti.Ner.ReferentToken> res = new List <Pullenti.Ner.ReferentToken>();

            foreach (UnitToken u in Units)
            {
                Pullenti.Ner.ReferentToken rt = new Pullenti.Ner.ReferentToken(u.CreateReferentWithRegister(ad), u.BeginToken, u.EndToken);
                res.Add(rt);
            }
            Pullenti.Ner.Measure.MeasureReferent mr = new Pullenti.Ner.Measure.MeasureReferent();
            string templ = "1";

            if (SingleVal != null)
            {
                mr.AddValue(SingleVal.Value);
                if (PlusMinus != null)
                {
                    templ = string.Format("[1 ±2{0}]", (PlusMinusPercent ? "%" : ""));
                    mr.AddValue(PlusMinus.Value);
                }
                else if (About)
                {
                    templ = "~1";
                }
            }
            else
            {
                if (Not && ((FromVal == null || ToVal == null)))
                {
                    bool b = FromInclude;
                    FromInclude = ToInclude;
                    ToInclude   = b;
                    double?v = FromVal;
                    FromVal = ToVal;
                    ToVal   = v;
                }
                int num = 1;
                if (FromVal != null)
                {
                    mr.AddValue(FromVal.Value);
                    templ = (FromInclude ? "[1" : "]1");
                    num++;
                }
                else
                {
                    templ = "]";
                }
                if (ToVal != null)
                {
                    mr.AddValue(ToVal.Value);
                    templ = string.Format("{0} .. {1}{2}", templ, num, (ToInclude ? ']' : '['));
                }
                else
                {
                    templ += " .. [";
                }
            }
            mr.Template = templ;
            foreach (Pullenti.Ner.ReferentToken rt in res)
            {
                mr.AddSlot(Pullenti.Ner.Measure.MeasureReferent.ATTR_UNIT, rt.Referent, false, 0);
            }
            if (name != null)
            {
                mr.AddSlot(Pullenti.Ner.Measure.MeasureReferent.ATTR_NAME, name, false, 0);
            }
            if (DivNum != null)
            {
                List <Pullenti.Ner.ReferentToken> dn = DivNum.CreateRefenetsTokensWithRegister(ad, null, true);
                res.AddRange(dn);
                mr.AddSlot(Pullenti.Ner.Measure.MeasureReferent.ATTR_REF, dn[dn.Count - 1].Referent, false, 0);
            }
            Pullenti.Ner.Measure.MeasureKind ki = UnitToken.CalcKind(Units);
            if (ki != Pullenti.Ner.Measure.MeasureKind.Undefined)
            {
                mr.Kind = ki;
            }
            if (regist && ad != null)
            {
                mr = ad.RegisterReferent(mr) as Pullenti.Ner.Measure.MeasureReferent;
            }
            res.Add(new Pullenti.Ner.ReferentToken(mr, BeginToken, EndToken));
            return(res);
        }