コード例 #1
0
        public List <Pullenti.Ner.Referent> TryAttachByReferent(Pullenti.Ner.Referent referent, IntOntologyItem item = null, bool mustBeSingle = false)
        {
            if (referent == null)
            {
                return(null);
            }
            if (item == null)
            {
                item = referent.CreateOntologyItem();
            }
            if (item == null)
            {
                return(null);
            }
            List <IntOntologyItem> li = this.TryAttachByItem(item);

            if (li == null)
            {
                return(null);
            }
            List <Pullenti.Ner.Referent> res = null;

            foreach (IntOntologyItem oi in li)
            {
                Pullenti.Ner.Referent r = oi.Referent ?? (oi.Tag as Pullenti.Ner.Referent);
                if (r != null)
                {
                    if (referent.CanBeEquals(r, ReferentsEqualType.WithinOneText))
                    {
                        if (res == null)
                        {
                            res = new List <Pullenti.Ner.Referent>();
                        }
                        if (!res.Contains(r))
                        {
                            res.Add(r);
                        }
                    }
                }
            }
            if (mustBeSingle)
            {
                if (res != null && res.Count > 1)
                {
                    for (int i = 0; i < (res.Count - 1); i++)
                    {
                        for (int j = i + 1; j < res.Count; j++)
                        {
                            if (!res[i].CanBeEquals(res[j], ReferentsEqualType.ForMerging))
                            {
                                return(null);
                            }
                        }
                    }
                }
            }
            return(res);
        }
コード例 #2
0
 internal bool ContainsRef(Pullenti.Ner.Referent r)
 {
     foreach (Pullenti.Ner.Slot s in Slots)
     {
         if (((s.TypeName == ATTR_REF || s.TypeName == ATTR_DELEGATE)) && (s.Value is Pullenti.Ner.Referent))
         {
             if (r == s.Value || r.CanBeEquals(s.Value as Pullenti.Ner.Referent, Pullenti.Ner.Core.ReferentsEqualType.WithinOneText))
             {
                 return(true);
             }
         }
     }
     return(false);
 }
コード例 #3
0
        public override bool CanBeEquals(Pullenti.Ner.Referent obj, Pullenti.Ner.Core.ReferentsEqualType typ = Pullenti.Ner.Core.ReferentsEqualType.WithinOneText)
        {
            KeywordReferent kw = obj as KeywordReferent;

            if (kw == null)
            {
                return(false);
            }
            KeywordType ki = Typ;

            if (ki != kw.Typ)
            {
                return(false);
            }
            if (ki == KeywordType.Referent)
            {
                Pullenti.Ner.Referent re = this.GetSlotValue(ATTR_REF) as Pullenti.Ner.Referent;
                if (re == null)
                {
                    return(false);
                }
                Pullenti.Ner.Referent re2 = kw.GetSlotValue(ATTR_REF) as Pullenti.Ner.Referent;
                if (re2 == null)
                {
                    return(false);
                }
                if (re.CanBeEquals(re2, typ))
                {
                    return(true);
                }
            }
            foreach (Pullenti.Ner.Slot s in Slots)
            {
                if (s.TypeName == ATTR_NORMAL || s.TypeName == ATTR_VALUE)
                {
                    if (kw.FindSlot(ATTR_NORMAL, s.Value, true) != null)
                    {
                        return(true);
                    }
                    if (kw.FindSlot(ATTR_VALUE, s.Value, true) != null)
                    {
                        return(true);
                    }
                }
            }
            return(false);
        }
コード例 #4
0
 internal void AddContact(Pullenti.Ner.Referent contact)
 {
     foreach (Pullenti.Ner.Slot s in Slots)
     {
         if (s.TypeName == ATTR_CONTACT)
         {
             Pullenti.Ner.Referent r = s.Value as Pullenti.Ner.Referent;
             if (r != null)
             {
                 if (r.CanBeGeneralFor(contact))
                 {
                     this.UploadSlot(s, contact);
                     return;
                 }
                 if (r.CanBeEquals(contact, Pullenti.Ner.Core.ReferentsEqualType.WithinOneText))
                 {
                     return;
                 }
             }
         }
     }
     this.AddSlot(ATTR_CONTACT, contact, false, 0);
 }
