Skip to content

Instantly share code, notes, and snippets.

@felix021
Last active August 23, 2026 17:13
Show Gist options
  • Select an option

  • Save felix021/7762067f4510f4b62f8be216f3ac13af to your computer and use it in GitHub Desktop.

Select an option

Save felix021/7762067f4510f4b62f8be216f3ac13af to your computer and use it in GitHub Desktop.
为了读法语原版书,我复刻了一个 LingQ

为了读法语原版书,我复刻了一个 LingQ

起因

这事起头得早。两年前我就在 Kindle 上装了法语版《小王子》,打算硬着头皮读。一页下来生词几十个,读两行就得停下来查一个。查完切回来,刚才读到哪一行来着。一本书没翻几页,吃灰去了。

前一阵又想起这事,想起王同学之前给我安利过一个叫 LingQ 的 App,就是干这个的:帮人读原版书学外语。它的玩法大致是这样:

  • 书里所有词默认标成蓝色,意思是"你还不认识";
  • 点一个蓝词,弹出释义(内置词典,加上其他用户贡献的翻译),保存后变黄,进入复习队列;
  • 真认识的点一下标成已知,变白,不再打扰你;翻页时还留着没动的蓝词,直接算你会了;
  • 攒下的生词走间隔复习,隔几天考你一次,另有一条词汇量曲线给你打卡。

我很喜欢这个思路:默认全不认识,读的时候逐个认领,读完一本书顺手收获一个生词本。

但 LingQ 是订阅制,无限查词、无限导入都要开会员。我只想临时用一阵子,为这个再养一个订阅,有点不情愿。正好这段时间一直在用 Claude Code(终端里的编程 agent),那就试试自己攒一个。

攒一个

思路照着 LingQ 抄,分四步。

第一步,把书弄下来。 拿来开刀的就是那本《小王子》。但做到要发布的时候,Claude 提醒我:圣埃克苏佩里 1944 年才去世,各地对版权到期的算法不一样,这本书还没完全进入公有领域。自己内网里用没人管,放上 GitHub 公开就有风险了。于是换成凡尔纳的《从地球到月球》,1865 年的书,怎么算都是公版,Gutenberg 上有现成的 HTML。下载、清洗、抽成章节和段落,基本是 Claude Code 自己干的,我只管验收。

第二步,离线构建词表。 用 spaCy(一个自然语言处理库)对全文分词,同时做词形还原:把变位形式收回到原形,比如法语里的 vais、va、vont 都算 aller。这一步不做的话,一个动词的六种变位会被当成六个生词,词典和复习量直接翻几倍。再按词频给高频词预置"已认识",不然第一章满屏高亮,没法看。

第三步,建词典。 这是整个项目里我最满意的一步。一开始我想的是阅读时在线查词,每次调一下大模型 API,一个词几百毫秒,读起来很卡。后来换了个角度:一本书的词表是有限的,几千个原形,为什么不提前把整本词典建好?于是把词表切成 12 片,派 12 个 Claude subagent 并行,每个负责一片,直接凭模型自己的语言知识写条目:国际音标、词性、中文释义、变位、原文例句。最后合并成一个 dict.json,查询零延迟,运行时不需要任何大模型。

做到这一步我才回过味来:以前个人搞这种东西,词典是最难过的一关,要么爬有版权的数据,要么一条条录入。现在模型吞过的词典和语料不计其数,它自己就是词典。这活儿放在几年前,个人做不动。

第四步,阅读器加大模型兜底。 前端就一个静态页面,书和词典都是 JSON。手机体验花了最多时间,因为我主要在手机上读:字号、点按热区、防误触,朗读按钮只在设备装了法语语音时才显示。至于整句和词组的翻译,预构建的词典罩不住,划选之后实时调一个 OpenAI 兼容的 LLM 接口。

学习记录上还有个小设计:每个词维护一个整数 k,每"标记认识"一次 k 加一,这个词再次高亮的概率是 0.5^k。标一次还有一半概率再考你,标满四次才基本稳定。纯标记制(标一次就当你会了)太乐观,我对自己还没这个信心。

效果

成品在这里,手机电脑都能直接玩:

https://felix021.github.io/terre-a-la-lune/

流水线和阅读器的源码在 reader-builder。整套流程对语言是通用的,换英语、德语、日语,只是换一个 spaCy 模型,再为每本书写个原文抽取器。

没做好的地方

多义词没处理。更麻烦的是变体碰撞:法语里一个词的变位形式,经常和另一个词的原形长得一模一样,这已经超出多义词的范畴了。现在的做法是给同一个释义,凑合看。真要做好,得结合上下文让模型现场判断,但以我目前的词汇量,凑合看已经够用,就没有继续往下抠。

一点感想

这件事之后,我对付费软件多了一层看法。以前想要一个能力,要么掏钱,要么忍着;现在多了一条路:自己攒一个,一晚上的事。对只是短暂用一下的能力来说,挺划算。

LingQ 比我做得完善得多,该它赚的钱它赚。只是我这种用法太短期,租三个月都嫌长。真要说收获,是我又验证了一次:好多以前个人做不动的事,现在顺手就能做。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment