package edu.stanford.nlp.naturalli; import edu.stanford.nlp.ling.CoreLabel; import edu.stanford.nlp.ling.IndexedWord; import edu.stanford.nlp.semgraph.SemanticGraph; import java.util.function.BiFunction; import java.util.function.Function; /** * A class to find the forward entailments warranted by a particular sentence or clause. * Note that this will _only_ do deletions -- it will neither consider insertions, nor mutations of * the original sentence. * * @author Gabor Angeli */ @SuppressWarnings("UnusedDeclaration") public class ForwardEntailer implements BiFunction<SemanticGraph, Boolean, ForwardEntailerSearchProblem> { /** * The maximum number of ticks top search for. Otherwise, the search will be exhaustive. */ public final int maxTicks; /** * The maximum number of results to return from a single search. */ public final int maxResults; /** * The weights to use for entailment. */ public final NaturalLogicWeights weights; /** * Create a new searcher with the specified parameters. * * @param maxResults The maximum number of results to return from a single search. * @param maxTicks The maximum number of ticks to search for. * @param weights The natural logic weights to use for the searches. */ public ForwardEntailer(int maxResults, int maxTicks, NaturalLogicWeights weights) { this.maxResults = maxResults; this.maxTicks = maxTicks; this.weights = weights; } /** * @see ForwardEntailer#ForwardEntailer(int, int, NaturalLogicWeights) */ public ForwardEntailer(int maxResults, NaturalLogicWeights weights) { this(maxResults, maxResults * 25, weights); } /** * @see ForwardEntailer#ForwardEntailer(int, int, NaturalLogicWeights) */ public ForwardEntailer(NaturalLogicWeights weights) { this(Integer.MAX_VALUE, Integer.MAX_VALUE, weights); } /** * Create a new search problem instance, given a sentence (possibly fragment), and the corresponding * parse tree. * * @param parseTree The original tree of the sentence we are beginning with * @param truthOfPremise The truth of the premise. In most applications, this will just be true. * * @return A new search problem instance. */ @Override public ForwardEntailerSearchProblem apply(SemanticGraph parseTree, Boolean truthOfPremise) { for (IndexedWord vertex : parseTree.vertexSet()) { CoreLabel token = vertex.backingLabel(); if (token != null && !token.containsKey(NaturalLogicAnnotations.PolarityAnnotation.class)) { throw new IllegalArgumentException("Cannot run Natural Logic forward entailment without polarity annotations set. See " + NaturalLogicAnnotator.class.getSimpleName()); } } return new ForwardEntailerSearchProblem(parseTree, truthOfPremise, maxResults, maxTicks, weights); } }