Anki系列-用Anki準備GRE
背景
其實我從2010年就開始接觸Anki了夸溶。但那個時候弄跌,由于自身非常懶惰抄课,對Anki的使用也是形式大于內容稿黄。而且那個時候并不會Python喊衫,也不知道正則表達式,所以在制作卡片方面進展緩慢杆怕。久而久之也就不了了之族购。
2014年,出于對機器學習的興趣陵珍,我自學了Python寝杖,為大規(guī)模制作卡片打下了編程基礎。2015年互纯,閑暇時我用IOS上的Pythonista寫了個簡單的背單詞軟件朝墩。那個時候面臨沒有高質量詞庫的尷尬。我印象中伟姐,最有挑戰(zhàn)性的單詞書就是琦叔的《再要你命3000》了收苏。于是從網上找到PDF版本,摸索著如何將PDF里的內容整理為軟件可用的數據格式愤兵。這一過程伴隨著對正則表達式的大量使用鹿霸。但由于網上流傳版本自身內容的缺陷,這一工作也無疾而終秆乳。直到最近懦鼠,我發(fā)現(xiàn)Amazon上開始出售一系列詞匯書的Kindle版本,于是相繼購買了《GRE核心詞匯考法精析》《GRE核心詞匯助記與精煉》《GRE高分必備短語搭配》的Kindle版屹堰,然后用calibre轉換成txt格式肛冶,最后再用python來將txt處理成Anki可用的導入文件。Kindle版的書籍格式是AZW3扯键,每個章節(jié)其實就是一個網頁(HTML)睦袖,處理起來要比PDF容易太多。而且書籍內容也有專業(yè)的校對人員把過關荣刑,所以內容質量上不用擔心馅笙。我設計的詞庫的主體結構來自于《GRE核心詞匯考法精析》,整個制作過程輕松愉快厉亏。后來又加入了《GRE核心詞匯助記與精煉》和“不擇手段背單詞”的內容董习,以及單詞的發(fā)音。
在這里爱只,我想提醒讀者注意版權問題皿淋。我們購買的電子版書籍,嚴格來說只是購買了在指定閱讀平臺上閱讀該書籍的權利。對于書籍電子文件的一切修改行為窝趣,都算侵犯了版權蔗喂,更遑論破解之后放到各大論壇上的共享行為了。所以高帖,在這里,我并不會提供制作好的Anki詞庫畦粮。但我會分享制作詞庫的腳本文件散址。這樣,你只需購買了相關書籍宣赔,便可以參照我寫的程序制作自己的Anki詞庫了预麸。如果你覺得太麻煩,可以去下載這個共享Deck儒将,相信能滿足你的大部分需求吏祸。最后,我希望大家能在力所能及的范圍內去支持書籍作者钩蚊。
另外贡翘,琦叔團隊放出的電子版可以通過關注琦叔的微信公眾號獲得∨槁撸或者直接訪問這個百度網盤鏈接鸣驱。不過,既然免費蝠咆,就不完美踊东。且不說水印,內容上也會有很多錯誤刚操。所以并不適合提取數據闸翅。相信之前提到的共享Deck也是根據這個免費版本制作的。
工具箱
Kindle for PC
必備菊霜。買過的Kindle電子書都會出現(xiàn)在這個軟件中坚冀。下載到本地后,可以到C:\Users\你的用戶名\Documents\My Kindle Content
中找到源文件鉴逞,文件名為*******.azw
遗菠。這個文件就是所有數據的最終來源。-
calibre
轉換工具华蜒。將*******.azw
拖入calibre后辙纬,自動完成去版權保護的操作。然后右鍵書籍封面叭喜,選擇convert books贺拣,convert individually,輸出格式output format選txt即可。見下圖譬涡。
calibre有非常豐富的轉換選項闪幽,這里請將Formatting從
txt改為markdown。其他不變涡匀。
轉換完成后盯腌,右鍵書籍封面,選擇open containing folder陨瘩,txt所在的文件夾會被自動打開腕够。以《GRE核心詞匯考法精析》為例,其文件名為
GREHe Xin Ci Hui Kao Fa Jing Xi - Chen Qi.txt
舌劳。這個文件就是我們要通過程序處理的文件帚湘。給大家看一眼它的內容。
- python
核心工具甚淡。我使用的python開發(fā)環(huán)境是Anaconda大诸。集成了jupyter notebook。 - Anki
Note的結構
學習講求循序漸進贯卦。琦叔的單詞書资柔,一個單詞下面有太多內容,不可能一次性全部識記撵割。最簡單的想法建邓,如果一個單詞有n個釋義,那么就拆成n個Note睁枕。每個Note都有如下字段官边。
word_uid
單詞的唯一標識。由單詞拼寫加上用法序號構成外遇。具體解釋見下注簿。另外,Anki中跳仿,我選擇了“sort by this field in browser”诡渴,即所有的Note也以這個字段的值為自己的唯一標識。word
單詞的拼寫菲语。比如單詞abandon妄辩,拼寫就是abandon。-_-usage_index
單詞的用法序號山上。很多人初看起來眼耀,覺得這個設計不合理。這不是加重記憶負擔么佩憾?原本我只需要背有哪些用法即可哮伟,現(xiàn)在還需要被對應的序號干花。我想說,是你打開的方式不對楞黄。仔細想來池凄,當一個卡片的正面問你,abandon的第一個用法是什么時鬼廓,你直接想到的一定是abandon的所有已知用法肿仑,按熟悉程度排序。都回憶起來后碎税,你只需看看背面的答案在不在這個腦中的用法列表即可尤慰。不在,相當于答錯蚣录;在,相當于答對眷篇。而這樣做的好處是萎河,如果你對abandon的“放縱”用法非常不熟悉,總是答錯蕉饼,那么軟件可以在盡量短的時間間隔內只讓該用法再次出現(xiàn)虐杯,以加固你的記憶。而且能強迫你將精力集中到這一種用法昧港。我使用別的記憶軟件擎椰,在用到一詞多義時都會非常困惑和猶疑。如果我回憶起了abandon的四種用法创肥,但忘記了“放縱”的意思达舒,那究竟算答對還是答錯了呢?使用usage_index叹侄,這種困惑迎刃而解巩搏。phonetic_symbol
單詞音標word Audio
單詞的發(fā)音文件所在位置part_of_speech
單詞詞性mynotes
自己添加的筆記。比如如何記憶單詞的心得explanation_en
單詞解釋的英文explanation_cn
單詞解釋的中文explanation_encn
內容完美再現(xiàn)原書格式explanations_other
其他釋義趾代,同時包括中英文贯底。Anki不支持多Note間共享Field,而我將多義單詞按釋義拆分撒强,這就會引發(fā)一個問題禽捆。在你第一次碰到某單詞的新釋義的卡片時,你可能已背過該單詞的某些其他釋義飘哨,如“停止做某事”胚想。那么查看答案時,你常常會想確認下其他釋義有沒有背錯芽隆,所以最好把單詞書中的其他釋義都展示出來顿仇。另一個目的在于淘正,多義單詞都有一個基本義,其他釋義基于基本義引申出來臼闻。所以呈現(xiàn)其他釋義鸿吆,可以輔助你對當前出現(xiàn)的釋義的理解。example_en
例句英文述呐。將例句的英文部分拆分出來惩淳,可以方便卡片設計。比如乓搬,你可以設計中譯英或者英譯中的卡片思犁。example_cn
例句中文。example_encn
例句中英文进肯。之所以要有這個字段激蹲,是因為有的單詞可能有多個例句。那么這多個例句的中英文該如何匹配江掩?正常來說学辱,例句的英文后面應該跟著翻譯,然后再開始下一個例句环形。Anki沒辦法在程序層面上支持這種匹配策泣。所以,需要單獨的字段存儲匹配好的內容抬吟。examples_other
其他例句闲先。自己找的可以添加到這里裳朋。還是那個中英文匹配的問題李皇。這個字段里的內容温学,不區(qū)分中英文。ants_en
反義詞的英文ants_cn
反義詞的中文釋義ants_encn
反義詞的中英文钙畔。這一字段的存在理由同example_encnsyns
同義詞der_zynm3000
《GRE核心詞匯考法精析》中的派生詞
how_to_mem_bzsdbdc
提取于不擇手段背單詞的txt文檔how_to_mem_zhuji3000
提取于《GRE核心詞匯助記與精煉》交掏。單詞的詞根詞源分析。etyma_group
《GRE核心詞匯助記與精煉》中刃鳄,單詞所屬的詞根盅弛。etyma_group_explanation
《GRE核心詞匯助記與精煉》中,關于單詞所屬詞根的解釋叔锐。etyma_cognates
《GRE核心詞匯助記與精煉》中挪鹏,該單詞的所有同根詞。position_in_zynm3000
《GRE核心詞匯考法精析》中愉烙,單詞所在的List和Unit讨盒。tags
單詞的標簽。比如步责,來自于哪本單詞書返顺,是不是詞組等禀苦。
Anki中NoteType的完整截圖:
Card的設計
我希望第一遍背誦時,只關注簡單的中英文釋義遂鹊,同時由于GRE單詞普遍很難振乏,還應該加入額外內容,輔助理解秉扑。額外內容以及出現(xiàn)順序為慧邮,explanations_other、example_encn舟陆、examples_other误澳、mynotes、how_to_mem_zhuji3000秦躯、etyma_group忆谓、etyma_group_explanation、etyma_cognates踱承、how_to_mem_bzsdbdc倡缠。額外內容不要求識記。綜上所述勾扭,設計模板Usage:正面毡琉,單詞×××的第×個意思铁瞒;背面妙色,中英文釋義加上額外內容。
第二遍背誦時慧耍,應該關注單詞的同反義身辨。所以設計兩個模板,syns和ants芍碧。syns正面問煌珊,單詞×××第×個意思的同義詞,反面呈現(xiàn)同義詞泌豆。模板ants類似定庵。
有些單詞可能發(fā)音也很重要,所以第四個模板命名為pronounce踪危,正面是單詞拼寫蔬浙,背面是單詞音標以及發(fā)音。
Anki的配合使用
設計導入文件
Anki支持導入txt格式的文件贞远,文件中的一行即一個note畴博,字段以TAB符\t
分隔。txt文檔中字段從左到右的寫入順序應該與NoteType里Fields由上到下的順序一致蓝仲。見下圖(右側為整理好的txt文檔俱病,箭頭即TAB符)
下文稱這個生成的導入文件為AnkiImport.txt
官疲。有關如何用Python制作該文件,請參見后文亮隙。
導入文件到Anki
必須在Anki桌面版進行途凫。以Windows為例。Anki主界面咱揍,左上角颖榜,單擊File,單擊Import煤裙,切換到AnkiImport.txt
所在路徑掩完,選中文件,點擊open硼砰。彈出的對話框如下且蓬。
左上角,Type即所謂的NoteType题翰,這里我選擇提前設計好的GreWord恶阴,其具體結構參見“Note的結構”一節(jié)。Deck豹障,我選擇提前建好的GRE冯事。Fields seperated by,保持默認即可(默認是Tab)血公。注意昵仅,一定要在Allow HTML in fields那里打勾。如果導入文件的制作過程沒有問題累魔,那么Field mapping那里摔笤,左右數量應該一致,
使用Anki
Anki主界面垦写,中間靠上吕世,選擇Browse,彈出如下界面梯投。
因為我之前選擇導入到名為GRE的Deck中命辖,所以這里左側會有一個GRE選項。選中以后分蓖,即可瀏覽所有的單詞卡片了尔艇。或者可以直接在上方的地址欄輸入deck:GRE
咆疗,效果相同漓帚。之后,該界面的空白區(qū)域大致變成下圖這樣午磁。
這里尝抖,根據Anki設置的不同毡们,以及是否安裝Anki插件Advanced Browser,你看到的界面可能與上圖展示的不完全一致昧辽。不過大致結構應該相似衙熔。注意到,abandon的第一個釋義搅荞,對應的Sort Field(即word_uid)的值為"abandon1"红氯。Card有3張,對應3個模板咕痛,ants不在其中因為書里沒有給出該釋義的反義詞痢甘。這個表中的每一行都是一張卡片,而非一個Note茉贡。按照之前的設計塞栅,一個單詞的一個釋義,會自動生成4張卡片腔丧,對應表中的4行放椰。那些被黃色標記的行(卡片),標識著這些卡片被Suspend愉粤。這是我手動設定的結果砾医。原因如下。
Anki并不原生支持所謂的循序漸進的學習模式衣厘,它同等對待所有的卡片如蚜。即背單詞時,這4類卡片出現(xiàn)的順序是混合且隨機的头滔。第一遍學習時怖亭,我不希望類別為syns涎显、ants坤检、pronounce的卡片出現(xiàn),所以在Anki中Suspend它們期吓。Suspend的含義是早歇,除非我手動激活(unsuspend)這些卡片,它們不會在我的學習過程中出現(xiàn)讨勤。具體實現(xiàn)方法如下箭跳。
在地址欄中,鍵入deck:GRE card:syns
潭千,回車谱姓,Browser會列出模板syns產生的所有卡片。CTRL+A
選中所有卡片刨晴,單擊地址欄上方的suspend即可屉来。對ants路翻、pronounce作相同操作。等單詞的所有Usage卡片都進入復習階段后茄靠,如果想激活這些卡片進行進一步學習茂契,再次執(zhí)行一遍上述操作即可。
當然慨绳,還有一種不借助Suspend的方法:filtered deck掉冶。Anki主界面,上方脐雪,單擊Tools厌小,單擊Create Filtered Deck,彈出如下對話框战秋。
在Search那里鍵入召锈,deck:"GRE" card:"Usage"
。另外获询,你還可以在"Limit to"中設置每天學習的卡片的數量上限涨岁,在"cards selected by"設置卡片出現(xiàn)的順序。關于更多Search方面的語法吉嚣,參見Searching梢薪。設置好后,單擊Build即可尝哆。
最后秉撇,附上完整的卡片背面預覽。
用Python制作導入文件
我只談談大致思路秋泄,技術細節(jié)方面琐馆,我會共享我寫的幾個ipython notebook。懂python的自然可以看得懂我寫的代碼恒序,不懂編程的瘦麸,我也沒能力在一個小節(jié)內解釋清楚所有東西。
以《GRE核心詞匯考法精析》為例歧胁。將GREHe Xin Ci Hui Kao Fa Jing Xi - Chen Qi.txt
整體讀入Python后滋饲,得到一個非常長的字符串。每一步處理都是在切塊喊巍。第一步屠缭,先按照List來切大塊,再按Unit切中塊崭参,最后按單詞切小塊呵曹。第二步,所有切割出的單詞塊構成了一個列表。對于列表中的每一個單詞奄喂,按考法切大塊之剧,每個考法按照釋義、例句砍聊、近義詞背稼、反義詞等切小塊,最后再把這些小塊放入到對應的字段中玻蝌。如何識別一個塊的起始和終止位置蟹肘?這就需要觀察文本規(guī)律了。比如俯树,如何識別一個List塊帘腹?通過觀察txt文檔,發(fā)現(xiàn)每個List的起始行字符串都有如下特征许饿,行首是英文單詞List阳欲,之后接一個空格字符再加上一個或兩個數字。至于終止位置陋率,似乎沒有統(tǒng)一的特征球化,但考慮到一個List的結尾即另一個List的開始,所以兩個List起始位置之間的內容即一個List塊瓦糟。也就是說筒愚,只要找到起始位置的規(guī)律即可。其他的塊都以類似的思路切割菩浙。不過巢掺,對于最小的單位,即一個釋義下面的各個條目劲蜻,通常是一個條目即一行陆淀,那么只需辨別這一行字符串是屬于哪個條目即可。原文檔中模式一目了然先嬉。例句條目以中文“例”開頭轧苫,近義詞條目以中文“近”開頭,如此等等坝初。
相關文件共享
最近ipython notebook遷移到了jupyter notebooek浸剩,我直接分享notebook可能會出現(xiàn)版本不對打不開的情形钾军。所以只分享notebook的HTML的文檔鳄袍。代碼和程序運行的結果都在里面,而且也詳細說了寫代碼的思路吏恭。
my_helpers.py
一些輔助函數
sync_to_file_magic_command.py
我自己寫的一個magic command拗小,自動生成腳本用的。
convert_new3000.py
處理GREHe Xin Ci Hui Kao Fa Jing Xi - Chen Qi.txt
樱哼,生成new3000_base_d.txt
convert_zhuji.py
處理GREHe Xin Ci Hui Zhu Ji Yu Jing - Cao Tian Cheng.txt
哀九,生成zhuji_base_d.txt
convert_duanyu.py
處理GREGao Fen Bi Bei Duan Yu Da Pe - Yan Yu Zhen ,Gao Yu ,Chen Qi.txt
剿配,生成duanyu_base_d.txt
bzsdbdc_dic.txt
網上找到的buzeshouduanbeidanci.txt
整理過的版本
anki_import.ipynb
讀入
new3000_base_d.txt
,zhuji_base_d.txt
阅束,bzsdbdc_dic.txt
呼胚,duanyu_base_d.txt
生成
AnkiImportData_GreWord.txt
,AnkiImportData_GrePhrase.txt
或者分別運行
CreateAnkiImport_GrePhrase.py
息裸,CreateAnkiImport_GreWord.py
也能得到上述文件
example_usage.apkg
詞庫預覽版蝇更,只有abandon一個單詞。用以展示Note結構呼盆、卡片模板年扩。
以上文件分享在Github
以后的bug修復和更新也會發(fā)布在這里
其實我知道,這種文章寫出來就注定小眾访圃,所以閱讀量不會很高厨幻。不過,如果你讀到這里腿时,那至少證明你便是那小眾中的一個况脆。如果這篇文章幫到了你,或者你覺得哪里可以改進批糟,歡飲反饋給我漠另。可以評論跃赚,也可以喜歡這篇文章笆搓。最近每隔幾天,我便發(fā)現(xiàn)有人關注我纬傲,可已有的三篇文章卻不見多一個喜歡或者評論满败,這讓我很困惑。如果我寫的不好叹括,干嘛關注我算墨?如果我寫的好,為何一點反饋都舍不得給汁雷?好吧净嘀,也許是這些朋友比較傲嬌,覺得這種水文偷偷看過就好侠讯,點個喜歡多掉身價啊~其實吧挖藏,我理解他們的。有時我也會出于好奇偷偷看看首頁投稿里里的姑娘文厢漩,然后默默離開~畢竟膜眠,人人都有無聊的時候。雖然技術文不同于雞湯文,還是感謝這些朋友賞臉閱讀宵膨。