コード例 #5
0
        public override bool CanBeEquals(Pullenti.Ner.Referent obj, Pullenti.Ner.Core.ReferentsEqualType typ = Pullenti.Ner.Core.ReferentsEqualType.WithinOneText)
        {
            InstrumentParticipantReferent p = obj as InstrumentParticipantReferent;

            if (p == null)
            {
                return(false);
            }
            if (Typ != p.Typ)
            {
                return(false);
            }
            Pullenti.Ner.Referent re1 = this.GetSlotValue(ATTR_REF) as Pullenti.Ner.Referent;
            Pullenti.Ner.Referent re2 = obj.GetSlotValue(ATTR_REF) as Pullenti.Ner.Referent;
            if (re1 != null && re2 != null)
            {
                if (!re1.CanBeEquals(re2, typ))
                {
                    return(false);
                }
            }
            return(true);
        }
コード例 #6
0
        public override bool CanBeEquals(Pullenti.Ner.Referent obj, Pullenti.Ner.Core.ReferentsEqualType typ = Pullenti.Ner.Core.ReferentsEqualType.WithinOneText)
        {
            BankDataReferent bd = obj as BankDataReferent;

            if (bd == null)
            {
                return(false);
            }
            foreach (Pullenti.Ner.Slot s in Slots)
            {
                if (s.TypeName == ATTR_ITEM)
                {
                    Pullenti.Ner.Uri.UriReferent ur = s.Value as Pullenti.Ner.Uri.UriReferent;
                    string val = bd.FindValue(ur.Scheme);
                    if (val != null)
                    {
                        if (val != ur.Value)
                        {
                            return(false);
                        }
                    }
                }
                else if (s.TypeName == ATTR_BANK)
                {
                    Pullenti.Ner.Referent b1 = s.Value as Pullenti.Ner.Referent;
                    Pullenti.Ner.Referent b2 = bd.GetSlotValue(ATTR_BANK) as Pullenti.Ner.Referent;
                    if (b2 != null)
                    {
                        if (b1 != b2 && !b1.CanBeEquals(b2, Pullenti.Ner.Core.ReferentsEqualType.WithinOneText))
                        {
                            return(false);
                        }
                    }
                }
            }
            return(true);
        }
コード例 #7
0
        public override bool CanBeEquals(Pullenti.Ner.Referent obj, Pullenti.Ner.Core.ReferentsEqualType typ)
        {
            NamedEntityReferent ent = obj as NamedEntityReferent;

            if (ent == null)
            {
                return(false);
            }
            if (ent.Kind != Kind)
            {
                return(false);
            }
            List <string> names   = this.GetStringValues(ATTR_NAME);
            List <string> names2  = obj.GetStringValues(ATTR_NAME);
            bool          eqNames = false;

            if ((names != null && names.Count > 0 && names2 != null) && names2.Count > 0)
            {
                foreach (string n in names)
                {
                    if (names2.Contains(n))
                    {
                        eqNames = true;
                    }
                }
                if (!eqNames)
                {
                    return(false);
                }
            }
            List <string> typs   = this.GetStringValues(ATTR_TYPE);
            List <string> typs2  = obj.GetStringValues(ATTR_TYPE);
            bool          eqTyps = false;

            if ((typs != null && typs.Count > 0 && typs2 != null) && typs2.Count > 0)
            {
                foreach (string ty in typs)
                {
                    if (typs2.Contains(ty))
                    {
                        eqTyps = true;
                    }
                }
                if (!eqTyps)
                {
                    return(false);
                }
            }
            if (!eqTyps && !eqNames)
            {
                return(false);
            }
            Pullenti.Ner.Referent re1 = this.GetSlotValue(ATTR_REF) as Pullenti.Ner.Referent;
            Pullenti.Ner.Referent re2 = obj.GetSlotValue(ATTR_REF) as Pullenti.Ner.Referent;
            if (re1 != null && re2 != null)
            {
                if (!re1.CanBeEquals(re2, typ))
                {
                    return(false);
                }
            }
            else if (re1 != null || re2 != null)
            {
            }
            return(true);
        }
