找出字幕中的生词

April 13th, 2010 | by vvoody |

写了小程序(pickupnewords.py)可以找出文本中的英文生词,比如你在观影前可以找出英文字幕中你不认识的单词,逐一查明,这样就不会边看边查字典了,打扰你欣赏电影了 ^_^

程序最新源代码在github。下面简单说明一些关于这个程序的东西。

我这程序肯定无法强大到能读取你大脑的信息得知你认不认识某个单词,它要借助本地存储,其实就是一个用pickle模块把你已经认识的单词集合写入到一个文件里,程序因此有了依据。当然了不可能把’is’、’apple’这样的词也判为生词,因此得有个基础单词库,我用的是Oxford 3000 wordlist,这个是牛津字典的单词释义所用的基础单词,我已经把它转换好了,文件名是oldwords.dat。一个没有记忆不会学习的人是可怕的,程序也是如此,这是我下面要讲的。

许多英语达人的词汇量肯定不止3000,所以在初期运行这个程序你会发现有好多单词你都认识,或者日后某些单词反复出现,慢慢你已经熟知了,那么就需要让程序记住这些单词。pickupnewords.py提供了一个非常简单甚至简陋的命令接口,告诉程序哪些单词需要记忆。再列出可能的生词列表后,程序会等待你输入指令了。你能输入的指令有下列几种:

  • 0,9,13, 21
  • 生词列表的每个单词前都有个序号,你输入了哪几个序号程序就会记住对应的单词

  • !0,9,13, 21
  • 这个仅仅比上面的多了一个感叹号“!”,它的意思就是相反,除了感叹号后面列出的序号对应的单词都要记忆

  • all
  • 记住所有列出的单词

  • !!all直接回车
  • 不记忆列出的任何单词,它们都是生词

使用方法:
下载pickupnewords.py和oldwords.dat,运行:

python pickupnewords.py /path/to/your/english.srt

注:本程序只支持srt这类的纯文本环保格式。
任何问题建议欢迎留言 ;-)

===== 补充 =====
单词的分词处理的十分简单,能去掉字幕文件中无意义、非英文单词的部分,但对于诸如”I’ve”、”shouldn’t”识别为一个单词,”copied”、”driving”这样的过去分词和现在分词仍然作为生词,虽然原型是非常基础的单词。Python应该有好的分词库(我了解的不多,如有好的也请推荐),但我不想把事情搞的太复杂了,我们完全可以把这些词让程序记住,或者干脆忽略,反正除此之外能找出真正的生词就行。

