latticeviewer.java

来自「mallet是自然语言处理、机器学习领域的一个开源项目。」· Java 代码 · 共 483 行 · 第 1/2 页

JAVA
483
字号
/* Copyright (C) 2003 Univ. of Massachusetts Amherst, Computer Science Dept.   This file is part of "MALLET" (MAchine Learning for LanguagE Toolkit).   http://www.cs.umass.edu/~mccallum/mallet   This software is provided under the terms of the Common Public License,   version 1.0, as published by http://www.opensource.org.  For further   information, see the file `LICENSE' included with this distribution. */package edu.umass.cs.mallet.base.extract;import edu.umass.cs.mallet.base.fst.CRF4;import edu.umass.cs.mallet.base.fst.Transducer;import edu.umass.cs.mallet.base.types.*;import java.io.*;import java.text.DecimalFormat;/** * Created: Oct 31, 2004 * * @author <A HREF="mailto:casutton@cs.umass.edu>casutton@cs.umass.edu</A> * @version $Id: LatticeViewer.java,v 1.12 2005/03/05 05:26:21 casutton Exp $ */public class LatticeViewer {  private static final int FEATURE_CUTOFF_PCT = 25;  private static final int LENGTH = 10;  static void lattice2html (PrintStream out, ExtorInfo info)  {    PrintWriter writer = new PrintWriter (new OutputStreamWriter (out), true);    lattice2html (writer, info);  }  // if lattice == null, no alpha, beta values printed  static void lattice2html (PrintWriter out, ExtorInfo info)  {    assert (info.target.size() == info.predicted.size());    assert (info.input.size() == info.predicted.size());    int N = info.target.size();    for (int start = 0; start < N; start += LENGTH - 1) {      int end = Math.min (N, start + LENGTH);      if (!allSeqMatches (info.predicted, info.target, start, end)) {        error2html (out, info, start, end);      }    }  }  private static void writeHeader (PrintWriter out)  {    out.println ("<html><head><title>ERROR OUTPUT</title>\n<link rel=\"stylesheet\" href=\"errors.css\" type=\"text/css\" />\n</head><body>");  }  private static void writeFooter (PrintWriter out)  {    out.println ("</body></html>");  }  // Display HTML for one error  private static void error2html (PrintWriter out, ExtorInfo info, int start, int end)  {    String anchor = info.idx+":"+start+":"+end;    out.println ("<p><A NAME=\""+anchor+"\">");    out.println ("<p>Instance "+info.desc+" Position "+start+"..."+end);    if (info.link != null) {      out.println ("<a href=\""+info.link+"#"+anchor+"\">[Lattice]</a>");    }    out.println ("</p>");    out.println ("<table>");    outputIndices (out, start, end);    outputInputRow (out, info.input,  start, end);    outputTableRow (out, "target", info.target, info.predicted,  start, end);    outputTableRow (out, "predicted", info.predicted, info.target, start, end);    if (info.lattice != null) {      outputLatticeRows (out, info.lattice, start, end);      outputTransitionCosts (out, info, start, end);      outputFeatures (out, info.fvs, info.predicted, info.target, start, end);    }      out.println ("</table>");  }  public static int numMaxViterbi = 5;  private static void outputLatticeRows (PrintWriter out, Transducer.ViterbiPath lattice, int start, int end)  {    DecimalFormat f = new DecimalFormat ("0.##");    Transducer ducer = lattice.getTransducer ();    int max = Math.min (numMaxViterbi, ducer.numStates());    for (int k = 0; k < max; k++) {      out.println ("  <tr class=\"delta\">");      out.println ("    <td class=\"label\">&delta; rank "+k+"</td>");      for (int ip = start; ip < end; ip++) {          Transducer.State state = lattice.getStateAtRank (ip+1, k);        if (state.getName().equals (lattice.output ().get(ip))) {          out.print ("<td class=\"viterbi\">");        } else {          out.print ("<td>");        }        out.print (state.getName()+"<br />"+f.format (-lattice.getDelta (ip+1, state.getIndex ()))+"</td>");      }      out.println ("</tr>");    }  }  private static int numFeaturesToDisplay = 5;  public static int getNumFeaturesToDisplay ()  {    return numFeaturesToDisplay;  }  public static void setNumFeaturesToDisplay (int numFeaturesToDisplay)  {    LatticeViewer.numFeaturesToDisplay = numFeaturesToDisplay;  }  private static void outputTransitionCosts (PrintWriter out, ExtorInfo info, int start, int end)  {    Transducer ducer = info.lattice.getTransducer ();    out.println ("<tr class=\"predtrans\">");    out.println ("<td class=\"label\">Cost(pred. trans)</td>");    for (int ip = start; ip < end; ip++) {      if (ip == 0) {        out.println ("<td></td>");        continue;      }      Transducer.State from = ((CRF4) ducer).getState (info.bestStates.get (ip - 1).toString ());      Transducer.TransitionIterator iter = from.transitionIterator (info.fvs, ip, info.predicted, ip);      if (iter.hasNext ()) {        iter.next ();        double cost = iter.getCost ();        String str = iter.describeTransition ((int) (Math.abs(cost) / FEATURE_CUTOFF_PCT));        out.print ("<td>" + str + "</td>");      } else {        out.print ("<td>No matching transition</td>");      }    }    out.println ("</tr>");    out.println ("<tr class=\"targettrans\">");    out.println ("<td class=\"label\">Cost(target trans)</td>");    for (int ip = start; ip < end; ip++) {      if (ip == 0) {        out.println ("<td></td>");        continue;      }      if (!seqMatches (info.predicted, info.target, ip) || !seqMatches (info.predicted, info.target, ip - 1)) {        Transducer.State from = ((CRF4) ducer).getState (info.target.get (ip - 1).toString ());        if (from == null) {          out.println ("<td colspan='"+(end-start)+"'>Could not find state for "+info.target.get(ip-1)+"</td>");        } else {          Transducer.TransitionIterator iter = from.transitionIterator (info.fvs, ip, info.target, ip);          if (iter.hasNext ()) {            iter.next ();            double cost = iter.getCost ();            String str = iter.describeTransition ((int) (Math.abs(cost) / FEATURE_CUTOFF_PCT));            out.print ("<td>" + str + "</td>");          } else {            out.print ("<td>No matching transition</td>");          }        }      } else {        out.print ("<td></td>");      }    }    out.println ("</tr>");    out.println ("<tr class=\"predtargettrans\">");    out.println ("<td class=\"label\">Cost (pred->target trans)</td>");    for (int ip = start; ip < end; ip++) {      if (ip == 0) {        out.println ("<td></td>");        continue;      }      if (!seqMatches (info.predicted, info.target, ip) || !seqMatches (info.predicted, info.target, ip - 1)) {        Transducer.State from = ((CRF4) ducer).getState (info.bestStates.get (ip - 1).toString ());        Transducer.TransitionIterator iter = from.transitionIterator (info.fvs, ip, info.target, ip);        if (iter.hasNext ()) {          iter.next ();          double cost = iter.getCost ();          String str = iter.describeTransition ((int) (Math.abs(cost) / FEATURE_CUTOFF_PCT));          out.print ("<td>" + str + "</td>");        } else {          out.print ("<td>No matching transition</td>");        }      } else {        out.print ("<td></td>");      }    }    out.println ("</tr>");  }  private static void outputLatticeRows (PrintWriter out, Transducer.Lattice lattice, int start, int end)  {    DecimalFormat f = new DecimalFormat ("0.##");    Transducer ducer = lattice.getTransducer ();    for (int k = 0; k < ducer.numStates(); k++) {      Transducer.State state = ducer.getState (k);      out.println ("  <tr class=\"alpha\">");      out.println ("    <td class=\"label\">&alpha;("+state.getName()+")</td>");      for (int ip = start; ip < end; ip++) {          out.print ("<td>"+f.format (lattice.getAlpha (ip+1, state))+"</td>");      }      out.println ("</tr>");    }    for (int k = 0; k < ducer.numStates(); k++) {      Transducer.State state = ducer.getState (k);      out.println ("  <tr class=\"beta\">");      out.println ("    <td class=\"label\">&beta;("+state.getName()+")</td>");      for (int ip = start; ip < end; ip++) {          out.print ("<td>"+f.format (lattice.getBeta (ip+1, state))+"</td>");      }      out.println ("</tr>");    }    for (int k = 0; k < ducer.numStates(); k++) {      Transducer.State state = ducer.getState (k);      out.println ("  <tr class=\"gamma\">");      out.println ("    <td class=\"label\">&gamma;("+state.getName()+")</td>");      for (int ip = start; ip < end; ip++) {          out.print ("<td>"+f.format (lattice.getGammaCost (ip+1, state))+"</td>");      }      out.println ("</tr>");    }  }  private static void outputInputRow (PrintWriter out, TokenSequence input, int start, int end)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?