由于要写解码器,为了省却麻烦直接调用srilm,注意事项如下:
(1)makefile文件中的头文件和库文件的顺序。
LM_DIR=/home/share/MT/srilm
LM_INCLUDE=$(LM_DIR)/include
LM_LIB=lm/liboolm.a lm/libdstruct.a lm/libmisc.a lm/liblattice.a lm/libflm.a (顺序不对话,一堆错误)
LM_OBJECT=IntervalHeap.o Map2.o Map.o NgramStats.o
$(CC) $(OBJECT) $(LM_OBJECT) $(LM_LIB) -o $(EXE_OUT)
(2)调用接口如下:
file_name是语言模型文件名称。
File fp(file_name.c_str(), "rb");
_vocab = new Vocab;
if(_vocab == NULL)
{
fprintf(stderr,"can't new vocab in %s %d/n", __FILE__, __LINE__);
return(false);
}
_lm = new Ngram(*_vocab, _LM_order);
if(_lm == NULL)
{
delete _vocab;
fprintf(stderr,"can't new LM in %s %d/n", __FILE__, __LINE__);
return(false);
}
_lm->read(fp);
(3)概率计算接口
概率计算接口为Ngram.h中的wordProb,参数为(word,context),非常要注意的是,context中的顺序为:“first second third ...”
first是立word最近的词,second是与word隔了first的词,不要把顺序搞混了。
context的最后一个元素必须为word_None表示结束。
感想:服了这些开放源码的人了,没有详细文档,只能看源代码。