int LTP::srl(XML4NLP & xml) { if ( xml.QueryNote(NOTE_SRL) ) return 0; // dependency int ret = ner(xml); if (0 != ret) { ERROR_LOG("in LTP::srl, failed to perform ner preprocess"); return ret; } ret = parser(xml); if (0 != ret) { ERROR_LOG("in LTP::srl, failed to perform parsing preprocess"); return ret; } int stnsNum = xml.CountSentenceInDocument(); if (stnsNum == 0) { ERROR_LOG("in LTP::srl, number of sentence equals 0"); return kEmptyStringError; } for (int i = 0; i < stnsNum; ++i) { vector<string> vecWord; vector<string> vecPOS; vector<string> vecNE; vector< pair<int, string> > vecParse; vector< pair<int, vector< pair<string, pair< int, int > > > > > vecSRLResult; if (xml.GetWordsFromSentence(vecWord, i) != 0) { ERROR_LOG("in LTP::ner, failed to get words from xml"); return kReadXmlError; } if (xml.GetPOSsFromSentence(vecPOS, i) != 0) { ERROR_LOG("in LTP::ner, failed to get postags from xml"); return kReadXmlError; } if (xml.GetNEsFromSentence(vecNE, i) != 0) { ERROR_LOG("in LTP::ner, failed to get ner result from xml"); return kReadXmlError; } if (xml.GetParsesFromSentence(vecParse, i) != 0) { ERROR_LOG("in LTP::ner, failed to get parsing result from xml"); return kReadXmlError; } if (0 != srl_dosrl(vecWord, vecPOS, vecParse, vecSRLResult)) { ERROR_LOG("in LTP::srl, failed to perform srl on sent. #%d", i+1); return kSRLError; } int j = 0; for (; j < vecSRLResult.size(); ++j) { vector<string> vecType; vector< pair<int, int> > vecBegEnd; int k = 0; for (; k < vecSRLResult[j].second.size(); ++k) { vecType.push_back(vecSRLResult[j].second[k].first); vecBegEnd.push_back(vecSRLResult[j].second[k].second); } if (0 != xml.SetPredArgToWord(i, vecSRLResult[j].first, vecType, vecBegEnd)) { return kWriteXmlError; } } } xml.SetNote(NOTE_SRL); return 0; }