Ejemplo n.º 1
0
 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);
 }
Ejemplo n.º 2
0
        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));
        }