Anki系列-用Anki准备GRE

作者: 北魏企鹅 | 来源:发表于2015-10-14 00:07 被阅读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也是根据这个免费版本制作的。

    工具箱

    • Kindle for PC
      必备。买过的Kindle电子书都会出现在这个软件中。下载到本地后,可以到C:\Users\你的用户名\Documents\My Kindle Content中找到源文件,文件名为*******.azw。这个文件就是所有数据的最终来源。

    • calibre
      转换工具。将*******.azw拖入calibre后,自动完成去版权保护的操作。然后右键书籍封面,选择convert books,convert individually,输出格式output format选txt即可。见下图。

      anki-gre-1.png
    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都有如下字段。

    • 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.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修复和更新也会发布在这里

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

    相关文章

      网友评论

      • 5a23f37b6905:你好,我下载了已经做好的词库,发现加粗的地方留有Markdown的痕迹。
        比如If you say something **merits attention**, it **deserves attention**.
        这种情况怎么办呢
      • 38bc78372fa7:特意注册简书来给你点赞👍
      • 5d80383d39b2:谢谢……为了你这个教程特意注册简书。。。不过明显啃不下来,先暂时放放。。容我先去研究下python
      • 456d6a39e1ab:很专业,很有耐心
      • 09c9abdfe521:有点羡慕,也想学抓包
      • cdpath:请教语音文件是如何获取的呢?
      • 鸭梨山大哎:有apkg么
      • c94a238a4d02:thanks a lot~
      • 2c3e5bb3ab55:谢谢楼主分享。打算用anki学python。
      • AnLuoRidge:技术非常棒,亦加深了我对Anki的理解~马上去实践下定制field和card。
        不过个人还是觉得放在例句里背单词比较好,一种用法对应一条例句。
      • 6589af9924a3:本来看下来一脸黑线,然后发现百度盘有做好的apkg,感动啊~
        09c9abdfe521:@赐伦无语 哇,今天看网盘被吞了,老哥,邮箱能否发一份,
      • 6589af9924a3:Life saver! 感激涕零!
      • hw1LDo:我的第一个反馈是“欢迎”错写成“欢饮”啦~
      • 78003176b094:简直太棒了!这段时间刚自学的python到文本处理,刚入anki的坑正在被TOEFL的词汇,TOEFL完了再来折腾GRE的,届时楼主这篇文章简直是帮上大忙!!
      • ac2c3e5308c5:做为文科生表示看下来一脸懵逼
      • e999b194d91a:很棒!
      • 白蜀黍:卧槽看到开头“对机器学习感兴趣自学了python”来膜拜一下qwq!【毕设和机器学习有关还没啥头绪】最近想背点面试题,就搜到了anki,然后冲动下还买了ios版的【结果发现是英文的还不太会搞233【嘛,pc端的我也还不太会搞_(:зゝ∠)_【向你学习学习!~
      • 素清欢:同anki爱好者,很牛逼的一套流程,背后的思想很赞,想和楼主教个朋友。
        素清欢:@北魏企鹅 我在做的时候,总有种“做完卡片=背完卡片”的错觉,所以在做完卡片的时候,似乎自己已经把背完卡片才能获得的成就感透支了,之后再开始背的时候兴趣降低不少。。
        北魏企鹅:@素清欢 好啊。说来惭愧,我自己做的卡片我自己也没坚持下来。
      • hQDiSU:po 主你好你音频文件用的是什么?制作和写脚本我都会可是不知道哪找音源。
        北魏企鹅:@笨傻蠢臭臭 直接从网上找的韦氏发音库。不过内容不全。
      • 3629661a40cc:anki ios手机,不会导入音频,看了还是不会
      • acf58a3d5848:我就是你2010的那个状态,所以也不多什么了。希望你以后多写关于anki的技术文章。
      • ed3284b27c2e:很喜欢你的文章 清淡 难嚼 但营养丰富 虽然只有一点vb的基础 愿意啃下这硬骨头
        Jambo:@朗润私语 我的情况跟你好像,也是用的supermemo 16,只有高中的VB基础(捂脸跑~)。不过这篇博文彻底点燃了我!
        ed3284b27c2e:@北魏企鹅 嗯呢 我之前使用supermemo刷了几遍,并结合纸质版的3K助记,短语来进行学习,但跟你的方法比简直low多了。你的方法可以说是毕其功于一役,效率极高,值得好好学习
        北魏企鹅:@朗润私语 建议直接去百度云下载我做好的词库并开始背诵。等背的差不多了,觉得可以接受这种设计,再来看代码怎么写的。

      本文标题:Anki系列-用Anki准备GRE

      本文链接:https://www.haomeiwen.com/subject/ebjocttx.html