Update 4-21:
@weakish 在下面的留言说的很对。其实这个程序离真正可用还很远,还需要优化。

  1. 11 Responses to “找出字幕中的生词”

  2. By bartender on Apr 13, 2010

    Android Browser Android 2.1 Android Browser Android 2.1

    我看dvd怎么办,谢谢

    Reply

    vvoody Reply:

    Mozilla Firefox 3.6.3 Linux

    你丫就是个字典,不算。

    Reply

  3. By weakish on Apr 21, 2010

    Mozilla Firefox 3.6.3 Mac OS X Mozilla Firefox 3.6.3 Mac OS X

    話說,這個噪音太多了吧。所有復數形式,所有格形式(‘s),過去分詞,現在分詞,甚至有的字幕逗號後面忘了空格,這些都會作為生詞處理。

    Reply

    vvoody Reply:

    Mozilla Firefox 3.6.3 Linux

    确实,因为如果要去掉这些噪音的话 得添加额外的分词库,估计还得再带个词库啥的…

    下一步准备在分词方面优化, @weakish 这方面有好的库推荐么?
    非常感谢测试 ;-)

    Reply

    vvoody Reply:

    Mozilla Firefox 3.6.3 Linux

    @weakish
    “字幕逗號後面忘了空格”是什么情况?

    Reply

    vvoody Reply:

    Mozilla Firefox 3.6.3 Linux

    明白了,ta..ta…tad…taxidermist 这样的对吧

    Reply

  4. By weakish on Apr 21, 2010

    Mozilla Firefox 3.6.3 Mac OS X Mozilla Firefox 3.6.3 Mac OS X

    胡思亂想,僅供參考:

    我覺得這個需求和拼寫檢查很類似。

    挑出生詞,就是挑出詞表裡沒有的詞,和挑出拼寫有誤的詞是一個原理。

    讓程序記住詞,就是加詞到詞表裡,和拼寫檢查中把劃線的詞加入字典是一個原理。

    然後,拼寫檢查的庫,已經處理了分詞問題,還有各種變體的問題。

    那麼,是不是可以用拼寫檢查的庫來處理呢?比如,PyEnchant (不是標准庫,不過貌似常見的發行版都打包了。)

    然後,就是詞表了。Oxford出版社官網上有個檢測程序,就是貼一段文字,高亮出不在Oxford 3000裡的詞匯。我試了,steps不高亮,sheeps就高亮。說明Oxford內部肯定有一張包括了各種變體的Oxford 3000詞表的,可惜不公開。

    退而求其次,下面的這個詞表,是1500個基本英語單詞,1000個英語常用詞,以及VOA慢速英語用詞的合集。這個詞表是simple English Wikipedia條目撰寫者用的,算是一種特殊的拼寫檢查詞表。

    http://www.basic-english.org/down/readwiki.html

    Reply

  5. By weakish on Apr 22, 2010

    Mozilla Firefox 3.6.3 Mac OS X Mozilla Firefox 3.6.3 Mac OS X

    Mac OS X好久沒打理了,所以裝個pyEnchant就要編譯一大堆依賴。等pyEnchant編譯完了都到了睡覺時間了。

    今天又搗鼓了一番。我上面給出的dic,不知道是不是因為是for Windows的緣故,夾雜著一大堆奇怪的字符。我把這些鬼畫符刪掉了,重新生成了一個。還有那個aff,都紊亂的,我到網上下了個en_US.aff替換了,反正前後綴的處理,英語都一樣的。

    remove words功能去掉了。因為現在詞表是文本文件了,可以直接編輯了。至於那個原始dic檔,都是基本詞,應該一個用功的高中畢業生都差不多能掌握,在裡面remove words也沒必要。

    然後就遇到了奇怪的問題,每次運行都會把私人詞表清空。後來發現竟然是enchant的bug: http://bugzilla.abisource.com/show_bug.cgi?id=12350

    要很新的enchant纔可以。

    具體見:
    http://github.com/weakish/helloworld/commit/60d69cf0ec707a8c2df1f283b75183fcce6acd02

    Reply

    vvoody Reply:

    Mozilla Firefox 3.6.3 Linux

    非常感谢!

    我测试了你写的,有几个疑问:
    1. 那个en_BE.dic好多单词后面拖着的DJMS、DGJMRSTZ是代表啥?和分词有关吗?
    2. 现在似乎依然不能很好的识别出”復數形式,所有格形式(’s),過去分詞,現在分詞”, 举个例子,eat这个词在en_BE.dic里,但没能识别出现在分词,把eating判作新词。同样的还有called、died。不过像memories倒没有判为新词,我发现en_BE.dic中memory后跟了’/MS’,是不是程序靠这个判断它的复数形式?
    3. pyenchant或者enchant到底是靠词库来判断复数形式、各种分词形式,还是能根据词性来智能判断出它的?比如bump这个词不在en_BE.dic里,那么程序学习后是只要记录’bump’就能判断出’bumping’、’bumped’呢?还是要额外记录’bumping’和’bumped’呢?

    我觉得靠拼写检查程序来判断单词是否正确是建立在庞大的词库上的,但如果要让它来判断新词,由于初始词库太小,噪音还是不小,还得靠后期慢慢记忆,感觉和我一开始写的殊途同归了。

    Reply

    weakish Reply:

    Mozilla Firefox 3.6.3 Mac OS X

    1,那些flag都是表示單詞的性質(變化規則),比如drink/S就表示名詞drink可以加s成復數。具體
    man 4 hunspell。

    2,嗯,字表裡的eat後面沒有flag,這個應該屬於字表不完善。唉,找不到一個真正合適的字表。

    3, 參見1。enchant和ispell這種初級階段的字典不一樣,不是把每種變體都作為不同的詞列出來。而是用flag表示,比如復數、三單、un等否定前綴,ness等後綴等等。

    唉,關鍵還是要有一個好詞表。

    Reply

    vvoody Reply:

    Mozilla Firefox 3.6.3 Linux

    嗯,拼写检查前提就是要有张好的词表,无论是包括一个词的所有形式还是用flag。不过提取新词受限于初始词库诶…

Post a Comment

To submit your comment, click the image below where it asks you to...
根据下面图中的提示点击后提交留言... Clickcha - The One-click Captcha