コード例 #1
0
        public string GetNormValues()
        {
            List <Pullenti.Ner.ReferentToken> li = this.CreateRefenetsTokensWithRegister(null, false);

            if (li == null || (li.Count < 1))
            {
                return(null);
            }
            Pullenti.Ner.Measure.MeasureReferent mr = li[li.Count - 1].Referent as Pullenti.Ner.Measure.MeasureReferent;
            if (mr == null)
            {
                return(null);
            }
            return(mr.ToString(true, null, 0));
        }
コード例 #2
0
        public static Pullenti.Semantic.SemObject CreateNumber(Pullenti.Semantic.SemGraph gr, Pullenti.Ner.Measure.Internal.NumbersWithUnitToken num)
        {
            List <Pullenti.Ner.ReferentToken> rs = num.CreateRefenetsTokensWithRegister(null, null, false);

            if (rs == null || rs.Count == 0)
            {
                return(null);
            }
            Pullenti.Ner.Measure.MeasureReferent mr  = rs[rs.Count - 1].Referent as Pullenti.Ner.Measure.MeasureReferent;
            Pullenti.Semantic.SemObject          sem = new Pullenti.Semantic.SemObject(gr);
            gr.Objects.Add(sem);
            sem.Tokens.Add(num);
            sem.Morph.NormalFull = (sem.Morph.NormalCase = mr.ToString(true, null, 0));
            sem.Typ     = Pullenti.Semantic.SemObjectType.Noun;
            sem.Measure = mr.Kind;
            for (int i = 0; i < sem.Morph.NormalCase.Length; i++)
            {
                char ch = sem.Morph.NormalCase[i];
                if (char.IsDigit(ch) || char.IsWhiteSpace(ch) || "[].+-".IndexOf(ch) >= 0)
                {
                    continue;
                }
                sem.Quantity         = new Pullenti.Semantic.SemQuantity(sem.Morph.NormalCase.Substring(0, i).Trim(), num.BeginToken, num.EndToken);
                sem.Morph.NormalCase = sem.Morph.NormalCase.Substring(i).Trim();
                if (num.Units.Count == 1 && num.Units[0].Unit != null)
                {
                    sem.Morph.NormalFull = num.Units[0].Unit.FullnameCyr;
                    if (sem.Morph.NormalFull == "%")
                    {
                        sem.Morph.NormalFull = "процент";
                    }
                }
                break;
            }
            sem.Concept = mr;
            return(sem);
        }
