我從初中開始基本上就是一個英語很爛的人,數理化再好有什么用,工作了,結果發現數理化都沒啥用,最有用的還是當年學的最爛的英語。於是在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形式,那么應該是現在進行時的語法形式。