//Called when we start translating a new sentence void PhraseDictionaryFeature::InitDictionary(const TranslationSystem* system, const InputType& source) { PhraseDictionary* dict; if (m_useThreadSafePhraseDictionary) { //thread safe dictionary should already be loaded dict = m_threadSafePhraseDictionary.get(); } else { //thread-unsafe dictionary may need to be loaded if this is a new thread. if (!m_threadUnsafePhraseDictionary.get()) { m_threadUnsafePhraseDictionary.reset(LoadPhraseTable(system)); } dict = m_threadUnsafePhraseDictionary.get(); } CHECK(dict); dict->InitializeForInput(source); }
int main(int argc, char** argv) { bool help; string input_file; string config_file; po::options_description desc("Allowed options"); desc.add_options() ("help,h", po::value(&help)->zero_tokens()->default_value(false), "Print this help message and exit") ("input-file,i", po::value<string>(&input_file), "Input file") ("config-file,f", po::value<string>(&config_file), "Config file") ; po::options_description cmdline_options; cmdline_options.add(desc); po::variables_map vm; po::parsed_options parsed = po::command_line_parser(argc,argv). options(cmdline_options).allow_unregistered().run(); po::store(parsed, vm); po::notify(vm); if (help) { usage(desc, argv); exit(0); } if (input_file.empty()) { cerr << "ERROR: Please specify an input file" << endl << endl; usage(desc, argv); exit(1); } if (config_file.empty()) { cerr << "ERROR: Please specify a config file" << endl << endl; usage(desc, argv); exit(1); } vector<string> mosesargs; mosesargs.push_back(argv[0]); mosesargs.push_back("-f"); mosesargs.push_back(config_file); for (size_t i = 0; i < parsed.options.size(); ++i) { if (parsed.options[i].position_key == -1 && !parsed.options[i].unregistered) continue; /* const string& key = parsed.options[i].string_key; if (!key.empty()) { mosesargs.push_back(key); } for (size_t j = 0; j < parsed.options[i].value.size(); ++j) { const string& value = parsed.options[i].value[j]; if (!value.empty()) { mosesargs.push_back(value); } }*/ for (size_t j = 0; j < parsed.options[i].original_tokens.size(); ++j) { mosesargs.push_back(parsed.options[i].original_tokens[j]); } } boost::scoped_ptr<Parameter> params(new Parameter()); char** mosesargv = new char*[mosesargs.size()]; for (size_t i = 0; i < mosesargs.size(); ++i) { mosesargv[i] = new char[mosesargs[i].length() + 1]; strcpy(mosesargv[i], mosesargs[i].c_str()); } if (!params->LoadParam(mosesargs.size(), mosesargv)) { params->Explain(); exit(1); } if (!StaticData::LoadDataStatic(params.get(),argv[0])) { exit(1); } const StaticData &staticData = StaticData::Instance(); const std::vector<FactorType> & input = staticData.GetInputFactorOrder(); //Find the phrase table to evaluate with PhraseDictionary* phraseTable = NULL; const vector<FeatureFunction*>& ffs = FeatureFunction::GetFeatureFunctions(); for (size_t i = 0; i < ffs.size(); ++i) { PhraseDictionary* maybePhraseTable = dynamic_cast< PhraseDictionary*>(ffs[i]); if (maybePhraseTable) { UTIL_THROW_IF(phraseTable,util::Exception,"Can only score translations with one phrase table"); phraseTable = maybePhraseTable; } } UTIL_THROW_IF(!phraseTable,util::Exception,"Unable to find scoring phrase table"); Sentence sentence; phraseTable->InitializeForInput(sentence); // //Load and prune the phrase table. This is taken (with mods) from moses/TranslationModel/RuleTable/LoaderStandard.cpp // string lineOrig; std::ostream *progress = NULL; IFVERBOSE(1) progress = &std::cerr; util::FilePiece in(input_file.c_str(), progress); // reused variables vector<float> scoreVector; StringPiece line; double_conversion::StringToDoubleConverter converter(double_conversion::StringToDoubleConverter::NO_FLAGS, NAN, NAN, "inf", "nan"); StringPiece previous; while(true) { try { line = in.ReadLine(); } catch (const util::EndOfFileException &e) { break; } util::TokenIter<util::MultiCharacter> pipes(line, "|||"); StringPiece sourcePhraseString(*pipes); if (sourcePhraseString != previous) { outputTopN(previous, phraseTable, input, cout); previous = sourcePhraseString; } } outputTopN(previous, phraseTable, input, cout); return 0; }