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