Thursday, June 22, 2006

忙碌的日子

2006 转眼就过去了一半。 这半年对我而言是忙碌的日子。年初开始尝试用最大熵的方法写一个中文分词的程序, 虽然没有什么新的有创意的东西, 也就是当作一次学习最大熵方法的练兵。 导师看我对分词有兴趣, 于是告诉我说她对supervised的方法并没有什么大的兴趣, supervised的方法更多的是统计的东西, 并不反应语言学上的结构, 所以supervised learning 其实可以在很各个领域中使用, 而常用的几个supervised 方法现在也相对成熟, 很难有什么新的发现。 于是她建议我使用unsupervised 的方法做分词实验。

于是在二月份, 我开始用我从北大带过来的一些中文语料做切词实验。由于我们领域的最高级的学术会议 ACL/Colling 2006 的截稿日期就在月底,所以我只好抓紧时间加班干活。基本的Idea是导师的, 她原来已经做过一些小的实验了, 所以她其实很清楚每一步应该怎么做。 于是我在她的指导下很快编写完程序, 得到了结果并进行数据的分析。 然后匆匆的写完论文投到了会议上。虽然我的导师对我们合作的这篇论文挺满意的, 但是结果并不太乐观。 四月份的时候我们收到了通知, 文章被接收为 poster 而不是正式的会议文章。当然结果也并不坏,毕竟是领域的TOP 1 的会议。

三月到四月,我相对轻松些。因为刚刚忙完 ACL 的文章, 稍微休息了几天。然后开始写一个语料检错的程序,程序并不难,使用了suffix Array 作为基本的数据结构。 而我并不需要去实现这个核心的部分,在网络上找了一个ngram-tool, 里面很漂亮的用 C++ 实现了这个数据结构, 而且可扩展性很好, 所以我就在已有的代码的基础上修改。 自从在北大的时候用开源的软件包 Lucene 做过语料索引之后, 我一直就喜欢使用开源代码做工作, Linux 的世界异彩纷呈,网络上很容易找到很多优秀的源代码。 读懂别人的代码其实是一个很好的学习过程, 然后在此基础上扩展自己需要的功能。 程序写完了, 可以用来自动检测语料中的一些标注错误, 不过导师的评价是缺乏原创性, 从工程角度说这样的工具很有用; 然而很难基于这个工作发表高质量的论文。

五月初是日本的黄金周, 才开始两天, 导师就把我叫到学校并告诉我十二月份新加坡有一个东方语言处理的学术会议,可是论文的 deadline 是五月底, 让我抓紧时间把中文分词的工作做一个扩展, 把同样的方法使用到其他语言的切分当中, 包括日语、英语、法语等。然后在月底完成一篇论文投到新加坡的会议上。 于是只好马不停蹄的开始工作。 整个五月份全搭进去了, 每天都在实验室里写程序做数据处理, 包括周末, 没有一天能够休息。 因为 deadline 就摆在你的眼前,要完成任务只能和时间赛跑。 五月底,最后得到的结果并不坏, 导师基于我做的这些结果写了一篇论文在 deadline 的前一天发了出去, 并说现有的结果可以写一篇 Journal paper。

六月份, 导师和一堆的外国人合作, 写一本介绍输入法及其相关技术的书。她要负责中日韩输入法的发展历史这部分, 所以很自然的,就牵扯到我的头上。六月的前半个月,我帮导师写一份中文输入法的调查报告。 人在日本,缺乏必要的参考文献, 只能通过网络找一些资料。 还好有一个超星图书馆, 通过网络买了一张读书卡, 连接到数据库上还能找到不少的文献资料。 导师原本想让我和她合作, 并让我作为这一章节的合作作者, 可惜我自己不争气, 写出来的报告质量不够高,所以导师最后还是决定我不能成为作者, 但是她给了我三万日元作为工作的报酬。 虽然最后的结果让人觉得气馁, 不过自己对输入法这一块并不是很熟悉, 确实也不够资格做为合作作者。

和我导师合作的过程基本上就是一个挨骂的过程, 稍微犯些错误被她逮住了, 就会被骂个狗血喷头。有的时候真的是让我非常的郁闷, 长这么大都没被这么骂过, 而且有的时候骂人都不讲道理。 然后工作结束了, 论文也发出去了, 导师第二天就会向我表示道歉;并说工作做的不错,非常感谢, 如此等等。 不过现在也就基本习惯了, 知道工作之前要做好被骂的准备。而我这个人平常工作的时候比较马虎, 也容易换错误, 所以也少不了被骂。 所幸的是我的导师是个直肠子, 平常为人也比较直爽, 有什么说什么, 在日本人里面这倒是不多见。 而我经常只好对自己阿 Q 一把 :“天将降大任于斯人也, 必先苦其心智, 劳其筋骨,饿其体肤 ... ”

Tuesday, June 20, 2006

fork()

我太懒, 以至于半年都不愿意在blog上留下只言片语。
这样的状态实在是一种故步自封。 就像一个程序的
空循环
for(;;)
{
}

所以我还是决定给自己发一个break 信号, 然后重新
fork() 一个新的子进程。