int main(int argc, char * argv[]) { if (argc < 2) { return -1; } SRL_LoadResource(argv[1]); std::vector<std::string> words; std::vector<std::string> postags; std::vector<std::string> nes; std::vector<std::pair<int,std::string> > parse; std::vector< std::pair< int, std::vector< std::pair<std::string, std::pair< int, int > > > > > srl; words.push_back("一把手"); postags.push_back("n"); nes.push_back("O"); parse.push_back(make_pair(2,"SBV")); words.push_back("亲自"); postags.push_back("d"); nes.push_back("O"); parse.push_back(make_pair(2,"ADV")); words.push_back("过问"); postags.push_back("v"); nes.push_back("O"); parse.push_back(make_pair(-1,"HED")); words.push_back("。"); postags.push_back("wp"); nes.push_back("O"); parse.push_back(make_pair(2,"WP")); DoSRL(words,postags,nes,parse,srl); for(int i = 0; i<srl.size(); ++i) { std::cout<<srl[i].first<<":"<<std::endl; for(int j = 0; j<srl[i].second.size(); ++j) { std::cout<<"\ttype = "<<srl[i].second[j].first <<" beg = "<<srl[i].second[j].second.first <<" end = "<<srl[i].second[j].second.second <<std::endl; } } SRL_ReleaseResource(); return 0; }
std::vector<SementicRole> label( const std::vector<std::string>& words, const std::vector<std::string>& postags, const std::vector<std::string>& netags, std::vector<ParseResult>& parse ) { std::vector<SementicRole> ret; // Some trick for (std::size_t i = 0; i < parse.size(); ++ i) { parse[i].first --; } if (!loaded) { std::cerr << "SRL: Model not loaded!" << std::endl; } else { DoSRL(words, postags, netags, parse, ret); } return ret; }
JNIEXPORT jint JNICALL Java_edu_hit_ir_ltp4j_SRL_srl (JNIEnv * env, jclass obj, jobject array_words, jobject array_tags, jobject array_ners, jobject array_heads, jobject array_deprels, jobject srl_result){ jclass array_list = env->GetObjectClass(array_words); jmethodID list_construct = env->GetMethodID(array_list,"<init>","()V"); jmethodID list_add = env->GetMethodID(array_list,"add","(Ljava/lang/Object;)Z"); jmethodID list_get = env->GetMethodID(array_list,"get","(I)Ljava/lang/Object;"); jmethodID list_size = env->GetMethodID(array_list,"size","()I"); jclass integer = env->FindClass("java/lang/Integer"); jmethodID integer_construct =env->GetMethodID(integer,"<init>","(I)V"); jmethodID integer_int =env->GetMethodID(integer,"intValue","()I"); jclass pair = env->FindClass("edu/hit/ir/ltp4j/Pair"); jmethodID pair_construct = env->GetMethodID(pair,"<init>","(Ljava/lang/Object;Ljava/lang/Object;)V"); std::vector<std::string> words,tags,ners,deprels; std::vector<int> heads; std::vector<std::pair<int,std::string> > parsers; std::vector< std::pair< int, std::vector< std::pair<std::string, std::pair< int, int > > > > > srls; int size_words = env->CallIntMethod(array_words,list_size); for(int i = 0;i<size_words;i++){ jobject tmp = env->CallObjectMethod(array_words,list_get,i); jstring s = reinterpret_cast<jstring> (tmp); const char * st = env->GetStringUTFChars(s,0); std::string s_s(st); words.push_back(s_s); env->ReleaseStringUTFChars( s, st); } int size_tags = env->CallIntMethod(array_tags,list_size); for(int i = 0;i<size_tags;i++){ jobject tmp = env->CallObjectMethod(array_tags,list_get,i); jstring s = reinterpret_cast<jstring> (tmp); const char * st = env->GetStringUTFChars(s,0); std::string s_s(st); tags.push_back(s_s); env->ReleaseStringUTFChars( s, st); } int size_ners = env->CallIntMethod(array_ners,list_size); for(int i = 0;i<size_ners;i++){ jobject tmp = env->CallObjectMethod(array_ners,list_get,i); jstring s = reinterpret_cast<jstring> (tmp); const char * st = env->GetStringUTFChars(s,0); std::string s_s(st); ners.push_back(s_s); env->ReleaseStringUTFChars( s, st); } int size_heads = env->CallIntMethod(array_heads,list_size); for(int i = 0;i<size_heads;i++){ jobject tmp = env->CallObjectMethod(array_heads,list_get,i); int digit = env->CallIntMethod(tmp,integer_int); heads.push_back(digit); } int size_deprels = env->CallIntMethod(array_deprels,list_size); for(int i = 0;i<size_deprels;i++){ jobject tmp = env->CallObjectMethod(array_deprels,list_get,i); jstring s = reinterpret_cast<jstring> (tmp); const char * st = env->GetStringUTFChars(s,0); std::string s_s(st); deprels.push_back(s_s); env->ReleaseStringUTFChars( s, st); } for(int i = 0;i<size_heads;i++){ parsers.push_back(make_pair(heads.at(i),deprels.at(i))); } int len = DoSRL(words,tags,ners,parsers,srls); if(len<0) return -1; for(int i = 0;i<srls.size();++i) { jobject trigger = env->NewObject(integer,integer_construct,srls[i].first); jobject args = env->NewObject(array_list,list_construct); for(int j = 0;j<srls[i].second.size();++j) { jobject start = env->NewObject(integer,integer_construct,srls[i].second[j].second.first); jobject end = env->NewObject(integer,integer_construct,srls[i].second[j].second.second); jobject bound = env->NewObject(pair,pair_construct,start,end); jobject rels = stringToJstring(env,srls[i].second[j].first.c_str()); jobject inner = env->NewObject(pair,pair_construct,rels,bound); env->CallBooleanMethod(args,list_add,inner); } jobject outer = env->NewObject(pair,pair_construct,trigger,args); env->CallBooleanMethod(srl_result,list_add,outer); } return srls.size(); }