コード例 #8
0
        /// <summary>
        /// Зарегистрировать новую сущность или привязать к существующей сущности. Сущности, получаемые в ходе анализа,
        /// должны сохраняться через эту функцию. Именно здесь решается задача кореференции, то есть объединения
        /// сущностей, соответствующих одному и тому же объекту текста.
        /// </summary>
        /// <param name="referent">сохраняемая сущность</param>
        /// <return>этот же экземпляр referent или другой, если удалось объединиться с ранее выделенной сущностью</return>
        public virtual Pullenti.Ner.Referent RegisterReferent(Pullenti.Ner.Referent referent)
        {
            if (referent == null)
            {
                return(null);
            }
            if (referent.m_ExtReferents != null)
            {
                if (m_RegRefLevel > 2)
                {
                }
                else
                {
                    foreach (Pullenti.Ner.ReferentToken rt in referent.m_ExtReferents)
                    {
                        Pullenti.Ner.Referent oldRef = rt.Referent;
                        m_RegRefLevel++;
                        rt.SaveToLocalOntology();
                        m_RegRefLevel--;
                        if (oldRef == rt.Referent || rt.Referent == null)
                        {
                            continue;
                        }
                        foreach (Pullenti.Ner.Slot s in referent.Slots)
                        {
                            if (s.Value == oldRef)
                            {
                                referent.UploadSlot(s, rt.Referent);
                            }
                        }
                        if (referent.m_ExtReferents != null)
                        {
                            foreach (Pullenti.Ner.ReferentToken rtt in referent.m_ExtReferents)
                            {
                                foreach (Pullenti.Ner.Slot s in rtt.Referent.Slots)
                                {
                                    if (s.Value == oldRef)
                                    {
                                        referent.UploadSlot(s, rt.Referent);
                                    }
                                }
                            }
                        }
                    }
                    referent.m_ExtReferents = null;
                }
            }
            List <Pullenti.Ner.Referent> eq = null;

            if (m_Referents.Contains(referent))
            {
                return(referent);
            }
            for (int i = m_Referents.Count - 1; i >= 0 && ((m_Referents.Count - i) < 1000); i--)
            {
                Pullenti.Ner.Referent p = m_Referents[i];
                if (p.CanBeEquals(referent, ReferentsEqualType.WithinOneText))
                {
                    if (!p.CanBeGeneralFor(referent) && !referent.CanBeGeneralFor(p))
                    {
                        if (eq == null)
                        {
                            eq = new List <Pullenti.Ner.Referent>();
                        }
                        eq.Add(p);
                    }
                }
            }
            if (eq != null)
            {
                if (eq.Count == 1)
                {
                    eq[0].MergeSlots(referent, true);
                    return(eq[0]);
                }
                if (eq.Count > 1)
                {
                    foreach (Pullenti.Ner.Referent e in eq)
                    {
                        if (e.Slots.Count != referent.Slots.Count)
                        {
                            continue;
                        }
                        bool ok = true;
                        foreach (Pullenti.Ner.Slot s in referent.Slots)
                        {
                            if (e.FindSlot(s.TypeName, s.Value, true) == null)
                            {
                                ok = false;
                                break;
                            }
                        }
                        if (ok)
                        {
                            foreach (Pullenti.Ner.Slot s in e.Slots)
                            {
                                if (referent.FindSlot(s.TypeName, s.Value, true) == null)
                                {
                                    ok = false;
                                    break;
                                }
                            }
                        }
                        if (ok)
                        {
                            return(e);
                        }
                    }
                }
            }
            m_Referents.Add(referent);
            return(referent);
        }