📄 tables-core.cpp.svn-base
字号:
// $Id$//#include "beammain.h"#include "tables-core.h"#define TABLE_LINE_MAX_LENGTH 1000#define UNKNOWNSTR "UNK"#define SAFE_GETLINE(_IS, _LINE, _SIZE, _DELIM) {_IS.getline(_LINE, _SIZE, _DELIM); if(_IS.fail() && !_IS.bad() && !_IS.eof()) _IS.clear();}// as in beamdecoder/tables.cppvector<string> tokenize( char input[] ) { vector< string > token; bool betweenWords = true; int start=0; int i=0; for(; input[i] != '\0'; i++) { bool isSpace = (input[i] == ' ' || input[i] == '\t'); if (!isSpace && betweenWords) { start = i; betweenWords = false; } else if (isSpace && !betweenWords) { token.push_back( string( input+start, i-start ) ); betweenWords = true; } } if (!betweenWords) token.push_back( string( input+start, i-start ) ); return token;}WORD_ID Vocabulary::storeIfNew( const WORD& word ) { map<WORD, WORD_ID>::iterator i = lookup.find( word ); if( i != lookup.end() ) return i->second; WORD_ID id = vocab.size(); vocab.push_back( word ); lookup[ word ] = id; return id; }WORD_ID Vocabulary::getWordID( const WORD& word ) { map<WORD, WORD_ID>::iterator i = lookup.find( word ); if( i == lookup.end() ) return 0; return i->second;}PHRASE_ID PhraseTable::storeIfNew( const PHRASE& phrase ) { map< PHRASE, PHRASE_ID >::iterator i = lookup.find( phrase ); if( i != lookup.end() ) return i->second; PHRASE_ID id = phraseTable.size(); phraseTable.push_back( phrase ); lookup[ phrase ] = id; return id;}PHRASE_ID PhraseTable::getPhraseID( const PHRASE& phrase ) { map< PHRASE, PHRASE_ID >::iterator i = lookup.find( phrase ); if( i == lookup.end() ) return 0; return i->second;}void PhraseTable::clear() { lookup.clear(); phraseTable.clear();}void DTable::init() { for(int i = -10; i<10; i++) dtable[i] = -abs( i );}void DTable::load( const string& fileName ) { ifstream inFile; inFile.open(fileName.c_str()); istream *inFileP = &inFile; char line[TABLE_LINE_MAX_LENGTH]; int i=0; while(true) { i++; SAFE_GETLINE((*inFileP), line, TABLE_LINE_MAX_LENGTH, '\n'); if (inFileP->eof()) break; vector<string> token = tokenize( line ); if (token.size() < 2) { cerr << "line " << i << " in " << fileName << " too short, skipping\n"; continue; } int d = atoi( token[0].c_str() ); double prob = log( atof( token[1].c_str() ) ); dtable[ d ] = prob; } }double DTable::get( int distortion ) { if (dtable.find( distortion ) == dtable.end()) return log( 0.00001 ); return dtable[ distortion ];}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -