首页 > 推荐 > Compling期末完结吐槽

Compling期末完结吐槽

现在是二零一七年六月八号,地球另一面的最后一批九零后们正在高考的战场上奋笔疾书,而我,刚刚期末渡劫完毕,阶段性飞升为暑假逍遥仙的我,正以咸鱼一般的姿势趴在我没有空调没有电扇乱的花自飘零水自流的房间里,困并失眠着。


尽管期末神特么四门课同一天死线,赶项目和论文赶到大脑几乎短路,回顾这个混乱而充实的学期,我还是感到相当的愉快。大学生活最美好莫过于如此,学自己喜欢的东西,做自己喜欢的事,忙忙碌碌里时不时潇潇洒洒地偷几个半日的闲,风风火火里偶尔鬼鬼祟祟矫几个五毛钱的情,作天作地之后嗷呜惨叫一声跑回电脑前勤勤恳恳赶due,一边赶代码一边默默鼓励自己是全世界最机智的宝宝。


特别值得一提的是,这学期我终于如愿以偿的上了传说中的Ling/CSE 472,计算语言学入门。本宝宝对计算语言学这个看上去高端实际上也很高端的学科垂涎已久,一开始选课就火速报了名。然而实际上完全没有必要——虽然广大人民群众一开始都对此课充满了向往和热情,然而学期刚一开始就火速退课了靠近三分之一的学生。开学初三十多个课友,期末来做项目一期结果演示的只剩下了十九个。


对于这种非自然现象奇观,我们可爱的Emily教授有着不可推卸的责任。Emily是本校计算语言学项目的杠把子,一个自带二倍速和使懵比技能的奇女子,“智商和语速成正比“江湖传说的活例。如果说进阶句法课少听五分钟如同全世界在你面前呼啸而过,冰雹噼里啪啦砸你满脑袋你都不知道什么时候起的风,那么她的课就是少听一分千古恨,再回首已是百年身——前提是你得听的懂。


如果说Emily是自带使懵比技能的女人,那么助教David就是带解懵buff的男人。众所周知,美国学生的“虚张声势“种族天赋满点,在Emily教的讲座课上永远摆出一副专业大神的姿态,每个发言的气势都宛若计算语言学学会研讨现场,张口闭口机器学期和语言模型,搞得正在懵比的中国学生目瞪口呆,听懂了Emily都未必听的懂他们的绝世高见(说真的,其实这种自信和气势其实很值得中国孩子学习)。然而这群大神们一到David的辅导课就纷纷现形,提出的问题直接从“计算语言学的终极目标是什么?”跳到“怎么在终端里打开文件”。David是那种聪明,耐心而且解释能力强的理想助教,不管问题白痴还是复杂都能简洁地讲的人豁然开朗。不过就连他偶尔也会被Emily极致简约风的作业明细搞得莫名其妙,可见Emily的懵比技能之强悍。


此课没有期末考,但是有一个很要命的期末项目,可以单干或者双人组。我因此而认识了我可爱的搭档L。L是中文系研究生,中国人,难得的轮廓深邃的漂亮姑娘。我们两个蒙比的中国人一个中文系一个语言学系,计算机背景直接被同班秒成渣,从项目初步设计阶段方到了项目最终提交阶段,回想起来真是梦一样的经历。


吐槽我们的项目之前让我先简单科普一下语言学和计算语言学。首先,让我再次,再次的强调,语言学不是学语言,语言学不是学语言,语言学不是学语言,重要的话说三遍。语言学是针对语言的理论性研究,是一门科学。它与物理化学之类的科学没太大核心上的区别,只不过研究对象从自然现象改成了语言而已。而计算语言学,从名字上就可以得出,是计算机与语言学的结合,是研究如何让计算机处理语言文字的学科,它的应用极为广泛,从语音识别,机器翻译到我们所最熟悉的搜索引擎,都是计算语言学的产物。


