Anki系列-用Anki准备GRE
背景
其实我从2010年就开始接触Anki了。但那个时候,由于自身非常懒惰,对Anki的使用也是形式大于内容。而且那个时候并不会Python,也不知道正则表达式,所以在制作卡片方面进展缓慢。久而久之也就不了了之。
2014年,出于对机器学习的兴趣,我自学了Python,为大规模制作卡片打下了编程基础。2015年,闲暇时我用IOS上的Pythonista写了个简单的背单词软件。那个时候面临没有高质量词库的尴尬。我印象中,最有挑战性的单词书就是琦叔的《再要你命3000》了。于是从网上找到PDF版本,摸索着如何将PDF里的内容整理为软件可用的数据格式。这一过程伴随着对正则表达式的大量使用。但由于网上流传版本自身内容的缺陷,这一工作也无疾而终。直到最近,我发现Amazon上开始出售一系列词汇书的Kindle版本,于是相继购买了《GRE核心词汇考法精析》《GRE核心词汇助记与精炼》《GRE高分必备短语搭配》的Kindle版,然后用calibre转换成txt格式,最后再用python来将txt处理成Anki可用的导入文件。Kindle版的书籍格式是AZW3,每个章节其实就是一个网页(HTML),处理起来要比PDF容易太多。而且书籍内容也有专业的校对人员把过关,所以内容质量上不用担心。我设计的词库的主体结构来自于《GRE核心词汇考法精析》,整个制作过程轻松愉快。后来又加入了《GRE核心词汇助记与精炼》和“不择手段背单词”的内容,以及单词的发音。
在这里,我想提醒读者注意版权问题。我们购买的电子版书籍,严格来说只是购买了在指定阅读平台上阅读该书籍的权利。对于书籍电子文件的一切修改行为,都算侵犯了版权,更遑论破解之后放到各大论坛上的共享行为了。所以,在这里,我并不会提供制作好的Anki词库。但我会分享制作词库的脚本文件。这样,你只需购买了相关书籍,便可以参照我写的程序制作自己的Anki词库了。如果你觉得太麻烦,可以去下载这个共享Deck,相信能满足你的大部分需求。最后,我希望大家能在力所能及的范围内去支持书籍作者。
另外,琦叔团队放出的电子版可以通过关注琦叔的微信公众号获得。或者直接访问这个百度网盘链接。不过,既然免费,就不完美。且不说水印,内容上也会有很多错误。所以并不适合提取数据。相信之前提到的共享Deck也是根据这个免费版本制作的。
工具箱
-
Kindle for PC
必备。买过的Kindle电子书都会出现在这个软件中。下载到本地后,可以到C:\Users\你的用户名\Documents\My Kindle Content
中找到源文件,文件名为*******.azw
。这个文件就是所有数据的最终来源。 -
calibre
anki-gre-1.png
转换工具。将*******.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
。这个文件就是我们要通过程序处理的文件。给大家看一眼它的内容。
anki-gre-4.png
- python
核心工具。我使用的python开发环境是Anaconda。集成了jupyter notebook。 - Anki
Note的结构
学习讲求循序渐进。琦叔的单词书,一个单词下面有太多内容,不可能一次性全部识记。最简单的想法,如果一个单词有n个释义,那么就拆成n个Note。每个Note都有如下字段。
-
word_uid
单词的唯一标识。由单词拼写加上用法序号构成。具体解释见下。另外,Anki中,我选择了“sort by this field in browser”,即所有的Note也以这个字段的值为自己的唯一标识。 -
word
单词的拼写。比如单词abandon,拼写就是abandon。-_- -
usage_index
单词的用法序号。很多人初看起来,觉得这个设计不合理。这不是加重记忆负担么?原本我只需要背有哪些用法即可,现在还需要被对应的序号。我想说,是你打开的方式不对。仔细想来,当一个卡片的正面问你,abandon的第一个用法是什么时,你直接想到的一定是abandon的所有已知用法,按熟悉程度排序。都回忆起来后,你只需看看背面的答案在不在这个脑中的用法列表即可。不在,相当于答错;在,相当于答对。而这样做的好处是,如果你对abandon的“放纵”用法非常不熟悉,总是答错,那么软件可以在尽量短的时间间隔内只让该用法再次出现,以加固你的记忆。而且能强迫你将精力集中到这一种用法。我使用别的记忆软件,在用到一词多义时都会非常困惑和犹疑。如果我回忆起了abandon的四种用法,但忘记了“放纵”的意思,那究竟算答对还是答错了呢?使用usage_index,这种困惑迎刃而解。 -
phonetic_symbol
单词音标 -
word Audio
单词的发音文件所在位置 -
part_of_speech
单词词性 -
mynotes
自己添加的笔记。比如如何记忆单词的心得 -
explanation_en
单词解释的英文 -
explanation_cn
单词解释的中文 -
explanation_encn
内容完美再现原书格式 -
explanations_other
其他释义,同时包括中英文。Anki不支持多Note间共享Field,而我将多义单词按释义拆分,这就会引发一个问题。在你第一次碰到某单词的新释义的卡片时,你可能已背过该单词的某些其他释义,如“停止做某事”。那么查看答案时,你常常会想确认下其他释义有没有背错,所以最好把单词书中的其他释义都展示出来。另一个目的在于,多义单词都有一个基本义,其他释义基于基本义引申出来。所以呈现其他释义,可以辅助你对当前出现的释义的理解。 -
example_en
例句英文。将例句的英文部分拆分出来,可以方便卡片设计。比如,你可以设计中译英或者英译中的卡片。 -
example_cn
例句中文。 -
example_encn
例句中英文。之所以要有这个字段,是因为有的单词可能有多个例句。那么这多个例句的中英文该如何匹配?正常来说,例句的英文后面应该跟着翻译,然后再开始下一个例句。Anki没办法在程序层面上支持这种匹配。所以,需要单独的字段存储匹配好的内容。 -
examples_other
其他例句。自己找的可以添加到这里。还是那个中英文匹配的问题。这个字段里的内容,不区分中英文。 -
ants_en
反义词的英文 -
ants_cn
反义词的中文释义 -
ants_encn
反义词的中英文。这一字段的存在理由同example_encn -
syns
同义词 -
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的完整截图:
anki-gre-5-2.pngCard的设计
我希望第一遍背诵时,只关注简单的中英文释义,同时由于GRE单词普遍很难,还应该加入额外内容,辅助理解。额外内容以及出现顺序为,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正面问,单词×××第×个意思的同义词,反面呈现同义词。模板ants类似。
有些单词可能发音也很重要,所以第四个模板命名为pronounce,正面是单词拼写,背面是单词音标以及发音。
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的结构”一节。Deck,我选择提前建好的GRE。Fields seperated by,保持默认即可(默认是Tab)。注意,一定要在Allow HTML in fields那里打勾。如果导入文件的制作过程没有问题,那么Field mapping那里,左右数量应该一致,
使用Anki
Anki主界面,中间靠上,选择Browse,弹出如下界面。
anki-gre-7.png因为我之前选择导入到名为GRE的Deck中,所以这里左侧会有一个GRE选项。选中以后,即可浏览所有的单词卡片了。或者可以直接在上方的地址栏输入deck:GRE
,效果相同。之后,该界面的空白区域大致变成下图这样。
这里,根据Anki设置的不同,以及是否安装Anki插件Advanced Browser,你看到的界面可能与上图展示的不完全一致。不过大致结构应该相似。注意到,abandon的第一个释义,对应的Sort Field(即word_uid)的值为"abandon1"。Card有3张,对应3个模板,ants不在其中因为书里没有给出该释义的反义词。这个表中的每一行都是一张卡片,而非一个Note。按照之前的设计,一个单词的一个释义,会自动生成4张卡片,对应表中的4行。那些被黄色标记的行(卡片),标识着这些卡片被Suspend。这是我手动设定的结果。原因如下。
Anki并不原生支持所谓的循序渐进的学习模式,它同等对待所有的卡片。即背单词时,这4类卡片出现的顺序是混合且随机的。第一遍学习时,我不希望类别为syns、ants、pronounce的卡片出现,所以在Anki中Suspend它们。Suspend的含义是,除非我手动激活(unsuspend)这些卡片,它们不会在我的学习过程中出现。具体实现方法如下。
在地址栏中,键入deck:GRE card:syns
,回车,Browser会列出模板syns产生的所有卡片。CTRL+A
选中所有卡片,单击地址栏上方的suspend即可。对ants、pronounce作相同操作。等单词的所有Usage卡片都进入复习阶段后,如果想激活这些卡片进行进一步学习,再次执行一遍上述操作即可。
当然,还有一种不借助Suspend的方法:filtered deck。Anki主界面,上方,单击Tools,单击Create Filtered Deck,弹出如下对话框。
anki-gre-9.png在Search那里键入,deck:"GRE" card:"Usage"
。另外,你还可以在"Limit to"中设置每天学习的卡片的数量上限,在"cards selected by"设置卡片出现的顺序。关于更多Search方面的语法,参见Searching。设置好后,单击Build即可。
最后,附上完整的卡片背面预览。
anki-gre-10.png用Python制作导入文件
我只谈谈大致思路,技术细节方面,我会共享我写的几个ipython notebook。懂python的自然可以看得懂我写的代码,不懂编程的,我也没能力在一个小节内解释清楚所有东西。
以《GRE核心词汇考法精析》为例。将GREHe Xin Ci Hui Kao Fa Jing Xi - Chen Qi.txt
整体读入Python后,得到一个非常长的字符串。每一步处理都是在切块。第一步,先按照List来切大块,再按Unit切中块,最后按单词切小块。第二步,所有切割出的单词块构成了一个列表。对于列表中的每一个单词,按考法切大块,每个考法按照释义、例句、近义词、反义词等切小块,最后再把这些小块放入到对应的字段中。如何识别一个块的起始和终止位置?这就需要观察文本规律了。比如,如何识别一个List块?通过观察txt文档,发现每个List的起始行字符串都有如下特征,行首是英文单词List,之后接一个空格字符再加上一个或两个数字。至于终止位置,似乎没有统一的特征,但考虑到一个List的结尾即另一个List的开始,所以两个List起始位置之间的内容即一个List块。也就是说,只要找到起始位置的规律即可。其他的块都以类似的思路切割。不过,对于最小的单位,即一个释义下面的各个条目,通常是一个条目即一行,那么只需辨别这一行字符串是属于哪个条目即可。原文档中模式一目了然。例句条目以中文“例”开头,近义词条目以中文“近”开头,如此等等。
相关文件共享
最近ipython notebook迁移到了jupyter notebooek,我直接分享notebook可能会出现版本不对打不开的情形。所以只分享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修复和更新也会发布在这里
其实我知道,这种文章写出来就注定小众,所以阅读量不会很高。不过,如果你读到这里,那至少证明你便是那小众中的一个。如果这篇文章帮到了你,或者你觉得哪里可以改进,欢饮反馈给我。可以评论,也可以喜欢这篇文章。最近每隔几天,我便发现有人关注我,可已有的三篇文章却不见多一个喜欢或者评论,这让我很困惑。如果我写的不好,干嘛关注我?如果我写的好,为何一点反馈都舍不得给?好吧,也许是这些朋友比较傲娇,觉得这种水文偷偷看过就好,点个喜欢多掉身价啊~其实吧,我理解他们的。有时我也会出于好奇偷偷看看首页投稿里里的姑娘文,然后默默离开~毕竟,人人都有无聊的时候。虽然技术文不同于鸡汤文,还是感谢这些朋友赏脸阅读。
网友评论
比如If you say something **merits attention**, it **deserves attention**.
这种情况怎么办呢
不过个人还是觉得放在例句里背单词比较好,一种用法对应一条例句。