技术ankiAnki——简书+知乎专栏联动

Anki系列-用Anki准备GRE

2015-10-14  本文已影响13930人  北魏企鹅

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也是根据这个免费版本制作的。

工具箱

anki2.png

calibre有非常丰富的转换选项,这里请将Formatting从
txt改为markdown。其他不变。

anki-gre-3.png
转换完成后,右键书籍封面,选择open containing folder,txt所在的文件夹会被自动打开。以《GRE核心词汇考法精析》为例,其文件名为GREHe Xin Ci Hui Kao Fa Jing Xi - Chen Qi.txt。这个文件就是我们要通过程序处理的文件。给大家看一眼它的内容。 anki-gre-4.png

Note的结构

学习讲求循序渐进。琦叔的单词书,一个单词下面有太多内容,不可能一次性全部识记。最简单的想法,如果一个单词有n个释义,那么就拆成n个Note。每个Note都有如下字段。

Anki中NoteType的完整截图:

anki-gre-5-2.png

Card的设计

我希望第一遍背诵时,只关注简单的中英文释义,同时由于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符)

anki-gre-5.png

下文称这个生成的导入文件为AnkiImport.txt。有关如何用Python制作该文件,请参见后文。

导入文件到Anki

必须在Anki桌面版进行。以Windows为例。Anki主界面,左上角,单击File,单击Import,切换到AnkiImport.txt所在路径,选中文件,点击open。弹出的对话框如下。

anki-gre-6.png

左上角,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-gre-8.png

这里,根据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.txtzhuji_base_d.txtbzsdbdc_dic.txtduanyu_base_d.txt
生成
AnkiImportData_GreWord.txtAnkiImportData_GrePhrase.txt

或者分别运行
CreateAnkiImport_GrePhrase.pyCreateAnkiImport_GreWord.py
也能得到上述文件

example_usage.apkg
词库预览版,只有abandon一个单词。用以展示Note结构、卡片模板。

以上文件分享在Github
以后的bug修复和更新也会发布在这里

其实我知道,这种文章写出来就注定小众,所以阅读量不会很高。不过,如果你读到这里,那至少证明你便是那小众中的一个。如果这篇文章帮到了你,或者你觉得哪里可以改进,欢饮反馈给我。可以评论,也可以喜欢这篇文章。最近每隔几天,我便发现有人关注我,可已有的三篇文章却不见多一个喜欢或者评论,这让我很困惑。如果我写的不好,干嘛关注我?如果我写的好,为何一点反馈都舍不得给?好吧,也许是这些朋友比较傲娇,觉得这种水文偷偷看过就好,点个喜欢多掉身价啊~其实吧,我理解他们的。有时我也会出于好奇偷偷看看首页投稿里里的姑娘文,然后默默离开~毕竟,人人都有无聊的时候。虽然技术文不同于鸡汤文,还是感谢这些朋友赏脸阅读。

上一篇 下一篇

猜你喜欢

热点阅读