// parse ('foo', 0.23) CNAlt getCNAlt(const std::string& in, int &c) { if (get(in,c++) != '(') { std::cerr << "PCN/PLF parse error: expected ( at start of cn alt block\n"; // throw "expected ("; return CNAlt(); } std::string word = getEscapedString(in,c); if (get(in,c++) != ',') { std::cerr << "PCN/PLF parse error: expected , after string\n"; // throw "expected , after string"; return CNAlt(); } size_t cnNext = 1; // read all tokens after the 1st std::vector<string> toks; toks.push_back(getString(in,c)); while (get(in,c) == ',') { c++; string tok = getString(in,c); toks.push_back(tok); } std::vector<float> probs; // dense scores size_t ind; for (ind = 0; ind < toks.size() - 1; ++ind) { const string &tok = toks[ind]; if (tok.find('=') == tok.npos) { float val = Moses::Scan<float>(tok); probs.push_back(val); } else { // beginning of sparse feature break; } } // sparse features std::map<string, float> sparseFeatures; for (; ind < toks.size() - 1; ++ind) { const string &tok = toks[ind]; vector<string> keyValue = Moses::Tokenize(tok, "="); CHECK(keyValue.size() == 2); float prob = Moses::Scan<float>(keyValue[1]); sparseFeatures[ keyValue[0] ] = prob; } //last item is column increment cnNext = Moses::Scan<size_t>(toks.back()); if (get(in,c++) != ')') { std::cerr << "PCN/PLF parse error: expected ) at end of cn alt block\n"; // throw "expected )"; return CNAlt(); } eatws(in,c); return CNAlt(word, probs, sparseFeatures, cnNext); }
// parse ('foo', 0.23) CNAlt getCNAlt(const std::string& in, int &c) { if (get(in,c++) != '(') { std::cerr << "PCN/PLF parse error: expected ( at start of cn alt block\n"; return CNAlt(); } // throw "expected ("; std::string word = getEscapedString(in,c); if (get(in,c++) != ',') { std::cerr << "PCN/PLF parse error: expected , after string\n"; return CNAlt(); } // throw "expected , after string"; size_t cnNext = 1; std::vector<float> probs; probs.push_back(getFloat(in,c)); while (get(in,c) == ',') { c++; float val = getFloat(in,c); probs.push_back(val); } //if we read more than one prob, this was a lattice, last item was column increment if (probs.size()>1) { cnNext = static_cast<size_t>(probs.back()); probs.pop_back(); if (cnNext < 1) { ; std::cerr << "PCN/PLF parse error: bad link length at last element of cn alt block\n"; return CNAlt(); } //throw "bad link length" } if (get(in,c++) != ')') { std::cerr << "PCN/PLF parse error: expected ) at end of cn alt block\n"; return CNAlt(); } // throw "expected )"; eatws(in,c); return CNAlt(std::pair<std::string, std::vector<float> >(word,probs), cnNext); }