计算语言学不仅仅使用语言学理论,还杂糅了很多统计,数学,计算机等等的知识。其中最基础的就是Ngram语言模型。该模型基于这样一种假设,第N个词的出现只与前面N-1个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料中统计N个词同时出现的次数得到。常用的是二元的Bi-Gram和三元的Tri-Gram。Ngram的复杂性(Perplexity),是一个ngram语言模型预测能力的指标,简单的来说,perplexity越大,说明Ngram的准确性越低,也就说明用来建立Ngram模型的数据和测试数据相似度越低。比如说,以福尔摩斯探案集为基础建立的Ngram模型,针对同系列作品《最后的致意》的perplexity会比针对柯南道尔其他作品的perplexity低,而针对柯南道尔其他作品的perplexity会比针对其他作家作品的perplexity低。(做为一个句法粉,我其实不是很喜欢ngram,总觉的是统计的数字游戏,作弊的笨方法)


其实我和L最初的项目设想是做一个古体诗辨认程序,根据古诗特有的声韵规律和排版形式进行核对,从而辨认出一首诗是现代诗还是古体诗。做为两个计算机渣我们实在是觉得这个项目有好玩有具有挑战性,无奈被David无情的打回,原因是没有错误率。。。没有错误率。。。


说到错误率,计算语言学的运用有很重要的一点需要我们这些从基础编程课上过来的小菜鸟们适应的,那就是无法做到完美。如果你的算法可以完美的解决一个问题,那只能说明这个问题是比较低级的。


为了安抚我们失落的小玻璃心,David给出了他的建议——做一个中文现代文和古文的Ngram辨认器吧!


不得不说,本宝宝当时天真的懵了一懵,因为这个提议在我心目中太简单了。毕竟做Ngram的程序学校已经提供了,我们似乎只要收集数据,分别做现代文和古文的两套模型,对比perplexity得出结过,然后进行检测就可以了。


什么叫Too young,too naïve啊。。。


话是这么说,可是这个项目有无数个bug。其中第一个就是中文的电脑编码。中文不是字母文,和英文常用的ASCii不同,通常也不以国际通用的UTF-8编码,而是GBK或者GB2312等。我的电脑是在美国买的,好长时间里都拒绝接受GBK编码,以至于我电脑里所有的中文txt格式文件打开都是乱码。而学校系统也不接受GBK编码,完全无法进行处理。这个知识我和L一开始当然都是不懂的,最后在崩溃的零界点才百度出了原理,然后又百度出了转码方式,成功的把所有文件都转成了UTF-8。


第二个是中文的词语切分。英文是不存在这个问题的,因为英文的单词之间有空格。而中文因为没有空格,一串没有空格或分行隔开的字符会被系统自动默认为同一个词。这一点我最初其实想到了,可是从不坑爹的David居然坑爹了一会,信誓旦旦的和我说系统默认一个中文字是一个词,不需要任何切分。而L目睹了我无数匪夷所思的测试结果,抱着试试看的心态给一个小文件手动加了空格。然后,然后当然就可以了。。。


指望就这样顺风顺水的解决掉当然是不可能的,很快我们就遇到了第三个问题,怎么加空格。。。


这个真的不能怪我。我们其实学过利用正则表达式英文的句子切分,但是中文的正则表达式怎么谷歌都谷歌不出所以然来,钻入正则表达式牛角尖的我丧的在电脑前长吁短叹。而全世界最机智的宝宝L,进行了百度,“如何给中文加空格”。。。说真的,她搜到解决方案的时候我的内心简直有一万条檀木飘过,每一个都是炫彩加粗的“这特么都行”。。。


方案一是用word,对,就是你电脑桌面上的那个word,比尔盖茨家的经典产品,word。据说Emily在听L说我们用word进行切分的时候十分符合她不高冷形象的失声而笑。不过反正我们后来学会(仍旧是百度)了如何用python代码进行切分。不过不管如何,在不需要提交完整程序代码的第一阶段,我们用word完成了所有处理,以昭明文选(一百二十五万字左右)和二十世纪十位著名作家(一百三十万字左右)的作品集合(我们手动整理的,累死了)为基础建立了两个语言模型,并对分割成数个一百行小文件的古文观止和现代文集等数据进行测试,得到的结果——


