从一年前的计算语言学作业开始,我一直没明白,为什么我写的二元语法分词要比一元语法差。两天来我仔细分析了一下之前的实验细节,发现二元语法分词要超过一元语法,可以有两种方式:1.超大的语料;2.强大的平滑算法。

  实验采用北大人民日报1-6月语料,大约700万字,选其中90%作为训练数据,另外10%作为测试数据。先看下实验结果:

分词方法准确率召回率F值
最大正向匹配0.90400.91890.9114
一元语法0.92800.95020.9389
二元语法(+1平滑) 0.90930.92760.9184
二元语法(+eps平滑)0.91020.95290.9311
二元语法(删除插值)0.93170.96150.9463

继续阅读

  晒代码发布前,我们构想了 N 种吸引人来发代码的策略。后讨论认定,如果网站发布初期就有大量的代码作为基础,之后则更有可能吸引人来晒代码。就像某百科和某社区问答建站初期那样。

  本着这个目标,我试着用最简单粗暴的方法,尽可能多地从网上抽取出 ACM 代码。由于很多 ACMer 都会在网上开博客,博客里又很可能会写解题报告,有些解题报告会附上珍贵的 AC 代码。如果能把这里的 AC 代码都抽取出来,效果肯定会很理想。

  下面就简单介绍一下整个代码抽取过程。

系统框架

系统框架

继续阅读

这是半年前的事了,趁着开通博客,赶紧写下来,以免时间长了,什么都没留下。

视频链接

倒计时一年

  最早想做视频直播还在2010年秋季的赛季。当时对到赛场和人一决高下已经没有很大的动力了,只想试着让比赛变得更有趣一些。首先能想到的就是提供环境让大家围观,于是有了排行榜的场外直播。很快,排行榜上数字的变化满足不了大家的围观欲望,于是开始构想网络视频直播。

  其实网络视频直播在近年ACM-ICPC World Final的比赛中均已采用。每次世界总决赛,主办方都会和当地媒体合作,拍摄比赛实况,并在网上直播。既然Final能做,赛区赛肯定也可以做。可惜如果由我发起的话,只能使用超低成本的设备和技术,做“山寨直播”……

继续阅读

这三天都在看JavaScript的闭包,终于有点眉目了。

动力

去年在看《黑客与画家》的时候,被里面对不同编程语言描述能力的差异所吸引。
里面描述了if-else、函数递归、闭包、宏等多个语言的抽象层次。
既然闭包是语言的一种重要抽象,我决心要弄清楚是怎么回事。

方法

从JavaScript入手,是因为对js的基础语法还比较熟悉,从这里开始看起容易接受。
按照网上的说法,犀牛书(《JavaScript权威指南》)介绍js的闭包非常清晰易懂,我就从此书看起。主要就看了第四章变量和第八章函数。
但是闭包的最后一个例子不能理解,于是又搜到了一个书评,这个解释很受启发。
另外还有所谓闭包.pptx,这个只是浏览了一下。

认识

花了三天时间,回想起来,从看js的变量作用域,到理解函数作为一个对象,可以被随意传递从而发生的各种“匪夷所思”的事,对闭包逐渐有了脉络。
现在觉得闭包这个称呼也很贴切:一个函数带上它周围的变量包成一团封起来(不过一般习惯上这个函数就叫闭包了,并没把附带周围的变量叫到一起……)。里面的变量逃不出去,不会污染外面的变量名;外面也没法攻入,垃圾回收不能随意收回里面的变量。这团闭包还独立地存在着,携带着里面的东西,帮着别的对象完成一些功能。
犀牛书的前两个例子就是说明了外面没法直接访问闭包内的变量,必须通过指定的方法来访问。相当于class中定义了private的变量。但是这里并不像C++那样,让编译器去识别某个变量外部能不能访问,而是直接通过语言本身的特性,让外面没法访问到。这种设计让语言更为精巧。
第三个例子是利用了闭包可以携带周围变量,构造了一个调试工具。

虽然自认为理解了闭包的原理,不过到灵活运用还有很长的路要走。推崇lisp的人鼓励使用闭包,现在还很难理解那种函数式变成的思考方式。期待有时间进一步学习更抽象的语言。