00001 #include "RuleTableWriter.h"
00002
00003 #include <cassert>
00004 #include <cstdlib>
00005 #include <fstream>
00006 #include <iostream>
00007 #include <iterator>
00008 #include <string>
00009 #include <sstream>
00010 #include <vector>
00011
00012 #include "util/string_piece.hh"
00013 #include "util/tokenize_piece.hh"
00014
00015 #include "InputFileStream.h"
00016 #include "LexicalTable.h"
00017 #include "OutputFileStream.h"
00018 #include "Options.h"
00019 #include "RuleGroup.h"
00020
00021 namespace MosesTraining
00022 {
00023 namespace Syntax
00024 {
00025 namespace ScoreStsg
00026 {
00027
00028 void RuleTableWriter::WriteLine(const TokenizedRuleHalf &source,
00029 const TokenizedRuleHalf &target,
00030 const std::string &bestAlignment,
00031 double lexScore, double treeScore, int count,
00032 int totalCount, int distinctCount)
00033 {
00034 if (m_options.inverse) {
00035 WriteRuleHalf(target);
00036 m_out << " ||| ";
00037 WriteRuleHalf(source);
00038 } else {
00039 WriteRuleHalf(source);
00040 m_out << " ||| ";
00041 WriteRuleHalf(target);
00042 }
00043
00044 m_out << " |||" << bestAlignment << "||| ";
00045
00046 if (!m_options.noLex) {
00047 m_out << MaybeLog(lexScore);
00048 }
00049
00050 if (m_options.treeScore && !m_options.inverse) {
00051 m_out << " " << MaybeLog(treeScore);
00052 }
00053
00054 m_out << " ||| " << totalCount << " " << count;
00055 if (m_options.kneserNey) {
00056 m_out << " " << distinctCount;
00057 }
00058 m_out << " |||";
00059 m_out << std::endl;
00060 }
00061
00062 void RuleTableWriter::WriteRuleHalf(const TokenizedRuleHalf &half)
00063 {
00064 if (half.IsTree()) {
00065 m_out << half.string;
00066 return;
00067 }
00068
00069 for (std::vector<RuleSymbol>::const_iterator p = half.frontierSymbols.begin();
00070 p != half.frontierSymbols.end(); ++p) {
00071 if (p->isNonTerminal) {
00072 m_out << "[" << p->value << "][" << p->value << "] ";
00073 } else {
00074 m_out << p->value << " ";
00075 }
00076 }
00077 m_out << "[X]";
00078 }
00079
00080 }
00081 }
00082 }