/* This file is part of the Joshua Machine Translation System. * * Joshua is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 * of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA */ package joshua.corpus.alignment; import joshua.corpus.MatchedHierarchicalPhrases; import joshua.corpus.Span; /** * Abstract implementation of <code>Alignments</code> interface. * <p> * This class includes code that is likely to be common to all * concrete implementations of the interface. * * This includes common code to test for consistent alignment spans * and to test for aligned terminals. * * @author Lane Schwartz * @version $LastChangedDate: 2009-05-22 23:31:12 -0500 (Fri, 22 May 2009) $ */ public abstract class AbstractAlignments implements Alignments { /** * Indicates whether tight spans are required during phrase * extraction. */ protected final boolean requireTightSpans; /** * Constructs an abstract alignments object where * <code>requiredTightSpans</code> is true. */ public AbstractAlignments() { this.requireTightSpans = true; } /** * Constructs an abstract alignments object. * * @param requireTightSpans Indicates whether tight spans * are required during phrase extraction */ public AbstractAlignments(boolean requireTightSpans) { this.requireTightSpans = requireTightSpans; } /* See Javadoc for Alignments interface. */ public Span getConsistentTargetSpan(Span sourceSpan) { Span targetSpan = getAlignedTargetSpan(sourceSpan); if (targetSpan.start == UNALIGNED) return null; // check back to see what sourceSpan the targetSpan // aligns back to, so that we can check that it's // within bounds Span correspondingSourceSpan = getAlignedSourceSpan(targetSpan.start, targetSpan.end); if (correspondingSourceSpan.start < sourceSpan.start || correspondingSourceSpan.end > sourceSpan.end) { return null; } else { return targetSpan; } } /* See Javadoc for Alignments interface. */ public boolean hasAlignedTerminal(int targetIndex, MatchedHierarchicalPhrases sourcePhrases, int sourcePhraseIndex) { int[] sourceIndices = getAlignedSourceIndices(targetIndex); if (sourceIndices==null || sourceIndices.length==0) { return false; } else { for (int alignedSourceIndex : sourceIndices) { if (sourcePhrases.containsTerminalAt(sourcePhraseIndex, alignedSourceIndex)) { return true; } } return false; } } /* See Javadoc for Alignments interface. */ public Span getAlignedTargetSpan(Span sourceSpan) { return getAlignedTargetSpan(sourceSpan.start, sourceSpan.end); } }