/// <summary> /// Merges the specified entities into a single entity with the specified confidence. /// </summary> /// <param name="firstEntity"> /// The first entity. /// </param> /// <param name="secondEntity"> /// The second entity. /// </param> /// <param name="confidence"> /// The confidence. /// </param> public virtual void MergeEntities(DiscourseEntity firstEntity, DiscourseEntity secondEntity, float confidence) { foreach (var mc in secondEntity.Mentions) { firstEntity.AddMention(mc); } mEntities.Remove(secondEntity); }
private static string ShowEntities(DiscourseEntity[] entities) { var output = new StringBuilder(); for (int currentEntity = 0; currentEntity < entities.Length; currentEntity++) { output.Append(currentEntity + " " + entities[currentEntity]).Append("\r\n"); } return output.ToString(); }
/// <summary> /// Merges the specified entities into a single entity with the specified confidence. /// </summary> /// <param name="firstEntity"> /// The first entity. /// </param> /// <param name="secondEntity"> /// The second entity. /// </param> /// <param name="confidence"> /// The confidence. /// </param> public virtual void MergeEntities(DiscourseEntity firstEntity, DiscourseEntity secondEntity, float confidence) { foreach (Mention.MentionContext mc in secondEntity.Mentions) { firstEntity.AddMention(mc); } //System.err.println("DiscourseModel.mergeEntities: removing "+e2); mEntities.Remove(secondEntity); }
/// <summary> /// Removes the specified mention to an entity in the specified discourse model or creates a new entity for the mention. /// </summary> /// <param name="mention"> /// The mention to resolve. /// </param> /// <param name="discourseModel"> /// The discourse model of existing entities. /// </param> protected internal virtual void Resolve(MentionContext mention, DiscourseModel discourseModel) { //System.err.println("AbstractLinker.resolve: "+mode+"("+econtext.id+") "+econtext.toText()); bool validEntity = true; // true if we should add this entity to the dm bool canResolve = false; for (int currentResolver = 0; currentResolver < mResolvers.Length; currentResolver++) { if (mResolvers[currentResolver].CanResolve(mention)) { if (mMode == LinkerMode.Test) { mEntities[currentResolver] = mResolvers[currentResolver].Resolve(mention, discourseModel); canResolve = true; } else if (mMode == LinkerMode.Train) { mEntities[currentResolver] = mResolvers[currentResolver].Retain(mention, discourseModel); if (currentResolver + 1 != mResolvers.Length) { canResolve = true; } } else if (mMode == LinkerMode.Eval) { mEntities[currentResolver] = mResolvers[currentResolver].Retain(mention, discourseModel); //DiscourseEntity rde = resolvers[ri].resolve(mention, discourseModel); //eval.update(rde == entities[ri], ri, entities[ri], rde); } else { System.Console.Error.WriteLine("AbstractLinker.Unknown mode: " + mMode); } if (currentResolver == mSingularPronounIndex && mEntities[currentResolver] == null) { validEntity = false; } } else { mEntities[currentResolver] = null; } } if (!canResolve && mRemoveUnresolvedMentions) { //System.err.println("No resolver for: "+econtext.toText()+ " head="+econtext.headTokenText+" "+econtext.headTokenTag); validEntity = false; } DiscourseEntity discourseEntity = CheckForMerges(discourseModel, mEntities); if (validEntity) { UpdateExtent(discourseModel, mention, discourseEntity, mUseDiscourseModel); } }
/// <summary> /// Indicates that the specified entity has been mentioned.</summary> /// <param name="entity"> /// The entity which has been mentioned. /// </param> public virtual void MentionEntity(DiscourseEntity entity) { bool isContained; isContained = mEntities.Contains(entity); mEntities.Remove(entity); if (isContained) { mEntities.Insert(0, entity); } else { throw new InvalidOperationException("DiscourseModel.MentionEntity: failed to remove " + entity); } }
/// <summary> /// Creates a new linker with the specified model directory, running in the specified mode which uses a discourse model /// based on the specified parameter and uses the specified fixed non-referential probability. /// </summary> /// <param name="modelDirectory"> /// The directory where the models for this linker are kept. /// </param> /// <param name="mode"> /// The mode that this linker is running in. /// </param> /// <param name="useDiscourseModel"> /// Whether the model should use a discourse model or not. /// </param> /// <param name="fixedNonReferentialProbability"> /// The probability which resolvers are required to exceed to posit a coreference relationship. /// </param> public DefaultLinker(string modelDirectory, LinkerMode mode, bool useDiscourseModel, double fixedNonReferentialProbability) : base(modelDirectory, mode, useDiscourseModel) { if (mode != LinkerMode.Sim) { mCompatibilityModel = new MaximumEntropyCompatibilityModel(CoreferenceProjectName); } InitializeHeaderFinder(); InitializeMentionFinder(); if (mode != LinkerMode.Sim) { InitializeResolvers(mode, fixedNonReferentialProbability); Entities = new DiscourseEntity[Resolvers.Length]; } }
/// <summary> /// Indicates that the specified entity has been mentioned.</summary> /// <param name="entity"> /// The entity which has been mentioned. /// </param> public virtual void MentionEntity(DiscourseEntity entity) { bool isContained; isContained = mEntities.Contains(entity); mEntities.Remove(entity); if (isContained) { mEntities.Insert(0, entity); } else { throw new InvalidOperationException("DiscourseModel.MentionEntity: failed to remove " + entity); } }
/// <summary> /// Updates the specified discourse model with the specified mention as coreferent with the specified entity. /// </summary> /// <param name="discourseModel"> /// The discourse model /// </param> /// <param name="mention"> /// The mention to be added to the specified entity. /// </param> /// <param name="entity"> /// The entity which is mentioned by the specified mention. /// </param> /// <param name="useDiscourseModel"> /// Whether the mentions should be kept as an entiy or simply co-indexed. /// </param> protected internal virtual void UpdateExtent(DiscourseModel discourseModel, MentionContext mention, DiscourseEntity entity, bool useDiscourseModel) { if (useDiscourseModel) { if (entity != null) { //System.err.println("AbstractLinker.updateExtent: addingExtent: // "+econtext.toText()); if (entity.GenderProbability < mention.GenderProbability) { entity.Gender = mention.GetGender(); entity.GenderProbability = mention.GenderProbability; } if (entity.NumberProbability < mention.NumberProbability) { entity.Number = mention.GetNumber(); entity.NumberProbability = mention.NumberProbability; } entity.AddMention(mention); discourseModel.MentionEntity(entity); } else { //System.err.println("AbstractLinker.updateExtent: creatingExtent: // "+econtext.toText()+" "+econtext.gender+" "+econtext.number); entity = new DiscourseEntity(mention, mention.GetGender(), mention.GenderProbability, mention.GetNumber(), mention.NumberProbability); discourseModel.AddEntity(entity); } } else { if (entity != null) { DiscourseEntity newEntity = new DiscourseEntity(mention, mention.GetGender(), mention.GenderProbability, mention.GetNumber(), mention.NumberProbability); discourseModel.AddEntity(newEntity); newEntity.Id = entity.Id; } else { DiscourseEntity newEntity = new DiscourseEntity(mention, mention.GetGender(), mention.GenderProbability, mention.GetNumber(), mention.NumberProbability); discourseModel.AddEntity(newEntity); } } //System.err.println(de1); }
protected internal virtual DiscourseEntity CheckForMerges(DiscourseModel discourseModel, DiscourseEntity[] discourseEntities) { DiscourseEntity firstDiscourseEntity = discourseEntities[0]; for (int discourseEntityIndex = 1; discourseEntityIndex < discourseEntities.Length; discourseEntityIndex++) { DiscourseEntity secondDiscourseEntity = discourseEntities[discourseEntityIndex]; //temporary variable if (secondDiscourseEntity != null) { if (firstDiscourseEntity != null && firstDiscourseEntity != secondDiscourseEntity) { discourseModel.MergeEntities(firstDiscourseEntity, secondDiscourseEntity, 1); } else { firstDiscourseEntity = secondDiscourseEntity; } } } return(firstDiscourseEntity); }
/// <summary> /// Updates the specified discourse model with the specified mention as coreferent with the specified entity. /// </summary> /// <param name="discourseModel"> /// The discourse model /// </param> /// <param name="mention"> /// The mention to be added to the specified entity. /// </param> /// <param name="entity"> /// The entity which is mentioned by the specified mention. /// </param> /// <param name="useDiscourseModel"> /// Whether the mentions should be kept as an entiy or simply co-indexed. /// </param> protected internal virtual void UpdateExtent(DiscourseModel discourseModel, MentionContext mention, DiscourseEntity entity, bool useDiscourseModel) { if (useDiscourseModel) { if (entity != null) { if (entity.GenderProbability < mention.GenderProbability) { entity.Gender = mention.GetGender(); entity.GenderProbability = mention.GenderProbability; } if (entity.NumberProbability < mention.NumberProbability) { entity.Number = mention.GetNumber(); entity.NumberProbability = mention.NumberProbability; } entity.AddMention(mention); discourseModel.MentionEntity(entity); } else { entity = new DiscourseEntity(mention, mention.GetGender(), mention.GenderProbability, mention.GetNumber(), mention.NumberProbability); discourseModel.AddEntity(entity); } } else { if (entity != null) { var newEntity = new DiscourseEntity(mention, mention.GetGender(), mention.GenderProbability, mention.GetNumber(), mention.NumberProbability); discourseModel.AddEntity(newEntity); newEntity.Id = entity.Id; } else { var newEntity = new DiscourseEntity(mention, mention.GetGender(), mention.GenderProbability, mention.GetNumber(), mention.NumberProbability); discourseModel.AddEntity(newEntity); } } }
/// <summary> /// Merges the specified entities into a single entity with the specified confidence. /// </summary> /// <param name="firstEntity"> /// The first entity. /// </param> /// <param name="secondEntity"> /// The second entity. /// </param> /// <param name="confidence"> /// The confidence. /// </param> public virtual void MergeEntities(DiscourseEntity firstEntity, DiscourseEntity secondEntity, float confidence) { foreach (Mention.MentionContext mc in secondEntity.Mentions) { firstEntity.AddMention(mc); } mEntities.Remove(secondEntity); }
/// <summary> /// Updates the specified discourse model with the specified mention as coreferent with the specified entity. /// </summary> /// <param name="discourseModel"> /// The discourse model /// </param> /// <param name="mention"> /// The mention to be added to the specified entity. /// </param> /// <param name="entity"> /// The entity which is mentioned by the specified mention. /// </param> /// <param name="useDiscourseModel"> /// Whether the mentions should be kept as an entiy or simply co-indexed. /// </param> protected internal virtual void UpdateExtent(DiscourseModel discourseModel, MentionContext mention, DiscourseEntity entity, bool useDiscourseModel) { if (useDiscourseModel) { if (entity != null) { //System.err.println("AbstractLinker.updateExtent: addingExtent: // "+econtext.toText()); if (entity.GenderProbability < mention.GenderProbability) { entity.Gender = mention.GetGender(); entity.GenderProbability = mention.GenderProbability; } if (entity.NumberProbability < mention.NumberProbability) { entity.Number = mention.GetNumber(); entity.NumberProbability = mention.NumberProbability; } entity.AddMention(mention); discourseModel.MentionEntity(entity); } else { //System.err.println("AbstractLinker.updateExtent: creatingExtent: // "+econtext.toText()+" "+econtext.gender+" "+econtext.number); entity = new DiscourseEntity(mention, mention.GetGender(), mention.GenderProbability, mention.GetNumber(), mention.NumberProbability); discourseModel.AddEntity(entity); } } else { if (entity != null) { DiscourseEntity newEntity = new DiscourseEntity(mention, mention.GetGender(), mention.GenderProbability, mention.GetNumber(), mention.NumberProbability); discourseModel.AddEntity(newEntity); newEntity.Id = entity.Id; } else { DiscourseEntity newEntity = new DiscourseEntity(mention, mention.GetGender(), mention.GenderProbability, mention.GetNumber(), mention.NumberProbability); discourseModel.AddEntity(newEntity); } } //System.err.println(de1); }
public CoreferenceParse(List<Parse> parses, DiscourseEntity[] entities) { mParses = parses; mParseMap = new Dictionary<Parse, int>(); for (int currentEntity = 0; currentEntity < entities.Length; currentEntity++) { if (entities[currentEntity].MentionCount > 1) { foreach (MentionContext mc in entities[currentEntity].Mentions) { Parse mentionParse = ((DefaultParse)mc.Parse).Parse; mParseMap[mentionParse] = currentEntity + 1; } } } }
/// <summary> /// Merges the specified entities into a single entity with the specified confidence. /// </summary> /// <param name="firstEntity"> /// The first entity. /// </param> /// <param name="secondEntity"> /// The second entity. /// </param> /// <param name="confidence"> /// The confidence. /// </param> public virtual void MergeEntities(DiscourseEntity firstEntity, DiscourseEntity secondEntity, float confidence) { foreach (Mention.MentionContext mc in secondEntity.Mentions) { firstEntity.AddMention(mc); } //System.err.println("DiscourseModel.mergeEntities: removing "+e2); mEntities.Remove(secondEntity); }
/// <summary> /// Adds the specified entity to this discourse model. /// </summary> /// <param name="entity"> /// the entity to be added to the model. /// </param> public virtual void AddEntity(DiscourseEntity entity) { entity.Id = mNextEntityId; mNextEntityId++; mEntities.Insert(0, entity); }
/// <summary> /// Adds the specified entity to this discourse model. /// </summary> /// <param name="entity"> /// the entity to be added to the model. /// </param> public virtual void AddEntity(DiscourseEntity entity) { entity.Id = mNextEntityId; mNextEntityId++; mEntities.Insert(0, entity); }
/// <summary> /// Creates a new linker with the specified model directory, running in the specified mode which uses a discourse model /// based on the specified parameter and uses the specified fixed non-referential probability. /// </summary> /// <param name="modelDirectory"> /// The directory where the models for this linker are kept. /// </param> /// <param name="mode"> /// The mode that this linker is running in. /// </param> /// <param name="useDiscourseModel"> /// Whether the model should use a discourse model or not. /// </param> /// <param name="fixedNonReferentialProbability"> /// The probability which resolvers are required to exceed to posit a coreference relationship. /// </param> public DefaultLinker(string modelDirectory, LinkerMode mode, bool useDiscourseModel, double fixedNonReferentialProbability) : base(modelDirectory, mode, useDiscourseModel) { if (mode != LinkerMode.Sim) { mCompatibilityModel = new MaximumEntropyCompatibilityModel(CoreferenceProjectName); } InitializeHeaderFinder(); InitializeMentionFinder(); if (mode != LinkerMode.Sim) { InitializeResolvers(mode, fixedNonReferentialProbability); Entities = new DiscourseEntity[Resolvers.Length]; } }
/// <summary> /// Updates the specified discourse model with the specified mention as coreferent with the specified entity. /// </summary> /// <param name="discourseModel"> /// The discourse model /// </param> /// <param name="mention"> /// The mention to be added to the specified entity. /// </param> /// <param name="entity"> /// The entity which is mentioned by the specified mention. /// </param> /// <param name="useDiscourseModel"> /// Whether the mentions should be kept as an entiy or simply co-indexed. /// </param> protected internal virtual void UpdateExtent(DiscourseModel discourseModel, MentionContext mention, DiscourseEntity entity, bool useDiscourseModel) { if (useDiscourseModel) { if (entity != null) { if (entity.GenderProbability < mention.GenderProbability) { entity.Gender = mention.GetGender(); entity.GenderProbability = mention.GenderProbability; } if (entity.NumberProbability < mention.NumberProbability) { entity.Number = mention.GetNumber(); entity.NumberProbability = mention.NumberProbability; } entity.AddMention(mention); discourseModel.MentionEntity(entity); } else { entity = new DiscourseEntity(mention, mention.GetGender(), mention.GenderProbability, mention.GetNumber(), mention.NumberProbability); discourseModel.AddEntity(entity); } } else { if (entity != null) { var newEntity = new DiscourseEntity(mention, mention.GetGender(), mention.GenderProbability, mention.GetNumber(), mention.NumberProbability); discourseModel.AddEntity(newEntity); newEntity.Id = entity.Id; } else { var newEntity = new DiscourseEntity(mention, mention.GetGender(), mention.GenderProbability, mention.GetNumber(), mention.NumberProbability); discourseModel.AddEntity(newEntity); } } }
protected internal virtual DiscourseEntity CheckForMerges(DiscourseModel discourseModel, DiscourseEntity[] discourseEntities) { DiscourseEntity firstDiscourseEntity = discourseEntities[0]; for (int discourseEntityIndex = 1; discourseEntityIndex < discourseEntities.Length; discourseEntityIndex++) { DiscourseEntity secondDiscourseEntity = discourseEntities[discourseEntityIndex]; //temporary variable if (secondDiscourseEntity != null) { if (firstDiscourseEntity != null && firstDiscourseEntity != secondDiscourseEntity) { discourseModel.MergeEntities(firstDiscourseEntity, secondDiscourseEntity, 1); } else { firstDiscourseEntity = secondDiscourseEntity; } } } return firstDiscourseEntity; }
public CoreferenceParse(List<Parse> parses, DiscourseEntity[] entities) { mParses = parses; mParseMap = new Dictionary<Parse, int>(); for (int currentEntity = 0; currentEntity < entities.Length; currentEntity++) { if (entities[currentEntity].MentionCount > 1) { foreach (MentionContext mc in entities[currentEntity].Mentions) { Parse mentionParse = ((DefaultParse)mc.Parse).Parse; mParseMap[mentionParse] = currentEntity + 1; //System.err.println("CorefParse: "+mc.getParse().hashCode()+" -> "+ (ei+1)); } } } }