コード例 #3
0
        void _checkDoubt()
        {
            IsDoubt = false;
            if (Pow != 1)
            {
                return;
            }
            if (BeginToken.LengthChar < 3)
            {
                IsDoubt = true;
                if ((BeginToken.Chars.IsCapitalUpper || BeginToken.Chars.IsAllUpper || BeginToken.Chars.IsLastLower) || BeginToken.Chars.IsAllLower)
                {
                }
                else if (Unit.Psevdo.Count > 0)
                {
                }
                else
                {
                    IsDoubt = false;
                }
            }
            int cou = 0;

            for (Pullenti.Ner.Token t = BeginToken.Previous; t != null && (cou < 30); t = t.Previous, cou++)
            {
                Pullenti.Ner.Measure.MeasureReferent mr = t.GetReferent() as Pullenti.Ner.Measure.MeasureReferent;
                if (mr != null)
                {
                    foreach (Pullenti.Ner.Slot s in mr.Slots)
                    {
                        if (s.Value is Pullenti.Ner.Measure.UnitReferent)
                        {
                            Pullenti.Ner.Measure.UnitReferent ur = s.Value as Pullenti.Ner.Measure.UnitReferent;
                            for (Unit u = Unit; u != null; u = u.BaseUnit)
                            {
                                if (ur.FindSlot(Pullenti.Ner.Measure.UnitReferent.ATTR_NAME, u.NameCyr, true) != null)
                                {
                                    IsDoubt = false;
                                }
                                else if (Unit.Psevdo.Count > 0)
                                {
                                    foreach (Unit uu in Unit.Psevdo)
                                    {
                                        if (ur.FindSlot(Pullenti.Ner.Measure.UnitReferent.ATTR_NAME, uu.NameCyr, true) != null)
                                        {
                                            Unit    = uu;
                                            IsDoubt = false;
                                            return;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                if (!(t is Pullenti.Ner.TextToken) || (t.LengthChar < 3))
                {
                    continue;
                }
                for (Unit u = Unit; u != null; u = u.BaseUnit)
                {
                    foreach (string k in u.Keywords)
                    {
                        if (t.IsValue(k, null))
                        {
                            Keyword = t;
                            IsDoubt = false;
                            return;
                        }
                    }
                    foreach (Unit uu in u.Psevdo)
                    {
                        foreach (string k in uu.Keywords)
                        {
                            if (t.IsValue(k, null))
                            {
                                Unit    = uu;
                                Keyword = t;
                                IsDoubt = false;
                                return;
                            }
                        }
                    }
                }
            }
        }
コード例 #4
0
        public List <Pullenti.Ner.ReferentToken> CreateRefenetsTokensWithRegister(Pullenti.Ner.Core.AnalyzerData ad, bool register = true)
        {
            if (Internals.Count == 0 && !Reliable)
            {
                if (Nums.Units.Count == 1 && Nums.Units[0].IsDoubt)
                {
                    if (Nums.Units[0].UnknownName != null)
                    {
                    }
                    else if (Nums.IsNewlineBefore)
                    {
                    }
                    else if (Nums.Units[0].BeginToken.LengthChar > 1 && Nums.Units[0].BeginToken.GetMorphClassInDictionary().IsUndefined)
                    {
                    }
                    else if (Nums.FromVal == null || Nums.ToVal == null)
                    {
                        return(null);
                    }
                }
            }
            List <Pullenti.Ner.ReferentToken> res = new List <Pullenti.Ner.ReferentToken>();

            if (((Nums == null || Nums.PlusMinusPercent)) && Internals.Count > 0)
            {
                List <Pullenti.Ner.ReferentToken> liEx = null;
                if (InternalEx != null)
                {
                    liEx = InternalEx.CreateRefenetsTokensWithRegister(ad, true);
                    if (liEx != null)
                    {
                        res.AddRange(liEx);
                    }
                }
                Pullenti.Ner.Measure.MeasureReferent mr = new Pullenti.Ner.Measure.MeasureReferent();
                string templ0 = "1";
                string templ  = null;
                if (Name != null)
                {
                    mr.AddSlot(Pullenti.Ner.Measure.MeasureReferent.ATTR_NAME, Name, false, 0);
                }
                List <Pullenti.Ner.Measure.MeasureReferent> ints = new List <Pullenti.Ner.Measure.MeasureReferent>();
                for (int k = 0; k < Internals.Count; k++)
                {
                    MeasureToken ii = Internals[k];
                    ii.Reliable = true;
                    List <Pullenti.Ner.ReferentToken> li = ii.CreateRefenetsTokensWithRegister(ad, false);
                    if (li == null)
                    {
                        continue;
                    }
                    res.AddRange(li);
                    Pullenti.Ner.Measure.MeasureReferent mr0 = res[res.Count - 1].Referent as Pullenti.Ner.Measure.MeasureReferent;
                    if (liEx != null)
                    {
                        mr0.AddSlot(Pullenti.Ner.Measure.MeasureReferent.ATTR_REF, liEx[liEx.Count - 1], false, 0);
                    }
                    if (k == 0 && !IsEmpty)
                    {
                        templ0       = mr0.Template;
                        mr0.Template = "1";
                    }
                    if (ad != null)
                    {
                        mr0 = ad.RegisterReferent(mr0) as Pullenti.Ner.Measure.MeasureReferent;
                    }
                    mr.AddSlot(Pullenti.Ner.Measure.MeasureReferent.ATTR_VALUE, mr0, false, 0);
                    ints.Add(mr0);
                    if (templ == null)
                    {
                        templ = "1";
                    }
                    else
                    {
                        int nu = mr.GetStringValues(Pullenti.Ner.Measure.MeasureReferent.ATTR_VALUE).Count;
                        templ = string.Format("{0}{1}{2}", templ, (IsSet ? ", " : " × "), nu);
                    }
                }
                if (IsSet)
                {
                    templ = "{" + templ + "}";
                }
                if (templ0 != "1")
                {
                    templ = templ0.Replace("1", templ);
                }
                if (Nums != null && Nums.PlusMinusPercent && Nums.SingleVal != null)
                {
                    templ = string.Format("[{0} ±{1}%]", templ, Internals.Count + 1);
                    mr.AddValue(Nums.SingleVal.Value);
                }
                mr.Template = templ;
                int  i;
                bool hasLength = false;
                Pullenti.Ner.Measure.UnitReferent uref = null;
                for (i = 0; i < ints.Count; i++)
                {
                    if (ints[i].Kind == Pullenti.Ner.Measure.MeasureKind.Length)
                    {
                        hasLength = true;
                        uref      = ints[i].GetSlotValue(Pullenti.Ner.Measure.MeasureReferent.ATTR_UNIT) as Pullenti.Ner.Measure.UnitReferent;
                    }
                    else if (ints[i].Units.Count > 0)
                    {
                        break;
                    }
                }
                if (ints.Count > 1 && hasLength && uref != null)
                {
                    foreach (Pullenti.Ner.Measure.MeasureReferent ii in ints)
                    {
                        if (ii.FindSlot(Pullenti.Ner.Measure.MeasureReferent.ATTR_UNIT, null, true) == null)
                        {
                            ii.AddSlot(Pullenti.Ner.Measure.MeasureReferent.ATTR_UNIT, uref, false, 0);
                            ii.Kind = Pullenti.Ner.Measure.MeasureKind.Length;
                        }
                    }
                }
                if (ints.Count == 3)
                {
                    if (ints[0].Kind == Pullenti.Ner.Measure.MeasureKind.Length && ints[1].Kind == Pullenti.Ner.Measure.MeasureKind.Length && ints[2].Kind == Pullenti.Ner.Measure.MeasureKind.Length)
                    {
                        mr.Kind = Pullenti.Ner.Measure.MeasureKind.Volume;
                    }
                    else if (ints[0].Units.Count == 0 && ints[1].Units.Count == 0 && ints[2].Units.Count == 0)
                    {
                        string nam = mr.GetStringValue(Pullenti.Ner.Measure.MeasureReferent.ATTR_NAME);
                        if (nam != null)
                        {
                            if (nam.Contains("РАЗМЕР") || nam.Contains("ГАБАРИТ"))
                            {
                                mr.Kind = Pullenti.Ner.Measure.MeasureKind.Volume;
                            }
                        }
                    }
                }
                if (ints.Count == 2)
                {
                    if (ints[0].Kind == Pullenti.Ner.Measure.MeasureKind.Length && ints[1].Kind == Pullenti.Ner.Measure.MeasureKind.Length)
                    {
                        mr.Kind = Pullenti.Ner.Measure.MeasureKind.Area;
                    }
                }
                if (!IsEmpty)
                {
                    if (ad != null)
                    {
                        mr = ad.RegisterReferent(mr) as Pullenti.Ner.Measure.MeasureReferent;
                    }
                    res.Add(new Pullenti.Ner.ReferentToken(mr, BeginToken, EndToken));
                }
                return(res);
            }
            List <Pullenti.Ner.ReferentToken> re2 = Nums.CreateRefenetsTokensWithRegister(ad, Name, register);

            foreach (MeasureToken ii in Internals)
            {
                List <Pullenti.Ner.ReferentToken> li = ii.CreateRefenetsTokensWithRegister(ad, true);
                if (li == null)
                {
                    continue;
                }
                res.AddRange(li);
                re2[re2.Count - 1].Referent.AddSlot(Pullenti.Ner.Measure.MeasureReferent.ATTR_REF, res[res.Count - 1].Referent, false, 0);
            }
            re2[re2.Count - 1].BeginToken = BeginToken;
            re2[re2.Count - 1].EndToken   = EndToken;
            res.AddRange(re2);
            return(res);
        }
コード例 #5
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);
        }