2012年9月15日

Thunder-Decoder加上了Binarization功能

终于给我的层次短语模型翻译系统Thunder-Decoder加上了Binarization功能,一句话概括就是在内存中保留仅能完成源端Parsing的短语表的Trie树结构,将能完成目标端翻译的短语表特征和翻译存放到硬盘上,硬盘上的数据是内存中短语表Trie树中各个叶节点对应的内容。硬盘上的数据只有在需要的时候才会加载到内存中。翻译一定的句子后即可释放掉加载的硬盘数据。这样做的好处是可以让翻译系统在面对非常巨大的短语表时,可以自如应对。


这是我第一次实现类似的机制。为了尽量减少对其他库的依赖(例如Boost的序列化库),我自己实现了相应数据的序列化和反序列化。这个过程中犯下过一个起初不易察觉的低级错误,那就是直接把c++的string数据直接存到硬盘上。实际上存入的只是string的指针变量。如果程序中相应的string数据还未清空的话,fread回来后查看原先的string,居然还是完全正确的。发现这个Bug是在清空完数据后重新fread进来数据,再打印string的内容就变的千奇百怪了。


String数据的序列化需要先存入string的长度值,随后再存入string对应的内容,反序列化则是先读出长度值,根据长度值来读出string的内容。


后续还需要进行一下大规模测试。这次十多天的折腾受益颇多。感谢这个折腾我的Thunder-Decoder。

没有评论: