翻译规则词汇化概率用streaming实现的实例
来源:互联网 发布:买车下个什么app软件 编辑:程序博客网 时间:2024/05/21 13:03
使用combiner后能够减少io操作,700万左右的测试数据速度提高了1倍,数据更大提升效果更明显。
因为运算量较小,此处使用了streaming方式,性能和pipes相差不大。
mapper负责解析输入的对齐格式<src>source</src><tgt>target</tgt><alignment>alignment</alignment>
combiner负责合并src和tgt的频度,减少给reduce带来的io负担
reduce负责count(src,tgt)/count(src)运算。
mapper代码:
#include <iostream>#include <fstream>#include <string>#include <stdlib.h>#include <vector>#include "boost/lexical_cast.hpp"using namespace std;void split_string_by_tag(const string & src, vector<string> & tgt_vec, const string & tag){tgt_vec.clear();size_t offset = 0;while(offset < src.size()){size_t pos = src.find(tag, offset);if(pos == string::npos){tgt_vec.push_back(src.substr(offset));offset = src.size();break;}tgt_vec.push_back(src.substr(offset, pos-offset));offset = pos + tag.size();}}int main(){string line;while (getline(cin,line)){std::string::size_type ep=line.find("</srcword>");std::string src=line.substr(9,ep-9);std::string::size_type sp=line.find("<s>",ep+1);ep=line.find("</tgtword>",sp);std::string tgt=line.substr(sp,ep-sp);sp=line.find("<alignment>");ep=line.find("</align");string align=line.substr(sp+11,ep-sp-11);vector<string> src_vec,tgt_vec,align_vec;split_string_by_tag(src,src_vec," ");split_string_by_tag(tgt,tgt_vec," ");split_string_by_tag(align,align_vec," ");vector<int> src_aligns,tgt_aligns;src_aligns.resize((int)src_vec.size(),0);tgt_aligns.resize((int)tgt_vec.size(),0);for(int i=0;i<(int)align_vec.size();++i){sp=align_vec[i].find("-");int fi=boost::lexical_cast<int>(align_vec[i].substr(0,sp));int ti=boost::lexical_cast<int>(align_vec[i].substr(sp+1));src_aligns[fi]=1;tgt_aligns[ti]=1;cout<<src_vec[fi]<<"\t"<<tgt_vec[ti]<<endl;cout<<tgt_vec[ti]<<"\t"<<src_vec[fi]<<endl;}for(int i=0;i<(int)src_vec.size();++i){if(src_aligns[i]==0){cout<<src_vec[i]<<"\t"<<"NULL"<<endl;cout<<"NULL"<<"\t"<<src_vec[i]<<endl;}}for(int i=0;i<(int)tgt_vec.size();++i){if(tgt_aligns[i]==0){cout<<"NULL"<<"\t"<<tgt_vec[i]<<endl;cout<<tgt_vec[i]<<"\t"<<"NULL"<<endl;}}}}
combiner代码
#include <iostream>#include <fstream>#include <string>#include <stdlib.h>#include <vector>#include <map>#include "boost/lexical_cast.hpp"using namespace std;void split_string_by_tag(const string & src, vector<string> & tgt_vec, const string & tag){tgt_vec.clear();size_t offset = 0;while(offset < src.size()){size_t pos = src.find(tag, offset);if(pos == string::npos){tgt_vec.push_back(src.substr(offset));offset = src.size();break;}tgt_vec.push_back(src.substr(offset, pos-offset));offset = pos + tag.size();}}int main(){string line;map<string,int> tgt_cnt;string last_key="";while (getline(cin,line)){string::size_type p=line.find("\t");p=line.find("\t",p+1);if(p!=string::npos){tgt_cnt[line.substr(0,p)]+=boost::lexical_cast<int>(line.substr(p+1));}elsetgt_cnt[line]+=1;}map<string,int >::const_iterator cit;for(cit=tgt_cnt.begin();cit!=tgt_cnt.end();++cit){cout<<cit->first<<"\t"<<cit->second<<endl;}}
reducer代码:
#include <iostream>#include <fstream>#include <string>#include <stdlib.h>#include <vector>#include <map>#include "boost/lexical_cast.hpp"using namespace std;void split_string_by_tag(const string & src, vector<string> & tgt_vec, const string & tag){tgt_vec.clear();size_t offset = 0;while(offset < src.size()){size_t pos = src.find(tag, offset);if(pos == string::npos){tgt_vec.push_back(src.substr(offset));offset = src.size();break;}tgt_vec.push_back(src.substr(offset, pos-offset));offset = pos + tag.size();}}int main(){string line;map<string,map<string,int> > hash;map<string,int> tgt_cnt;string last_key="";while (getline(cin,line)){string::size_type p=line.find("\t");string src=line.substr(0,p);string::size_type ep=line.find("\t",p+1);string tgt=line.substr(p+1);int cnt=1;if(ep!=string::npos){tgt=line.substr(p+1,ep-1-p);cnt=boost::lexical_cast<int>(line.substr(ep+1));}//tgt=tgt.substr(0,p);hash[src][tgt]+=cnt;tgt_cnt[src]+=cnt;/*if(src!=last_key&&!last_key.empty()){map<string,map<string,int> >::const_iterator cit;for(cit=hash.begin();cit!=hash.end();++cit){int sum=tgt_cnt[cit->first];for(map<string,int>::const_iterator cit2=cit->second.begin();cit2!=cit->second.end();++cit2){cout<<cit->first<<"\t"<<cit2->first<<"\t"<<(float)(cit2->second)/(float)sum<<endl;}}}last_key=src;hash.clear();tgt_cnt.clear();*/}map<string,map<string,int> >::const_iterator cit;for(cit=hash.begin();cit!=hash.end();++cit){int sum=tgt_cnt[cit->first];for(map<string,int>::const_iterator cit2=cit->second.begin();cit2!=cit->second.end();++cit2){cout<<cit->first<<"\t"<<cit2->first<<"\t"<<(float)(cit2->second)/(float)sum<<endl;}}}
- 翻译规则词汇化概率用streaming实现的实例
- [翻译]反射的规则
- [翻译]反射的规则
- 径向基概率神经网络的实例(实现预测,分类)
- 词汇化概率上下文无关文法 Lexicalized PCFGs
- 词汇化剖析与概率剖析(1)
- 中国特色词汇翻译
- 专业词汇翻译
- 计算机专业词汇翻译备忘
- GIS英文词汇翻译
- Risk骰子规则的基本概率计算
- 翻译简历中所需的英文词汇
- 【PPA2】难以翻译、或容易有歧义的词汇
- 人教版九年级数学的“词汇”中英文对照表翻译bug
- 第四版 Thinking in java 翻译的词汇
- streaming方式的CombineFileInputFormat实现
- spark streaming的NetworkWordCount实例理解
- spark streaming的NetworkWordCount实例理解
- POJ1080 Human Gene Functions
- linux内核基础
- uva 270 Lining Up/poj 1118
- win7上MySQL5.6安装与测试(C#)--- 感觉改动很大
- 2014年计算机求职总结--准备篇
- 翻译规则词汇化概率用streaming实现的实例
- HDU2577--How to Type
- java连接SQLServer2008没找到合适驱动问题
- Shark:强大的开源C++机器学习库
- 深入理解C/C++ [Deep C (and C++)]
- 数据挖掘产品 IBM SPSS Modeler 新手使用入门
- 线程
- 项目中常用MyEclipse设置
- 常见音视频格式