准的要命,完全无错。


前面说过,计算语言学现阶段不可能有完美的算法,而且Emily和David也不喜欢过高的准确率,像这样下去,肯定是要丢分的。


于是我们进行了漫长的找茬之路,到处找可以被“误会”的文字,什么红楼梦(白话文),梁启超(一会儿白一会儿古),大秦帝国(历史小说),甄嬛传(古代背景网络小说)。。。然而我们的模型在现代文上的表现仍旧完美,只有在和红楼梦的白话攻势下终于出了两个错。。。


这就是我们的Stage 1。我们进行演示的时候,全班同学看着我们的测试结果友善地笑出了声。Emily提议,Stage 2可以做小句子的区分,因为被测文件越长,正确率越大。


我们原先的计划,第二阶段会使用专业的中文切分工具对所有的数据进行更科学的切分,从而提高准确率。然而结果却令人大跌眼镜。专业切分过后的建立的模型,尽管在古文检测中表现稍微好一些,在现代文判定上远逊于阶段一的模型。我们的内测数据是古文现代文各七百个4-18的字的小句子,Stage1模型在能够辨识出六百多个现代文句子和三百多个古文句子,专业切分后的模型只能测出四百多个现代文和四百不到的古文。仔细一想其实也很合理,因为单字切分分开了许多多字词语,而多字词语中几个字相连的几率比两个独立的词相连的可能性更大。


然而宝宝是不会放弃的!在进行无数令人崩溃的修改和对比之后,本宝宝灵机一动想出了一个无比机智的改进方案!!!


首先,从原先单一类型的模型增加到三组单个表现最好的不同模型,即两组不同N值的单字切分模型,一组专业切分模型,由三组模型同时测试同一个句子相对应的切分版本,得出三组不同的perplexity差。原先单单以perplexity差的正负判定类型,现改为将各perplexity差除以各字的绝对值,得到三个1或者-1,有这三者相加,可能的合有-3,-1,1和3四种,再以这个值的正负来判定类型。换句话来说,就是三局两胜。


这个修改只微微提高了系统的准确率。因为所有模型都有一个很致命的问题,那就是所有古文模型都会给出更高的perplexity值。在古文现代文数据量相同的测试中,现代文模型给出的perplexity平均值只是现代文的37%-61%。


找出问题关键所在那就好办了嘛!虽然没有什么强有力的理论支撑,我的自学水平的统计学也学的水的不行,但是直觉告诉我,只要每次给古文模型给出的perplexity乘一下这个系数再进行比较就好了嘛!宝宝真是全世界最机智的宝宝!

修改过后在内测数据上的表现几乎是奇迹,在最终测试数据上的表现也极佳(Stage1算法最终测试数据上表现也还不错),F-measure(不想解释了因为太麻烦了,大家只要知道它是一个表示精确程度的数值就可以了,有兴趣请百度)从91.1%和89.6%(因为有两种类型所以是两组)提高到了94.9%和92.7%,总之还是很不错的!!!


人生第一次做这么好玩的项目,嗨的完全停不下来。期末还有一个论文一个总结和两个考试的我简直定不下心复习和码字,别的科目学一会儿就忍不住重新打开textwrangler和终端敲代码和测试。最终提交后赶到由衷的喜悦——我和L两个计算机小白,从连字符编码都不知道到能够完整的写出一个高准确率辨识器,想来也不过是三个多星期的时间吧!不管最终成绩如何,此刻的我真的是很有成就感了。


语言学(语音学除外,我的耳朵根本听不出齿间t和普通t的区别。。。)和计算语言学对于我,都是很有魅力的学科,浪漫而理性,有趣而严谨。能学习自己喜爱而且较有天赋的事物,真是一种奇妙的幸福。


(告诉大家另一个心得:谷歌,百度,stackoverflow拯救世界。)


友情链接