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