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\">δ 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\">α("+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\">β("+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\">γ("+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 + -
显示快捷键?