2012年9月30日

2012年9月17日

第一次被大小写转换的sed命令坑了

昨天需要紧急测试一组翻译结果的得分,其中一个步骤是需要把一个文件每行的首字母大写。

网上查了一下sed脚本,参考的两个网页是

http://www.51testing.com/?uid-375540-action-viewspace-itemid-232269

http://www.pyshell.com/index.php/archives/699

得到的答案都是一致的  sed 's/[a-z]/\u&/'

简单测试了一下,也的确没有问题。

但是,这个小小的步骤导致最终我测试的结果都比正确答案少了10%左右的得分。

同事使用的首字母转大写的命令是   perl -ne 'print ucfirst($_);' inputfile > outputfile

仔细对比了多组结果,发现上面的sed命令存在Bug,因为sed 's/[a-z]/\u&/'实际上是将一行文本里出现的第一个小写字母转换为大写。

正确的sed命令应该是sed 's/^[a-z]/\u&/'    [a-z]前面加入的^表示匹配行首。

总结教训,以后再遇到网上找到的shell命令需要仔细的查看并测试后再用,否则很耽误工作啊。

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。

2012年9月8日

读书的习惯需要好好培养

我很喜欢读书,但读书的方法一直不得要领。小学时因为爱躺在床上看《故事会》眼睛早早的近视,初中毕业的那个暑假在市图书馆借阅了很多古龙的小说,高中看了很多《青年文摘》。真正开始读书,是进入大学,在图书馆的茫茫书海里徜徉的感觉非常好。
前不久看了一本书《如何阅读一本书》里面讲述的方法非常不错,一句话概括就是读书不能从头到尾一字不拉的精读,需要掌握书的逻辑和结构。
最近在看未鹏的《暗时间》,书中讲述了他阅读了大量关于人类思维书籍的过程。今天看到博客“战隼的学习探索”(http://www.read.org.cn/)作者的另外一个博客“读书笔记”里“每天一本书计划”(http://www.write.org.cn/plan-a-book-a-day)里那些FAQ式的内容,都是在讲述他如何读书以及如何抽时间读书的事情。再联想到我前不久认识的一位同事(现在回到北京IBM工作了)的读书方法:用Kindle每次批量阅读主题相关的书籍。这三个人的方法有共同点,就是大量读书,而且按主题阅读,并注意记录阅读心得。
接下来,我也想读书,我用Kindle陆续读完了七八本书,但读书的方法需要加强。恩,从现在开始吧。
引用一下战隼在“每天一本书计划”(http://www.write.org.cn/plan-a-book-a-day)结尾的三句话:

1、如果你只愿意去做轻松的事.生活就是艰难的。 但如果你愿意去做艰难的事情.生活就是轻松的

2、如何真的想做一件事,你一定会找到一个办法。如果不想,你也一定能找到借口

3、影响结果的不是斗志,而是科学