首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
宝塔
V2EX  ›  分享创造

把英文书籍中符合难度的单词提取出来,然后用树莓派、闲置的屏幕、挂墙上的手机来背单词

  •  1
     
  •   lxrmido · 2018-08-19 10:48:01 +08:00 · 5185 次点击
    这是一个创建于 453 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想法

    家中有个树莓派一直在跑爬虫,最近淘宝买东西的时候顺手买了个 50 块的 3.5 寸屏幕插上去,然后发现屏幕无法关闭,于是便想拿它来做点什么,反正屏幕的耗电量才 0.5W 。

    最近也一直在用薄荷阅读学英语,感觉背单词是学英语里最重要的一环。

    于是思路就出来了:

    • 把树莓派扔在家中一个会经常路过的地方,每次路过看一眼屏幕能背一下单词
    • 还能多挂几个屏幕在家里,譬如用 Zero + 墨水屏,装个电池挂墙上能用很久,甚至还能用闲置的手机
    • 多个设备共享阅读进度,只要做个 WebServer 就行了,客户端直接用浏览器就可以跨平台了,也可以额外做个客户端,客户端中导入生成好的单词卡片,不需要包含体积比较大的词库

    单词从哪里来?

    • 个人感觉,如非考试需要,各种专门的词库对我们都不是很适用,所以近几年才会有各种定制化词库的背单词应用。回到前文,背自己需要使用的单词是更有必要的。什么单词是自己需要使用的?“自己想要阅读的英文图书中包含的单词”是个不错的来源。
    • 另一方面,TXT 格式的英文书籍,因为古腾堡计划的存在,很容易找,manybooks 等网站都有海量存货。

    如何生成单词卡片数据?

    • 有了书籍的 TXT 后,提取单词只是文本分割
    • 如何获得每个单词的解释呢?有个很好的开源项目叫做 ECDICT,提供一个很庞大的英汉词典数据库
    • 单词卡片按照出现顺序排列,用所在上下文的句子作为例句,顺便还能碎片化阅读书籍
    • 在生成单词卡片的时候,可以按照单词是否在 CET4、CET6 等范围内去过滤一下,避免把已经烂熟的单词也加进去。

    作品

    有了思路之后,做起来还是比较容易的。花了两个晚上把可用的版本做了出来,repo 地址:

    https://github.com/lxrmido/WordCards

    树莓派运行效果:

    界面截图:

    然后就是再抽空把需要的其他东西做出来,以及优化了

    总结及体会

    • 做这个东西,其实最重要的一环就是词库,感谢 ECDICT 的作者 @skywind3000,使得这一环没有障碍
    • 做界面用了 canvas,绘制自适应屏幕的文字时因为没想到英文单词的切断问题踩了些坑
    • LCD 屏幕的光污染挺严重的,50 块钱的屏幕确实不能指望太多,所以打算看看有没有更好的方案,目前尝试了把闲置的旧手机贴墙上,效果还是不太理想
    • 提取符合难度的单词依然很困难,有许多低难度的词汇其实不在 CET 当中,甚至不在柯林斯分级里,目前还是有很多不需要再记忆的单词会被提取出来
    • 没有发音,我想要的发音方案是把整段上下文句子读出来,能顺便练练听力,没找到效果比较好的
    • 最后就是关于交互的,因为现在用的是树莓派,所以总忍不住想加个几个实体按钮去操作
    73 回复  |  直到 2018-10-20 11:33:57 +08:00
        1
    dongpeng121   2018-08-19 11:05:08 +08:00 via iPhone
    如果训练的文本够多,是不是可以把重复率超过一定值的单词滤掉,认为这些单词已经掌握了?
        2
    ww2000e   2018-08-19 11:08:06 +08:00 via Android
    想知道你家爬虫都爬些啥
        3
    chroming   2018-08-19 11:12:23 +08:00 via Android
    不错不错,我的吃灰派又可以掏出来玩两天了
        4
    lxrmido   2018-08-19 11:25:58 +08:00
    @dongpeng121
    好像确实是这样,这就要在生成词库的步骤里引入训练的环节了
        5
    lxrmido   2018-08-19 11:26:35 +08:00   ♥ 1
    @ww2000e
    各种想爬的数据,哈哈
        6
    mathzhaoliang   2018-08-19 12:41:05 +08:00   ♥ 6
    学英语的话,这种背单词卡片的方式效率很低,(李阳的疯狂英语我认为也不适合大多数人)以前经常看到宣传上说某某人学英语刻苦,背红宝书背 webster 字典,这些其实不可取。

    最好的学习英语的方式是结合情景。比如 "excited", "naive",“ he changed the world ”, etc. 张口就来有没有?

    电影肖申克的救赎里面有许多值得学习的对白,比如在天台上干活时哈德利抱怨税务局要收他一大笔税,安迪走上去问哈德利“你信任你的妻子吗”,哈德利怒道 "what's your malfunction?" (你哪根筋不对?)这不就学到一个 GRE 词汇?(顺带骂人不吐脏字对面还听不懂)

    再比如功夫熊猫里面也有很多精彩的对白如 "there's no secret ingredient","one always meets his destiny on the road he takes to avoid it",等等。

    我觉得你可以屏幕上每次显示某个电影的某个场景,配上台词,每次看到以后模仿电影中的语言把它念出来,倍儿有感觉,而且绝对忘不了。
        7
    zzcchh   2018-08-19 12:46:38 +08:00 via Android
    我记得 interest 还有利息的意思。
        8
    lxrmido   2018-08-19 14:06:17 +08:00
    @mathzhaoliang

    情景记忆确实好,就是获取、整理的难度比较大
        9
    ghhardy   2018-08-19 14:28:58 +08:00 via Android
    @mathzhaoliang 那不就跟百词斩差不多了,这种情境式记忆很多项目都在做,不过确实有难度,我能想到的是利用电影字幕的时间标签进行截屏。不过与其用这种方法片段式地记单词和句子,还不如利用视频资源去充分地带前后语境去学习,哪怕十分钟,都会有不少收获。
        10
    ghhardy   2018-08-19 14:33:57 +08:00 via Android
    @mathzhaoliang 当然,楼主这个小项目非常好,非常感谢楼主的分享🙏
        11
    kingcos   2018-08-19 16:33:28 +08:00 via iPhone
    词库是他开源的?
        12
    daigouspy   2018-08-19 16:52:34 +08:00 via Android
    用折腾的决心自己去学英语你早雅思 4 个 9 了。天天捣鼓系统调试程序哪有心机学习英语。
        13
    BXIA   2018-08-19 16:54:38 +08:00 via iPhone
    @mathzhaoliang 还要背一遍葛底斯堡演讲?
        14
    lxrmido   2018-08-20 08:34:14 +08:00
    @kingcos
    是有其他来源?
        15
    wensonsmith   2018-08-20 17:01:50 +08:00
    @mathzhaoliang 是的,看权利的游戏,瞬间就记住一个单词:Bastard
        16
    mrfox   2018-08-20 17:07:45 +08:00
    非常感兴趣。感谢,很好的项目,一点建议供参考:
    1. 有些还没搞明白,展示页面上有两个图标,一个是删除一个是星号;这个界面是不动的对吧,按删除可以看到下一个单词(删掉了?可以考虑熟词进入熟词表?),但是按星号似乎没反应,那就是收藏起来了,然后再按删除进入下一个展示?(星号应该是保留了继续背对吧)
    2. 符合需要的提取单词:适合个体的最佳方式是自己有自己的词库,因为常见的词频表只能是大概,每个人认识与否的还是不同的,比如分别存入 known.txt ,new.txt 。希望增加一个生、熟词筛选的功能。已经有自己熟词表的可以直接覆盖(或导入),而没有的人可以从头开始积累。界面上增加下操作快捷键,比如按 1 是认识,按 2 是生词
    3. 请问单词复数和动词形态的处理原则,是不是都不还原?
        17
    lxrmido   2018-08-20 18:30:59 +08:00
    @mrfox
    1、删除之后单词会被标记为 ignore,以后都不会再显示这个单词,星号点击之后应该是会变红的,其实这两个就是熟词表跟生词表,但目前没有针对这两者实现其他功能;
    2、对的,准备结合 1L 的建议加入熟词筛选的功能,而快捷键,打算把所有可点击的都加入可配置的快捷键,毕竟每个人的操作设备也不同;
    3、目前的单词处理方式比较粗暴,就是从词典里找完全匹配的,本来打算针对单词的形态提取词根,然后发现词典里有词根的单词数量占比很低,所以搁置了;
        18
    mrfox   2018-08-20 18:54:14 +08:00
    @lxrmido 正在测试,新发现了页面左右有前进后退按钮:),快捷键是个好消息,希望早日完成
    点星号是会变红,不过点删除它是自动跳转下一个,为什么点星号不跳到下一个呢,毕竟已经处理完了,如果是特意为之,建议变成一个可选配置

    刚刚的一个词 https://imgur.com/a/XJhSMFI
    是不是句首词也没还原呢

    另外,释义长的话字体会突然变得很小,希望保持统一

    good job
        19
    mrfox   2018-08-20 18:56:58 +08:00
    @lxrmido 我又看了一眼图,发现不是句首词,上面描述有误,原文里是没大写的,不知道是不是字典的问题还是什么
        20
    mrfox   2018-08-20 19:48:23 +08:00
    提示小白如我的:终于明白了这个 ignore,不再显示出来,开始我试的时候点星号看不动就点了删除,结果这个词应该是既标为生词又不再显示了,这个……应该是点向右,个人觉得先点星再点删除应该是不允许才对
        21
    lxrmido   2018-08-20 20:42:03 +08:00
    @mrfox
    谢谢你的测试,做的时候确实没想到这些逻辑
    词语是从词典里取出来显示的,句子内容是从原文里截取出来的文本,都没有作任何处理
    词典里边“ conservative ”确实是首字母大写的,数据如下:
    {
    id: 644534,
    word: 'Conservative',
    sw: 'conservative',
    phonetic: 'k?n\'s?:v?tiv',
    definition:
    'n. a person who is reluctant to accept changes and new ideas\nn. a member of a Conservative Party\na. resistant to change\ns. having social or political views favoring conservatism',
    translation: 'a. 保守的, 守旧的, 有保存力的\n[化] 防腐剂; 保存剂',
    pos: 'j:62/n:38',
    collins: 4,
    oxford: 1,
    tag: 'gk cet4 cet6 ky toefl ielts gre',
    bnc: 1497,
    frq: 1837,
    exchange: 's:conservatives',
    detail: null,
    audio: ''
    }
    我猜是因为这个词通常特指保守党
        22
    mrfox   2018-08-20 22:34:00 +08:00
    @lxrmido 感谢回复,我查了几个英文词典,应该是 ECDICT 解释问题

    小写是保守的,大写是党派
        23
    mrfox   2018-08-22 00:06:10 +08:00
    关于快捷控制,最好是能适配个遥控器,像有些电视盒那样的非常简单的那种,结合树莓派,应该很方便。目前只是个想法,怎么实现还不知道
        24
    mrfox   2018-08-22 00:09:28 +08:00
    或者是做一个只有两或三个键的键盘,不过似乎即使是两个键的键盘 DIY 也不容易和便宜?有没有有经验的指导下
        25
    lxrmido   2018-08-22 16:57:22 +08:00
    @mrfox
    淘宝找试轴器,卖的人不少
        26
    lxrmido   2018-08-22 16:57:49 +08:00
    @mrfox
    也可以找个 PPT 翻页的遥控器……
        27
    killpigman   2018-08-22 17:59:32 +08:00
    可以发声吗?单词的读音
        28
    mrfox   2018-08-22 19:04:28 +08:00
    @lxrmido 谢谢提示,搜了下试轴器是不带电路的
        29
    mrfox   2018-08-23 03:42:38 +08:00
    建议增加单词在例句高亮,可以考虑增加在线或离线发音


    另:个别的试轴器带 PCB,不过也贵一些,PPT 翻页也是
    淘宝上有单独的小蓝牙翻页器,不知树莓派是否能认得
        30
    missdeer   2018-08-23 09:19:14 +08:00
    我想问你这屏幕和外壳的淘宝链接。。
        31
    lxrmido   2018-08-23 09:41:32 +08:00
    @killpigman
    还没做
        32
    lxrmido   2018-08-23 09:43:37 +08:00
    @mrfox

    PPT 翻页器我买过几个 9.9 包邮的……然后搜空中飞鼠能找到好多二十几块的小键盘
    蓝牙翻页器树莓派会识别成音量+-,因为原理也是手机的音量键……
        33
    lxrmido   2018-08-23 09:44:10 +08:00
    @missdeer
    关键词:树莓派 亚克力 屏幕
        34
    qfdk   2018-08-23 14:48:10 +08:00 via iPhone
    其实扇贝单词不错 做项目的时间可以节约下来 过来人告诉你 一天刷 700 单词 坚持一个月 考试就 OK
        35
    lxrmido   2018-08-23 16:54:35 +08:00
    @qfdk
    我没有考试的需求,这几年用各种 APP 也背到一万多的词汇量了,现在主要是自娱自乐+闲置利用+定制适合自己的方式
        36
    joviwong   2018-08-25 19:44:40 +08:00
    @wensonsmith 很厉害,我就只记住一个 my lord
        37
    mrfox   2018-08-27 02:01:59 +08:00
    折腾了几天快捷键未果,结果今天发现 LZ 已经 3 天前就更新了,真棒!
        38
    lxrmido   2018-08-27 08:46:23 +08:00
    @mrfox
    哈哈,因为没快捷键我自己用着不舒服
        39
    mrfox   2018-08-27 19:24:47 +08:00
    @lxrmido
    非常赞,我在快捷键上浪费了不少时间也没搞好(不是程序员)。不过这次更新后,js 和 css 的文件在编辑器里都变成了长长的一行( VUE 的锅?),不像以前是按段排版好的,想改个解释的颜色,找到眼花也没找到在哪设置……
        40
    lxrmido   2018-08-27 19:48:05 +08:00
    @mrfox

    你不说我都忘记前端代码没提交上去了……

    还没加入颜色定义的功能,真要改的话在
    https://raw.githubusercontent.com/lxrmido/WordCards/master/resource/static/js/app.ced33e8d.js
    里查找颜色的字符串,譬如 "#ffffff" 再修改会比较快
    或者改源码,
    https://github.com/lxrmido/WordCards/blob/master/resource/frontend/src/components/CardContainer.vue
    然后重新编译前端代码
        41
    mrfox   2018-08-27 22:19:34 +08:00
    @lxrmido 感谢回复
    改源码能力不足,已经在 app.ced33e8d.js 查找"#ffffff"(正好要改的解释的字体是白色的),其他 color 相关的也看了一遍,没找到
    card-container 似乎是一体的,解释部分没明白怎么单独标记
        42
    mrfox   2018-08-28 03:03:48 +08:00
    找了一晚上,发现 app.ced33e8d.js 里找不到,不过在源码里有,请问如何“重新编译前端代码”
        43
    lxrmido   2018-08-28 08:56:01 +08:00
    @mrfox
    进入 resource/frontend 目录
    npm i
    npm run build
        44
    mrfox   2018-08-28 16:22:07 +08:00
    解决了一堆错误后,终于能 build 了

    目前报这些错:
    一、
    Module Warning (from ./node_modules/eslint-loader/index.js):
    error: Parsing error: Unexpected token < at src\App.vue:1:1:
    > 1 | <template>
    | ^
    2 | <div id="app">
    3 | <card-container ref="conCard" @setting="openSetting"></card-contai
    ner>
    4 | <setting-container
    1 error found.
    二、
    \resource\frontend\src\lib\installer\api.js
    error Parsing error: The keyword 'export' is reserved
    三、
    resource\frontend\src\lib\installer\index.js 和 main.js
    error Parsing error: The keyword 'import' is reserved
        45
    mrfox   2018-08-28 16:39:30 +08:00
    @lxrmido 不过虽然有这些报错,实际是起了作用,耶!谢谢指导

    好奇 VUE 编译后变成的是压缩版本是为了提高效率或保护源码
        46
    lxrmido   2018-08-29 09:13:26 +08:00
    @mrfox

    只是因为浏览器不能直接解析 vue 所以需要编译,前端的源码保护是不存在的……
        47
    mrfox   2018-08-29 13:34:47 +08:00
    @lxrmido 明白了
    另外用 example 生成的单词表还没筛选完,昨天想做个实验看看处理第二个单词表是什么样的

    另找了一个机器试了下两个短文,发现到第二个文章时,上一篇文章的生词还是会出来(不是在最后出来)
    想知道如何设置才能达到先把生词都选出来最后统一再背的效果,谢谢
        48
    mrfox   2018-08-29 13:43:48 +08:00
    似乎是对快捷键“前进”“后退”的理解有误,我再试试,再想想……前进不是向右么
        49
    mrfox   2018-08-29 15:13:10 +08:00
    请问标记错的单词(忽略)如何回退再标成生词,目前的前进后退似乎是针对生词的
        50
    lxrmido   2018-08-29 16:56:28 +08:00
    @mrfox

    还没加这个设置……

    标错了的单词也还没办法加回去……
        51
    mrfox   2018-08-31 18:15:53 +08:00
    @lxrmido 看到更新了忽略过往单词的功能,鼓掌
    理解没错的话,即比如用例子生成了 6K 词,筛选了 3K ( 2K 认识,1K 不认识),此时再用一个新的 TXT 创建词表的话,在这个 6K 里的词都不会再出来,只把 6K 外的词加入待处理,对吧
        52
    mrfox   2018-08-31 18:33:18 +08:00
    本层的话请非小白非偏执忽略:
    这段折腾了好久在快捷键上,开始用 autokey 什么的一直不成功
    后来作者更新了快捷键功能也获得了启发,应该从 javascript 着手
    想实现一键把单词标记星号并跳至下一个词(其实两键已经够用,流汗)
    终于搞成了分享下
    1. http://openjs.com/scripts/events/keyboard_shortcuts/
    下载这个 js 可以定义快捷键
    2. https://stackoverflow.com/questions/14226803/wait-5-seconds-before-executing-next-line
    这个回答中 Kai Noack 的代码改一下加到上面的文件中,例:
    shortcut.add("right",function() {
    document.getElementsByClassName("btn star")[0].click();
    delay(function(){
    document.getElementsByClassName("btn next")[0].click();
    }, 1000 );
    });
    其实答案评论里说什么 jquery 我也没看懂,都是试出来
    比如花了不少时间才试出来按动按钮需要加[0]
    还是需要系统学习啊
        53
    lxrmido   2018-08-31 23:33:33 +08:00
    @mrfox
    emmm ……分等级,最高级的时候是你看过的单词都不会加进去
        54
    sammo   2018-09-01 17:47:28 +08:00
    单词展示器。词典片段展示器。和背不背单词无关
        55
    Chenyao   2018-09-01 22:47:50 +08:00
    这个是发音的链接:
    https://dict.youdao.com/dictvoice?audio=interested&type=2

    这个是有道官网直接抓出来的。我造了另外另外一个背单词的轮子可以来玩: https://github.com/Chenyao2333/malleable
        56
    mrfox   2018-09-06 02:33:17 +08:00
    https://imgur.com/a/JC249qL
    释义长的话字体会突然变得很小
        57
    mrfox   2018-09-06 02:52:59 +08:00
        58
    lxrmido   2018-09-06 08:33:17 +08:00
    @mrfox

    因为放不下……有什么建议?
        59
    mrfox   2018-09-06 18:03:21 +08:00
    @lxrmido 尝试建议一下
    释义相对重要,例句参考的情况多些
    简单的做法即不要求一页显示完,保持字体大小不变
    一页显示全的话或者把给释义的区间再调大些
    再或者释义超过 18 还昌 20 字换一行,超过 2 行的不显示全,加一个。。。符号让用户自己点开
        60
    mrfox   2018-09-06 18:31:11 +08:00
    https://imgur.com/a/p7EmpHs
    这个例子更明显些,释义字小而例句显示完了下面还有空间
    可以考虑释义占正常字体大小两行的地方,超出的话加一个展开符号(如叠放向下的两个折线箭头)
        61
    mrfox   2018-09-09 14:22:26 +08:00
        62
    lxrmido   2018-09-09 18:06:52 +08:00
    @mrfox 修改了下,你试试
        63
    mrfox   2018-09-10 03:37:04 +08:00
        64
    mrfox   2018-09-12 17:34:02 +08:00
    https://imgur.com/a/29BAiBc
    有时释义里会遇到乱码,不知何故
    这些问号会不会影响分词也不知道
        65
    mrfox   2018-09-17 05:01:47 +08:00
    终于刷完了示例文章生成的 6K 词,明天试试对新文章的处理
        66
    lxrmido   2018-09-17 07:39:28 +08:00 via iPhone
    @mrfox 加油
        67
    mrfox   2018-09-24 19:28:03 +08:00
    中秋快乐~
        68
    lxrmido   2018-09-24 20:38:25 +08:00 via iPhone
    @mrfox 同乐同乐
        69
    mrfox   2018-09-27 18:48:46 +08:00
    建议增加一个词义缓出的选项,有时觉得认识实际上是因为已经看到词义了~
        70
    mrfox   2018-09-28 03:08:22 +08:00
    今天遇到一个词 rails ,中文释义出来是铁路股票,我反复查了各种词典,没发现有股票的含义
    回去看 stardict 里的数据,发现它的释义英文是对的,中文就不对了,晕,浪费了不少时间

    由此想到,万一是根据这个背了想再改回来可是难了。。。准确还是第一位的

    一点建议:
    临时的解决办法:界面上在中文解释下也展示英文释义

    长远的办法:
    1. 这个 EDICT 收词量大,但释义方面如果有不准确的地方建议不采用了就,可以只抽取它的单词表
    目前我没找到免费的非常大的单词表,搜索到一个 https://github.com/dwyl/english-words 只有 47 万还不如它大
    真正大的都是语料库里的,但是没免费的,实际上只需要单词列表,其他字段可以不要,但是没有放出这样的
    这个单词表只用来抽取文章中的单词
    2. 释义方面建议采取 https://github.com/ninja33/mdx-server
    这样的话就可以自由选用 mdx 词典,甚至可以多词典同时查,这样出来是准确的,毕竟是词典
    如果遇到查不到的词就单独处理,像目前生成词表时也会有个别词查不到就报查不到就是了(多半是有问题的词)

    谢谢!
        71
    mrfox   2018-09-29 18:56:00 +08:00
    另外,有些带符号的词似乎分词有问题
    比如今天看到的这个
    https://imgur.com/a/pzj0ZNT
    在 EDICT 里是能查到 wasn't 的
        72
    lxrmido   2018-10-07 17:47:22 +08:00
    @mrfox
    mdx 需要研究一下,目前能找到的 mdx 解析轮子都比较古老了;
    分词目前用的是忽略单词里存在符号的策略,确实需要改进;
        73
    lxrmido   2018-10-20 11:33:57 +08:00
    @mrfox

    缓出的选项添加了,最近沉迷加班拖延症越来越严重了
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2010 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 108ms · UTC 15:47 · PVG 23:47 · LAX 07:47 · JFK 10:47
    ♥ Do have faith in what you're doing.