Пример #1
0
// 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);
}
Пример #2
0
// 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);
}