Hi,
You can calculate absolute positions in the source sentence based on the
words range of the current hypothesis and those of the direct
predecessors (in case of right-hand side non-terminals).
Take a look at these methods:
InputPath::GetWordsRange()
ChartHypothesis::GetCurrSourceRange()
ChartCellLabel::GetCoverage()
Cheers,
Matthias
On Thu, 2015-06-18 at 20:23 +0430, amir haghighi wrote:
> Hi everybody
>
>
> I wrote the following code to get an ordered list from the source words
> inside a hypothesis. It gets the words in their translation order, but I
> need not only the words' strings, but also the index of each word in the
> original sentence.
>
> could you please help me how to get the index of each word in srcPhrase, in
> the sentence?
>
>
> void Amir::GetSourcePhrase2(const ChartHypothesis& cur_hypo,Phrase
> &srcPhrase) const
> {
> AmirUtils utility;
> TargetPhrase targetPh=cur_hypo.GetCurrTargetPhrase();
> const Phrase *sourcePh=targetPh.GetRuleSource();
> int targetWordsNum=cur_hypo.GetCurrTargetPhrase().GetSize();
> std::vector <Word> source, orderedSource;
> std::vector <int> alignmentVector;
> std::vector <bool> isAligned;
>
> std::vector <std::set <size_t> > sourcePosSets;
>
> for(int targetP=0; targetP< targetWordsNum; targetP++ ){
> //std::cerr<<"setting alignments for targetword: "<<targetP<<endl;
>
> sourcePosSets.push_back(cur_hypo.GetCurrTargetPhrase().GetAlignTerm().GetAlignmentsForTarget(targetP));
> }
>
>
> for(int ii=targetWordsNum-1; ii>=0; ii--){
> std::set <size_t> cur_srcPosSet=sourcePosSets[ii];
> for (std::set <size_t>::const_iterator alignmet =
> cur_srcPosSet.begin();alignmet != cur_srcPosSet.end(); ++alignmet) {
> int alignmentElement=*alignmet;
> for(int index=0; index<ii; index++ ){ //keep the rightmost one and
> remove the othres
> //remove it from the list
> if(sourcePosSets[index].size()>0){
> // std::cerr<<" removing "<<*alignmet<<endl;
> //std::cerr<<" for set with size:
> "<<sourcePosSets[index].size()<<endl;
> sourcePosSets[index].erase(alignmentElement);
> }
>
> }
> }
> }
>
> for (size_t posT = 0; posT < cur_hypo.GetCurrTargetPhrase().GetSize();
> ++posT) {
> const Word &word = cur_hypo.GetCurrTargetPhrase().GetWord(posT);
> if (word.IsNonTerminal()){
> // non-term. fill out with prev hypo
>
> size_t nonTermInd =
> cur_hypo.GetCurrTargetPhrase().GetAlignNonTerm().GetNonTermIndexMap()[posT];
> const ChartHypothesis *prevHypo = cur_hypo.GetPrevHypo(nonTermInd);
>
> GetSourcePhrase2(*prevHypo,srcPhrase);
> }
> else{
>
> for(std::set<size_t>::const_iterator
> it=sourcePosSets[posT].begin();it != sourcePosSets[posT].end() ; it++
> ){
> srcPhrase.AddWord(sourcePh->GetWord(*it));
> }
> }
> }
>
>
> }
> _______________________________________________
> Moses-support mailing list
> [email protected]
> http://mailman.mit.edu/mailman/listinfo/moses-support
--
The University of Edinburgh is a charitable body, registered in
Scotland, with registration number SC005336.
_______________________________________________
Moses-support mailing list
[email protected]
http://mailman.mit.edu/mailman/listinfo/moses-support