package edu.stanford.nlp.ling; /** * A <code>TaggedWord</code> object contains a word and its tag. * The <code>value()</code> of a TaggedWord is the Word. The tag * is secondary. * * @author Christopher Manning */ public class TaggedWord extends Word implements HasTag { private String tag; private static final String DIVIDER = "/"; /** * Create a new <code>TaggedWord</code>. * It will have <code>null</code> for its content fields. */ public TaggedWord() { super(); } /** * Create a new <code>TaggedWord</code>. * * @param word The word, which will have a <code>null</code> tag */ public TaggedWord(String word) { super(word); } /** * Create a new <code>TaggedWord</code>. * * @param word The word * @param tag The tag */ public TaggedWord(String word, String tag) { super(word); this.tag = tag; } /** * Create a new <code>TaggedWord</code>. * * @param oldLabel A Label. If it implements the HasWord and/or * HasTag interface, then the corresponding value will be set */ public TaggedWord(Label oldLabel) { super(oldLabel.value()); if (oldLabel instanceof HasTag) { this.tag = ((HasTag) oldLabel).tag(); } } /** * Create a new <code>TaggedWord</code>. * * @param word This word is passed to the supertype constructor * @param tag The <code>value()</code> of this label is set as the * tag of this Label */ public TaggedWord(Label word, Label tag) { super(word); this.tag = tag.value(); } public String tag() { return tag; } public void setTag(String tag) { this.tag = tag; } @Override public String toString() { return toString(DIVIDER); } public String toString(String divider) { return word() + divider + tag; } /** * Sets a TaggedWord from decoding * the <code>String</code> passed in. The String is divided according * to the divider character (usually, "/"). We assume that we can * always just * divide on the rightmost divider character, rather than trying to * parse up escape sequences. If the divider character isn't found * in the word, then the whole string becomes the word, and the tag * is <code>null</code>. * * @param taggedWord The word that will go into the <code>Word</code> */ public void setFromString(String taggedWord) { setFromString(taggedWord, DIVIDER); } public void setFromString(String taggedWord, String divider) { int where = taggedWord.lastIndexOf(divider); if (where >= 0) { setWord(taggedWord.substring(0, where)); setTag(taggedWord.substring(where + 1)); } else { setWord(taggedWord); setTag(null); } } // extra class guarantees correct lazy loading (Bloch p.194) private static class LabelFactoryHolder { private LabelFactoryHolder() {} private static final LabelFactory lf = new TaggedWordFactory(); } /** * Return a factory for this kind of label * (i.e., <code>TaggedWord</code>). * The factory returned is always the same one (a singleton). * * @return The label factory */ @Override public LabelFactory labelFactory() { return LabelFactoryHolder.lf; } /** * Return a factory for this kind of label. * * @return The label factory */ public static LabelFactory factory() { return LabelFactoryHolder.lf; } private static final long serialVersionUID = -7252006452127051085L; }