static bool canBeRef(NamedEntityKind ki, Pullenti.Ner.Referent re) { if (re == null) { return(false); } if (ki == NamedEntityKind.Monument) { if (re.TypeName == "PERSON" || re.TypeName == "PERSONPROPERTY") { return(true); } } else if (ki == NamedEntityKind.Location) { if (re is Pullenti.Ner.Geo.GeoReferent) { Pullenti.Ner.Geo.GeoReferent geo = re as Pullenti.Ner.Geo.GeoReferent; if (geo.IsRegion || geo.IsState) { return(true); } } } else if (ki == NamedEntityKind.Building) { if (re.TypeName == "ORGANIZATION") { return(true); } } return(false); }
static Pullenti.Ner.ReferentToken _tryAttach(List <Pullenti.Ner.Named.Internal.NamedItemToken> toks) { Pullenti.Ner.Named.Internal.NamedItemToken typ = null; Pullenti.Ner.Named.Internal.NamedItemToken re = null; List <Pullenti.Ner.Named.Internal.NamedItemToken> nams = null; NamedEntityKind ki = NamedEntityKind.Undefined; int i; for (i = 0; i < toks.Count; i++) { if (toks[i].TypeValue != null) { if (nams != null && toks[i].NameValue != null) { break; } if (typ == null) { typ = toks[i]; ki = typ.Kind; } else if (typ.Kind != toks[i].Kind) { break; } } if (toks[i].NameValue != null) { if (typ != null && toks[i].Kind != NamedEntityKind.Undefined && toks[i].Kind != typ.Kind) { break; } if (nams == null) { nams = new List <Pullenti.Ner.Named.Internal.NamedItemToken>(); } else if (nams[0].IsWellknown != toks[i].IsWellknown) { break; } if (ki == NamedEntityKind.Undefined) { ki = toks[i].Kind; } nams.Add(toks[i]); } if (toks[i].TypeValue == null && toks[i].NameValue == null) { break; } if (re == null && canBeRef(ki, toks[i].Ref)) { re = toks[i]; } } if ((i < toks.Count) && toks[i].Ref != null) { if (canBeRef(ki, toks[i].Ref)) { re = toks[i]; i++; } } bool ok = false; if (typ != null) { if (nams == null) { if (re == null) { ok = false; } else { ok = true; } } else if ((nams[0].BeginChar < typ.EndChar) && !nams[0].IsWellknown) { if (re != null) { ok = true; } else if ((nams[0].Chars.IsCapitalUpper && !Pullenti.Ner.Core.MiscHelper.CanBeStartOfSentence(nams[0].BeginToken) && typ.Morph.Number != Pullenti.Morph.MorphNumber.Plural) && typ.Morph.Case.IsNominative) { ok = true; } } else { ok = true; } } else if (nams != null) { if (nams.Count == 1 && nams[0].Chars.IsAllLower) { } else if (nams[0].IsWellknown) { ok = true; } } if (!ok || ki == NamedEntityKind.Undefined) { return(null); } NamedEntityReferent nam = new NamedEntityReferent() { Kind = ki }; if (typ != null) { nam.AddSlot(NamedEntityReferent.ATTR_TYPE, typ.TypeValue.ToLower(), false, 0); } if (nams != null) { if (nams.Count == 1 && nams[0].IsWellknown && nams[0].TypeValue != null) { nam.AddSlot(NamedEntityReferent.ATTR_TYPE, nams[0].TypeValue.ToLower(), false, 0); } if (typ != null && (typ.EndChar < nams[0].BeginChar)) { string str = Pullenti.Ner.Core.MiscHelper.GetTextValue(nams[0].BeginToken, nams[nams.Count - 1].EndToken, Pullenti.Ner.Core.GetTextAttr.No); nam.AddSlot(NamedEntityReferent.ATTR_NAME, str, false, 0); } StringBuilder tmp = new StringBuilder(); foreach (Pullenti.Ner.Named.Internal.NamedItemToken n in nams) { if (tmp.Length > 0) { tmp.Append(' '); } tmp.Append(n.NameValue); } nam.AddSlot(NamedEntityReferent.ATTR_NAME, tmp.ToString(), false, 0); } if (re != null) { nam.AddSlot(NamedEntityReferent.ATTR_REF, re.Ref, false, 0); } return(new Pullenti.Ner.ReferentToken(nam, toks[0].BeginToken, toks[i - 1].EndToken)); }