/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


package opennlp.tools.coref.mention;

/**
 * Specifies the interface that Objects which determine the space of
 * mentions for coreference should implement.
 */
public interface MentionFinder {

  /**
   * Specifies whether pre-nominal named-entities should be collected as mentions.
   *
   * @param collectPrenominalNamedEntities true if pre-nominal named-entities should be collected; false otherwise.
   */
  public void setPrenominalNamedEntityCollection(boolean collectPrenominalNamedEntities);

  /**
   * Returns whether this mention finder collects pre-nominal named-entities as mentions.
   *
   * @return true if this mention finder collects pre-nominal named-entities as mentions
   */
  public boolean isPrenominalNamedEntityCollection();

  /**
   * Returns whether this mention finder collects coordinated noun phrases as mentions.
   *
   * @return true if this mention finder collects coordinated noun phrases as mentions; false otherwise.
   */
  public boolean isCoordinatedNounPhraseCollection();

  /**
   * Specifies whether coordinated noun phrases should be collected as mentions.
   *
   * @param collectCoordinatedNounPhrases true if coordinated noun phrases should be collected; false otherwise.
   */
  public void setCoordinatedNounPhraseCollection(boolean collectCoordinatedNounPhrases);

  /**
   * Returns an array of mentions.
   *
   * @param parse A top level parse from which mentions are gathered.
   *
   * @return an array of mentions which implement the <code>Extent</code> interface.
   */
  public Mention[] getMentions(Parse parse);
}
