Anki系列-用Anki準(zhǔn)備GRE
背景
其實(shí)我從2010年就開始接觸Anki了。但那個(gè)時(shí)候,由于自身非常懶惰,對Anki的使用也是形式大于內(nèi)容。而且那個(gè)時(shí)候并不會(huì)Python,也不知道正則表達(dá)式,所以在制作卡片方面進(jìn)展緩慢。久而久之也就不了了之。
2014年,出于對機(jī)器學(xué)習(xí)的興趣,我自學(xué)了Python,為大規(guī)模制作卡片打下了編程基礎(chǔ)。2015年,閑暇時(shí)我用IOS上的Pythonista寫了個(gè)簡單的背單詞軟件。那個(gè)時(shí)候面臨沒有高質(zhì)量詞庫的尷尬。我印象中,最有挑戰(zhàn)性的單詞書就是琦叔的《再要你命3000》了。于是從網(wǎng)上找到PDF版本,摸索著如何將PDF里的內(nèi)容整理為軟件可用的數(shù)據(jù)格式。這一過程伴隨著對正則表達(dá)式的大量使用。但由于網(wǎng)上流傳版本自身內(nèi)容的缺陷,這一工作也無疾而終。直到最近,我發(fā)現(xiàn)Amazon上開始出售一系列詞匯書的Kindle版本,于是相繼購買了《GRE核心詞匯考法精析》《GRE核心詞匯助記與精煉》《GRE高分必備短語搭配》的Kindle版,然后用calibre轉(zhuǎn)換成txt格式,最后再用python來將txt處理成Anki可用的導(dǎo)入文件。Kindle版的書籍格式是AZW3,每個(gè)章節(jié)其實(shí)就是一個(gè)網(wǎng)頁(HTML),處理起來要比PDF容易太多。而且書籍內(nèi)容也有專業(yè)的校對人員把過關(guān),所以內(nèi)容質(zhì)量上不用擔(dān)心。我設(shè)計(jì)的詞庫的主體結(jié)構(gòu)來自于《GRE核心詞匯考法精析》,整個(gè)制作過程輕松愉快。后來又加入了《GRE核心詞匯助記與精煉》和“不擇手段背單詞”的內(nèi)容,以及單詞的發(fā)音。
在這里,我想提醒讀者注意版權(quán)問題。我們購買的電子版書籍,嚴(yán)格來說只是購買了在指定閱讀平臺(tái)上閱讀該書籍的權(quán)利。對于書籍電子文件的一切修改行為,都算侵犯了版權(quán),更遑論破解之后放到各大論壇上的共享行為了。所以,在這里,我并不會(huì)提供制作好的Anki詞庫。但我會(huì)分享制作詞庫的腳本文件。這樣,你只需購買了相關(guān)書籍,便可以參照我寫的程序制作自己的Anki詞庫了。如果你覺得太麻煩,可以去下載這個(gè)共享Deck,相信能滿足你的大部分需求。最后,我希望大家能在力所能及的范圍內(nèi)去支持書籍作者。
另外,琦叔團(tuán)隊(duì)放出的電子版可以通過關(guān)注琦叔的微信公眾號獲得。或者直接訪問這個(gè)百度網(wǎng)盤鏈接。不過,既然免費(fèi),就不完美。且不說水印,內(nèi)容上也會(huì)有很多錯(cuò)誤。所以并不適合提取數(shù)據(jù)。相信之前提到的共享Deck也是根據(jù)這個(gè)免費(fèi)版本制作的。
工具箱
Kindle for PC
必備。買過的Kindle電子書都會(huì)出現(xiàn)在這個(gè)軟件中。下載到本地后,可以到C:\Users\你的用戶名\Documents\My Kindle Content
中找到源文件,文件名為*******.azw
。這個(gè)文件就是所有數(shù)據(jù)的最終來源。-
calibre
轉(zhuǎn)換工具。將*******.azw
拖入calibre后,自動(dòng)完成去版權(quán)保護(hù)的操作。然后右鍵書籍封面,選擇convert books,convert individually,輸出格式output format選txt即可。見下圖。
anki-gre-1.png
calibre有非常豐富的轉(zhuǎn)換選項(xiàng),這里請將Formatting從
txt改為markdown。其他不變。
轉(zhuǎn)換完成后,右鍵書籍封面,選擇open containing folder,txt所在的文件夾會(huì)被自動(dòng)打開。以《GRE核心詞匯考法精析》為例,其文件名為
GREHe Xin Ci Hui Kao Fa Jing Xi - Chen Qi.txt
。這個(gè)文件就是我們要通過程序處理的文件。給大家看一眼它的內(nèi)容。
- python
核心工具。我使用的python開發(fā)環(huán)境是Anaconda。集成了jupyter notebook。 - Anki
Note的結(jié)構(gòu)
學(xué)習(xí)講求循序漸進(jìn)。琦叔的單詞書,一個(gè)單詞下面有太多內(nèi)容,不可能一次性全部識(shí)記。最簡單的想法,如果一個(gè)單詞有n個(gè)釋義,那么就拆成n個(gè)Note。每個(gè)Note都有如下字段。
word_uid
單詞的唯一標(biāo)識(shí)。由單詞拼寫加上用法序號構(gòu)成。具體解釋見下。另外,Anki中,我選擇了“sort by this field in browser”,即所有的Note也以這個(gè)字段的值為自己的唯一標(biāo)識(shí)。word
單詞的拼寫。比如單詞abandon,拼寫就是abandon。-_-usage_index
單詞的用法序號。很多人初看起來,覺得這個(gè)設(shè)計(jì)不合理。這不是加重記憶負(fù)擔(dān)么?原本我只需要背有哪些用法即可,現(xiàn)在還需要被對應(yīng)的序號。我想說,是你打開的方式不對。仔細(xì)想來,當(dāng)一個(gè)卡片的正面問你,abandon的第一個(gè)用法是什么時(shí),你直接想到的一定是abandon的所有已知用法,按熟悉程度排序。都回憶起來后,你只需看看背面的答案在不在這個(gè)腦中的用法列表即可。不在,相當(dāng)于答錯(cuò);在,相當(dāng)于答對。而這樣做的好處是,如果你對abandon的“放縱”用法非常不熟悉,總是答錯(cuò),那么軟件可以在盡量短的時(shí)間間隔內(nèi)只讓該用法再次出現(xiàn),以加固你的記憶。而且能強(qiáng)迫你將精力集中到這一種用法。我使用別的記憶軟件,在用到一詞多義時(shí)都會(huì)非常困惑和猶疑。如果我回憶起了abandon的四種用法,但忘記了“放縱”的意思,那究竟算答對還是答錯(cuò)了呢?使用usage_index,這種困惑迎刃而解。phonetic_symbol
單詞音標(biāo)word Audio
單詞的發(fā)音文件所在位置part_of_speech
單詞詞性mynotes
自己添加的筆記。比如如何記憶單詞的心得explanation_en
單詞解釋的英文explanation_cn
單詞解釋的中文explanation_encn
內(nèi)容完美再現(xiàn)原書格式explanations_other
其他釋義,同時(shí)包括中英文。Anki不支持多Note間共享Field,而我將多義單詞按釋義拆分,這就會(huì)引發(fā)一個(gè)問題。在你第一次碰到某單詞的新釋義的卡片時(shí),你可能已背過該單詞的某些其他釋義,如“停止做某事”。那么查看答案時(shí),你常常會(huì)想確認(rèn)下其他釋義有沒有背錯(cuò),所以最好把單詞書中的其他釋義都展示出來。另一個(gè)目的在于,多義單詞都有一個(gè)基本義,其他釋義基于基本義引申出來。所以呈現(xiàn)其他釋義,可以輔助你對當(dāng)前出現(xiàn)的釋義的理解。example_en
例句英文。將例句的英文部分拆分出來,可以方便卡片設(shè)計(jì)。比如,你可以設(shè)計(jì)中譯英或者英譯中的卡片。example_cn
例句中文。example_encn
例句中英文。之所以要有這個(gè)字段,是因?yàn)橛械膯卧~可能有多個(gè)例句。那么這多個(gè)例句的中英文該如何匹配?正常來說,例句的英文后面應(yīng)該跟著翻譯,然后再開始下一個(gè)例句。Anki沒辦法在程序?qū)用嫔现С诌@種匹配。所以,需要單獨(dú)的字段存儲(chǔ)匹配好的內(nèi)容。examples_other
其他例句。自己找的可以添加到這里。還是那個(gè)中英文匹配的問題。這個(gè)字段里的內(nèi)容,不區(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核心詞匯助記與精煉》中,關(guān)于單詞所屬詞根的解釋。etyma_cognates
《GRE核心詞匯助記與精煉》中,該單詞的所有同根詞。position_in_zynm3000
《GRE核心詞匯考法精析》中,單詞所在的List和Unit。tags
單詞的標(biāo)簽。比如,來自于哪本單詞書,是不是詞組等。
Anki中NoteType的完整截圖:
Card的設(shè)計(jì)
我希望第一遍背誦時(shí),只關(guān)注簡單的中英文釋義,同時(shí)由于GRE單詞普遍很難,還應(yīng)該加入額外內(nèi)容,輔助理解。額外內(nèi)容以及出現(xiàn)順序?yàn)椋琫xplanations_other、example_encn、examples_other、mynotes、how_to_mem_zhuji3000、etyma_group、etyma_group_explanation、etyma_cognates、how_to_mem_bzsdbdc。額外內(nèi)容不要求識(shí)記。綜上所述,設(shè)計(jì)模板Usage:正面,單詞×××的第×個(gè)意思;背面,中英文釋義加上額外內(nèi)容。
第二遍背誦時(shí),應(yīng)該關(guān)注單詞的同反義。所以設(shè)計(jì)兩個(gè)模板,syns和ants。syns正面問,單詞×××第×個(gè)意思的同義詞,反面呈現(xiàn)同義詞。模板ants類似。
有些單詞可能發(fā)音也很重要,所以第四個(gè)模板命名為pronounce,正面是單詞拼寫,背面是單詞音標(biāo)以及發(fā)音。
Anki的配合使用
設(shè)計(jì)導(dǎo)入文件
Anki支持導(dǎo)入txt格式的文件,文件中的一行即一個(gè)note,字段以TAB符\t
分隔。txt文檔中字段從左到右的寫入順序應(yīng)該與NoteType里Fields由上到下的順序一致。見下圖(右側(cè)為整理好的txt文檔,箭頭即TAB符)
下文稱這個(gè)生成的導(dǎo)入文件為AnkiImport.txt
。有關(guān)如何用Python制作該文件,請參見后文。
導(dǎo)入文件到Anki
必須在Anki桌面版進(jìn)行。以Windows為例。Anki主界面,左上角,單擊File,單擊Import,切換到AnkiImport.txt
所在路徑,選中文件,點(diǎn)擊open。彈出的對話框如下。
左上角,Type即所謂的NoteType,這里我選擇提前設(shè)計(jì)好的GreWord,其具體結(jié)構(gòu)參見“Note的結(jié)構(gòu)”一節(jié)。Deck,我選擇提前建好的GRE。Fields seperated by,保持默認(rèn)即可(默認(rèn)是Tab)。注意,一定要在Allow HTML in fields那里打勾。如果導(dǎo)入文件的制作過程沒有問題,那么Field mapping那里,左右數(shù)量應(yīng)該一致,
使用Anki
Anki主界面,中間靠上,選擇Browse,彈出如下界面。
因?yàn)槲抑斑x擇導(dǎo)入到名為GRE的Deck中,所以這里左側(cè)會(huì)有一個(gè)GRE選項(xiàng)。選中以后,即可瀏覽所有的單詞卡片了。或者可以直接在上方的地址欄輸入deck:GRE
,效果相同。之后,該界面的空白區(qū)域大致變成下圖這樣。
這里,根據(jù)Anki設(shè)置的不同,以及是否安裝Anki插件Advanced Browser,你看到的界面可能與上圖展示的不完全一致。不過大致結(jié)構(gòu)應(yīng)該相似。注意到,abandon的第一個(gè)釋義,對應(yīng)的Sort Field(即word_uid)的值為"abandon1"。Card有3張,對應(yīng)3個(gè)模板,ants不在其中因?yàn)闀餂]有給出該釋義的反義詞。這個(gè)表中的每一行都是一張卡片,而非一個(gè)Note。按照之前的設(shè)計(jì),一個(gè)單詞的一個(gè)釋義,會(huì)自動(dòng)生成4張卡片,對應(yīng)表中的4行。那些被黃色標(biāo)記的行(卡片),標(biāo)識(shí)著這些卡片被Suspend。這是我手動(dòng)設(shè)定的結(jié)果。原因如下。
Anki并不原生支持所謂的循序漸進(jìn)的學(xué)習(xí)模式,它同等對待所有的卡片。即背單詞時(shí),這4類卡片出現(xiàn)的順序是混合且隨機(jī)的。第一遍學(xué)習(xí)時(shí),我不希望類別為syns、ants、pronounce的卡片出現(xiàn),所以在Anki中Suspend它們。Suspend的含義是,除非我手動(dòng)激活(unsuspend)這些卡片,它們不會(huì)在我的學(xué)習(xí)過程中出現(xiàn)。具體實(shí)現(xiàn)方法如下。
在地址欄中,鍵入deck:GRE card:syns
,回車,Browser會(huì)列出模板syns產(chǎn)生的所有卡片。CTRL+A
選中所有卡片,單擊地址欄上方的suspend即可。對ants、pronounce作相同操作。等單詞的所有Usage卡片都進(jìn)入復(fù)習(xí)階段后,如果想激活這些卡片進(jìn)行進(jìn)一步學(xué)習(xí),再次執(zhí)行一遍上述操作即可。
當(dāng)然,還有一種不借助Suspend的方法:filtered deck。Anki主界面,上方,單擊Tools,單擊Create Filtered Deck,彈出如下對話框。
在Search那里鍵入,deck:"GRE" card:"Usage"
。另外,你還可以在"Limit to"中設(shè)置每天學(xué)習(xí)的卡片的數(shù)量上限,在"cards selected by"設(shè)置卡片出現(xiàn)的順序。關(guān)于更多Search方面的語法,參見Searching。設(shè)置好后,單擊Build即可。
最后,附上完整的卡片背面預(yù)覽。
用Python制作導(dǎo)入文件
我只談?wù)劥笾滤悸罚夹g(shù)細(xì)節(jié)方面,我會(huì)共享我寫的幾個(gè)ipython notebook。懂python的自然可以看得懂我寫的代碼,不懂編程的,我也沒能力在一個(gè)小節(jié)內(nèi)解釋清楚所有東西。
以《GRE核心詞匯考法精析》為例。將GREHe Xin Ci Hui Kao Fa Jing Xi - Chen Qi.txt
整體讀入Python后,得到一個(gè)非常長的字符串。每一步處理都是在切塊。第一步,先按照List來切大塊,再按Unit切中塊,最后按單詞切小塊。第二步,所有切割出的單詞塊構(gòu)成了一個(gè)列表。對于列表中的每一個(gè)單詞,按考法切大塊,每個(gè)考法按照釋義、例句、近義詞、反義詞等切小塊,最后再把這些小塊放入到對應(yīng)的字段中。如何識(shí)別一個(gè)塊的起始和終止位置?這就需要觀察文本規(guī)律了。比如,如何識(shí)別一個(gè)List塊?通過觀察txt文檔,發(fā)現(xiàn)每個(gè)List的起始行字符串都有如下特征,行首是英文單詞List,之后接一個(gè)空格字符再加上一個(gè)或兩個(gè)數(shù)字。至于終止位置,似乎沒有統(tǒng)一的特征,但考慮到一個(gè)List的結(jié)尾即另一個(gè)List的開始,所以兩個(gè)List起始位置之間的內(nèi)容即一個(gè)List塊。也就是說,只要找到起始位置的規(guī)律即可。其他的塊都以類似的思路切割。不過,對于最小的單位,即一個(gè)釋義下面的各個(gè)條目,通常是一個(gè)條目即一行,那么只需辨別這一行字符串是屬于哪個(gè)條目即可。原文檔中模式一目了然。例句條目以中文“例”開頭,近義詞條目以中文“近”開頭,如此等等。
相關(guān)文件共享
最近ipython notebook遷移到了jupyter notebooek,我直接分享notebook可能會(huì)出現(xiàn)版本不對打不開的情形。所以只分享notebook的HTML的文檔。代碼和程序運(yùn)行的結(jié)果都在里面,而且也詳細(xì)說了寫代碼的思路。
my_helpers.py
一些輔助函數(shù)
sync_to_file_magic_command.py
我自己寫的一個(gè)magic command,自動(dòng)生成腳本用的。
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
網(wǎng)上找到的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
或者分別運(yùn)行
CreateAnkiImport_GrePhrase.py
,CreateAnkiImport_GreWord.py
也能得到上述文件
example_usage.apkg
詞庫預(yù)覽版,只有abandon一個(gè)單詞。用以展示Note結(jié)構(gòu)、卡片模板。
以上文件分享在Github
以后的bug修復(fù)和更新也會(huì)發(fā)布在這里
其實(shí)我知道,這種文章寫出來就注定小眾,所以閱讀量不會(huì)很高。不過,如果你讀到這里,那至少證明你便是那小眾中的一個(gè)。如果這篇文章幫到了你,或者你覺得哪里可以改進(jìn),歡飲反饋給我。可以評論,也可以喜歡這篇文章。最近每隔幾天,我便發(fā)現(xiàn)有人關(guān)注我,可已有的三篇文章卻不見多一個(gè)喜歡或者評論,這讓我很困惑。如果我寫的不好,干嘛關(guān)注我?如果我寫的好,為何一點(diǎn)反饋都舍不得給?好吧,也許是這些朋友比較傲嬌,覺得這種水文偷偷看過就好,點(diǎn)個(gè)喜歡多掉身價(jià)啊~其實(shí)吧,我理解他們的。有時(shí)我也會(huì)出于好奇偷偷看看首頁投稿里里的姑娘文,然后默默離開~畢竟,人人都有無聊的時(shí)候。雖然技術(shù)文不同于雞湯文,還是感謝這些朋友賞臉閱讀。