Beispiel #1
0
 /// <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);
 }
Beispiel #2
0
		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();
		}
Beispiel #3
0
 /// <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);
 }
Beispiel #4
0
        /// <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);
            }
        }
Beispiel #5
0
		/// <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);
			}
		}
Beispiel #6
0
 /// <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];
     }
 }
Beispiel #7
0
        /// <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);
            }
        }
Beispiel #8
0
 /// <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);
 }
Beispiel #9
0
        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);
        }
Beispiel #10
0
 /// <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);
         }
     }
 }
Beispiel #11
0
		/// <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);
 }
Beispiel #13
0
		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);
 }
Beispiel #15
0
 /// <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];
     }
 }
Beispiel #18
0
		/// <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);
				}
			}
		}
Beispiel #19
0
		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;
		}
Beispiel #20
0
 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));
             }
         }
     }
 }