public override Pullenti.Ner.Referent RegisterReferent(Pullenti.Ner.Referent referent) { Pullenti.Ner.Referent res; List <Pullenti.Ner.Referent> li = LocalOntology.TryAttachByReferent(referent, null, true); if (li != null) { for (int i = li.Count - 1; i >= 0; i--) { if (li[i].CanBeGeneralFor(referent) || referent.CanBeGeneralFor(li[i])) { li.RemoveAt(i); } } } if (li != null && li.Count > 0) { res = li[0]; if (res != referent) { res.MergeSlots(referent, true); } if (li.Count > 1 && Kit != null) { for (int i = 1; i < li.Count; i++) { li[0].MergeSlots(li[i], true); foreach (Pullenti.Ner.TextAnnotation ta in li[i].Occurrence) { li[0].AddOccurence(ta); } Kit.ReplaceReferent(li[i], li[0]); LocalOntology.Remove(li[i]); } } if (res.m_ExtReferents != null) { res = base.RegisterReferent(res); } LocalOntology.AddReferent(res); return(res); } res = base.RegisterReferent(referent); if (res == null) { return(null); } LocalOntology.AddReferent(res); return(res); }
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); }
/// <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); }