我从初中开始基本上就是一个英语很烂的人,数理化再好有什么用,工作了,结果发现数理化都没啥用,最有用的还是当年学的最烂的英语。于是在2011年年底开始了学习英语的课程,在学习的过程中,外教经常会放英剧美剧给我们看,看了以后回答问题,讲解,挺有意思的。印象最深刻的就是Neil给我的Doctor Who还有另外一个外教放的Friends。后来在课程快结束的时候,萌发了一个想法,能不能只看英文字幕来看美剧(当然还有英剧),这样没有中文字幕的话才能在看美剧的过程中联系阅读与听力。但是美剧中很多词汇不懂,一旦句子中出现了两个不懂的词汇,那么这句话基本上就不懂是啥意思了。那么我能不能根据我的实际词汇量,对字幕就行修改,如果是认识的单词,那么就不管,如果是不认识的单词,那么就给出其中文意思,这样能够便于理解整个句子,而且在潜移默化中慢慢的提高词汇量。
一年多前萌发的这个想法,于是按照这个思路写了一个字幕注释的小程序,可惜只写了一大半,然后由于工作的原因,就停了,最近突然想起这个东西,于是想能够把这个程序完成。(最近射手网和人人字幕组的关闭,让我觉得这个软件的必要)
整个程序的设计思路是这样的:
1.第一次运行这个程序时,需要设置词汇量,根据柯林斯词典提供的词频分级表,按词频分成5到0级词汇,0级最难最少用,5级最常用。用户根据对自己的估计进行选择,如果英语烂,那么就选择只认识5级词汇。如果英语不错,过了四六级那么可以选择4级或者3级,如果是英语专8水平啥的,可以选择更高级的词汇。选中后就会把这些等级的词汇记录到已认识的词汇表中(如果有些词不认识,可以通过用户词汇管理功能进行调整).
2.提供生词本导入功能,如果用户是开心词场,有道词典之类的软件的用户,那么可以将这些软件的记录导入到这个程序中,便于完善用户自己的认识和不认识的词汇列表。
3.用户下载带有英文字幕的srt或者ass格式的字幕文件,这个字幕文件可以是全英文的,也可以是中文英文都包含的,程序会将中文字幕全部移除,只保留英文字幕部分。
4.对英文字幕中的每个句子进行转换和分解,分解成词汇,然后用分解出的词汇和用户词汇表进行比对,如果发现是用户认识的单词,那么就忽略,如果是用户不认识的单词,那么就查询字典(默认采用的是维科英汉词典10W词汇,基本满足日常词汇需要),得到该单词的中文解释,如果词典中查不到这个词,那么就忽略,查的到就显示出来。
5.用户根据显示出来的所有词,再选择哪些是认识的,如果认识就可以标记为认识,以后也不会被注释。如果是不认识的,那么可能这个词存在多种注释,用户可以选择哪种注释在这个句子中更合理。
6.根据用户选择,把英文字幕进行替代,不认识的词汇会在旁边加上简短的中文注释。如果用户觉得整句话都很难,想把整句话都翻译了,那么可以调用网上的翻译服务(有道,百度,微软,谷歌),对整句话进行翻译。
7.用户可以进一步在界面上手工调整注释后的字幕,然后只需要保存这个替换后的英文字幕,然后用播放软件导入这个新字幕即可。
在编写这个程序的时候,遇到了很多关于英语上的问题,挺有意思的,下面列举一下:
1.如何得到一个单词的原型。
英语单词有很多种变形,比如复数+s/es,过去式+ed,现在进行时+ing,比较级+er等,我们一般不会说认识单词do,却不认识单词doing,程序必须找到doing的原型do,然后再到用户词汇表中去查用户是否认识do这个词。这个我之前的处理办法很复杂,现在的处理办法很高效,很实用。
2.如何知道一个词是人名/地名。
在美剧中必然会大量的出现人名地名啥的,如果人名本身没有其他意义那还好说系统会忽略,但是如果人名有其他意义就会对整个句子的意思造成影响。比如He is Bush.这么一个句子,如果把Bush作为单词,那么就会翻译成“他是灌木丛”,这也太搞了,这里程序应该意识到Bush是人名,对于人名就不需要翻译。怎么知道一个单词是人名呢?我目前的做法简单粗暴直接,维护了一个常见的人名列表,如果首字母大写的,那么就查询这个人名列表,存在则说明是人名,不存在就当普通词汇处理。地名目前没有维护,没有处理,毕竟地名出现的频率没有人名高。
3.对于一词多性多义,怎么判断取哪个意义。
有些单词既可以做动词用,也可以做名词用,当名词时和动词时的意思完全不一样,这是一个问题。比如book,可以做n.那么就是书的意思,也可以做v.那么就是预定的意思。这两个意思毫无关联,那么怎么确定一个句子中的book到底是哪个http://blog.sina.com.cn/s/blog_48b0011f0102v6zc.html意思呢?
一个是看是否变形,如果是booking或者booked,那么这是动词的变形,所以必然取动词的解释:预定。
二是看前后单词的词性,如果book的前面是adj.那么这里的book就是名词。
三分析整个句子,看book是做谓语还是主语/宾语,如果是谓语那就是动词,主语宾语就是名词。
4.对于一词多义,而且词性还相同,那怎么取。
这个有难度,我程序没办法解决,把每个意义都列出来,让用户根据上下文,自己选择。比如I like this date.这里Date可以是日期的意思,可以是约会的意思,也可以是枣子的意思,从语法上讲都是对的,只有根据上下文,让用户自己选择。
5.原型和变形是两个单词,那么怎么决定采用原型还是变形。
比如comforting是令人欣慰的意思,adj.,但是如果查原型comfort,只有n.和v.所以不能将comforting转换成原型再查下其意思,在作为形容词的时候,必须保持这个形式。还是只有从词性入手,如果是形容词,那么后面应该跟名词,如果是动词ing形式,那么应该是现在进行时的语法形式。