⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 multisegmentationevaluator.java

📁 这是一个matlab的java实现。里面有许多内容。请大家慢慢捉摸。
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
          viterbiOutputStream.println (trueOutput.get(j).toString()+                                       '/'+predOutput.get(j).toString()+"  "+ fv.toString(true));						        }      }    }    DecimalFormat f = new DecimalFormat ("0.####");    logger.info (description +" tokenaccuracy="+f.format(((double)numCorrectTokens)/totalTokens));    for (int n = 0; n < numCorrectSegments.length; n++) {      logger.info ((n < allIndex ? segmentStartTags[n].toString() : "OVERALL") +' ');      double precision = numPredictedSegments[n] == 0 ? 1 : ((double)numCorrectSegments[n]) / numPredictedSegments[n];      double recall = numTrueSegments[n] == 0 ? 1 : ((double)numCorrectSegments[n]) / numTrueSegments[n];      double f1 = recall+precision == 0.0 ? 0.0 : (2.0 * recall * precision) / (recall + precision);      logger.info (" segments true="+numTrueSegments[n]+" pred="+numPredictedSegments[n]+" correct="+numCorrectSegments[n]+                   " misses="+(numTrueSegments[n]-numCorrectSegments[n])+" alarms="+(numPredictedSegments[n]-numCorrectSegments[n]));      logger.info (" precision="+f.format(precision)+" recall="+f.format(recall)+" f1="+f.format(f1));    }  }	/**		 returns the number of incorrect segments in <code>predOutput</code>		 @param trueOutput truth		 @param predOutput predicted		 @return number of incorrect segments	 */	public int numIncorrectSegments (Sequence trueOutput, Sequence predOutput) {    int numCorrectTokens, totalTokens;    int[] numTrueSegments, numPredictedSegments, numCorrectSegments;    int allIndex = segmentStartTags.length;    numTrueSegments = new int[allIndex+1];    numPredictedSegments = new int[allIndex+1];    numCorrectSegments = new int[allIndex+1];    TokenSequence sourceTokenSequence = null;    totalTokens = numCorrectTokens = 0;    for (int n = 0; n < numTrueSegments.length; n++)      numTrueSegments[n] = numPredictedSegments[n] = numCorrectSegments[n] = 0;		assert (predOutput.size() == trueOutput.size());		// -1 for non-start, otherwise index into segmentStartTag		int trueStart, predStart;						for (int j = 0; j < trueOutput.size(); j++) {			totalTokens++;			if (trueOutput.get(j).equals(predOutput.get(j)))				numCorrectTokens++;			trueStart = predStart = -1;			// Count true segment starts			for (int n = 0; n < segmentStartTags.length; n++) {				if (segmentStartTags[n].equals(trueOutput.get(j))) {					numTrueSegments[n]++;					numTrueSegments[allIndex]++;					trueStart = n;					break;				}			}			// Count predicted segment starts			for (int n = 0; n < segmentStartTags.length; n++) {				if (segmentStartTags[n].equals(predOutput.get(j))) {					numPredictedSegments[n]++;					numPredictedSegments[allIndex]++;					predStart = n;				}			}			if (trueStart != -1 && trueStart == predStart) {				// Truth and Prediction both agree that the same segment tag-type is starting now				int m;				boolean trueContinue = false;				boolean predContinue = false;				for (m = j+1; m < trueOutput.size(); m++) {					trueContinue = segmentContinueTags[predStart].equals (trueOutput.get(m));					predContinue = segmentContinueTags[predStart].equals (predOutput.get(m));					if (!trueContinue || !predContinue) {						if (trueContinue == predContinue) {							// They agree about a segment is ending somehow							numCorrectSegments[predStart]++;							numCorrectSegments[allIndex]++;						}						break;					}				}				// for the case of the end of the sequence				if (m == trueOutput.size()) {					if (trueContinue == predContinue) {						numCorrectSegments[predStart]++;						numCorrectSegments[allIndex]++;					}				}			}					}		int wrong = 0;		for (int n=0; n < numCorrectSegments.length; n++) {			// incorrect segment is either false pos or false neg.			wrong += numTrueSegments[n] - numCorrectSegments[n]; 		}		return wrong;	}	/**		 Tests segmentation using an ArrayList of predicted Sequences		 instead of a {@link Transducer}. If predictedSequence is null,		 don't include in stats (useful for error analysis).		 @param data list of instances to be segmented		 @param predictedSequences predictions		 @param description description of trial		 @param viterbiOutputStream where to print the Viterbi paths	 */  public void batchTest(InstanceList data, ArrayList predictedSequences,												String description, PrintStream viterbiOutputStream)  {    int numCorrectTokens, totalTokens;    int[] numTrueSegments, numPredictedSegments, numCorrectSegments;    int allIndex = segmentStartTags.length;    numTrueSegments = new int[allIndex+1];    numPredictedSegments = new int[allIndex+1];    numCorrectSegments = new int[allIndex+1];    TokenSequence sourceTokenSequence = null;    totalTokens = numCorrectTokens = 0;    for (int n = 0; n < numTrueSegments.length; n++)      numTrueSegments[n] = numPredictedSegments[n] = numCorrectSegments[n] = 0;    for (int i = 0; i < data.size(); i++) {      if (viterbiOutputStream != null)        viterbiOutputStream.println ("Viterbi path for "+description+" instance #"+i);      Instance instance = data.getInstance(i);      Sequence input = (Sequence) instance.getData();			      //String tokens = null;      //if (instance.getSource() != null)      //tokens = (String) instance.getSource().toString();      Sequence trueOutput = (Sequence) instance.getTarget();      assert (input.size() == trueOutput.size());      Sequence predOutput = (Sequence) predictedSequences.get (i);			if (predOutput == null) // skip this instance				continue;      assert (predOutput.size() == trueOutput.size());      int trueStart, predStart;				// -1 for non-start, otherwise index into segmentStartTag      for (int j = 0; j < trueOutput.size(); j++) {        totalTokens++;        if (trueOutput.get(j).equals(predOutput.get(j)))          numCorrectTokens++;        trueStart = predStart = -1;        // Count true segment starts        for (int n = 0; n < segmentStartTags.length; n++) {          if (segmentStartTags[n].equals(trueOutput.get(j))) {            numTrueSegments[n]++;            numTrueSegments[allIndex]++;            trueStart = n;            break;          }        }        // Count predicted segment starts        for (int n = 0; n < segmentStartTags.length; n++) {          if (segmentStartTags[n].equals(predOutput.get(j))) {            numPredictedSegments[n]++;            numPredictedSegments[allIndex]++;            predStart = n;          }        }        if (trueStart != -1 && trueStart == predStart) {          // Truth and Prediction both agree that the same segment tag-type is starting now          int m;          boolean trueContinue = false;          boolean predContinue = false;          for (m = j+1; m < trueOutput.size(); m++) {            trueContinue = segmentContinueTags[predStart].equals (trueOutput.get(m));            predContinue = segmentContinueTags[predStart].equals (predOutput.get(m));            if (!trueContinue || !predContinue) {              if (trueContinue == predContinue) {                // They agree about a segment is ending somehow                numCorrectSegments[predStart]++;                numCorrectSegments[allIndex]++;              }              break;            }          }          // for the case of the end of the sequence          if (m == trueOutput.size()) {            if (trueContinue == predContinue) {              numCorrectSegments[predStart]++;              numCorrectSegments[allIndex]++;            }          }        }        if (viterbiOutputStream != null) {          FeatureVector fv = (FeatureVector) input.get(j);          //viterbiOutputStream.println (tokens.charAt(j)+" "+trueOutput.get(j).toString()+          //'/'+predOutput.get(j).toString()+"  "+ fv.toString(true));          if (sourceTokenSequence != null)            viterbiOutputStream.print (sourceTokenSequence.getToken(j).getText()+": ");          viterbiOutputStream.println (trueOutput.get(j).toString()+                                       '/'+predOutput.get(j).toString()+"  "+ fv.toString(true));						        }      }    }    DecimalFormat f = new DecimalFormat ("0.####");    logger.info (description +" tokenaccuracy="+f.format(((double)numCorrectTokens)/totalTokens));    for (int n = 0; n < numCorrectSegments.length; n++) {      logger.info ((n < allIndex ? segmentStartTags[n].toString() : "OVERALL") +' ');      double precision = numPredictedSegments[n] == 0 ? 1 : ((double)numCorrectSegments[n]) / numPredictedSegments[n];      double recall = numTrueSegments[n] == 0 ? 1 : ((double)numCorrectSegments[n]) / numTrueSegments[n];      double f1 = recall+precision == 0.0 ? 0.0 : (2.0 * recall * precision) / (recall + precision);      logger.info (" segments true="+numTrueSegments[n]+" pred="+numPredictedSegments[n]+" correct="+numCorrectSegments[n]+                   " misses="+(numTrueSegments[n]-numCorrectSegments[n])+" alarms="+(numPredictedSegments[n]-numCorrectSegments[n]));      logger.info (" precision="+f.format(precision)+" recall="+f.format(recall)+" f1="+f.format(f1));    }  }}

⌨️ 快捷键说明

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