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)); }
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); }
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; } } } } } }
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); }
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); }