dsh-word-learn:在 DSH 里划词查词、按词频分级、用 FSRS 复习

前言

以英语为工作语言的开发者会读大量英文技术内容,问题通常不是”没背过单词”,而是”一个词只认得它在某处的那一个意思”,读得准不准自己也不确定。划词翻译能解决”看懂这句话”,查完就忘,没留下可复习的东西。下面介绍的 dsh-word-learn 反过来把目标放在”记住这个词”上:划词后浮出学习卡,查过的词进生词本,再用 FSRS 安排复习。

这是什么

dsh-word-learn 是一个 DSH 插件,由 guicaiyue 维护,GitHub 仓库许可证为 MIT。社区目录把它归在「记忆」分类下。它解决的问题很具体:让开发者在 DSH 对话里读英文时顺手查词、入簿、排期复习,而不是把翻译当终点。

仓库 package.json 中版本号为 0.1.0,engines.node 要求 >=22.5.0。仓库创建于 2026-11-04,截至我们抓取时 GitHub star 为 0,属于个人维护的新项目,功能和排期都在演进。

它和划词翻译有什么不同

README 里直接给了一张对照:

划词翻译 本插件
目标 让你看懂这句话 让你记住这个词
结果 译文,看完就忘 生词本 + 复习排期
对常见词 照样翻译 标出”这是高频词,你多半已认识”
数据 无 本地 SQLite,可导出

也就是说,它关注的是一个词在”今后还会不会遇到、会不会想起来”,而不是当前这一句的语义。

划词卡片:只对对话正文生效

插件最基础的动作是:在 DSH 对话里选中英文单词,就地浮出学习卡,包含音标、释义、词形变化、词频分级、真人发音、例句和近义词。浮层不修改页面 DOM。

范围控制做得比较严格:选区两端必须落在 [data-chat-flow] 内。左侧栏、右侧栏、轨迹(Trajectory)页、英语学习看板一律不响应;锚点找不到就完全不弹,不会退化成”全页面乱弹”。如果你要改这块逻辑,先跑 npx vitest run tests/features/scope.test.mjs,范围判定和排除名单的单一来源在 src/client/features/core.js。

句子翻译与拆词

选中整句时行为不同:先给中文译文,下面再列可拆的候选词。翻译优先用 DSH 自己的模型,理由是技术语境更准,例如 reviews 会译成”复习”、latent space 译成”潜空间”;模型不可用时降级到 MyMemory 公共接口。翻译挂了不影响拆词,拆词走另一条路径。

词典、词频与过滤

词典是 ECDICT 精简出的 SQLite 库,大小 14.4 MB,包含 59,111 条词条和 39,053 条变形索引,离线可查。这意味着查词不依赖网络,词典文件在 <插件目录>/data/ecdict.db,只读。

因为 ECDICT 把变形词单独立条目、词频字段常常是错的,插件做了变形回退:children → child、better → good、perceived → perceive,并继承原形的词频。词频分为五档:最高频 1000、高频 3000、常用 8000、低频、专业词。学习卡会告诉你”这是高频词,你多半已认识”,避免把时间花在已经掌握的词上。

过滤规则里有两类值得注意:代码类文本不放行,src/lib/index.js、config_path、getElementById 不会被当成单词;数值后缀不放行,≈62.3M、≈65.7k 不会被当成 M 或 k。前端和宿主路由两处都设了闸。

发音、例句与自动播放

例句来自 dictionaryapi.dev,带磁盘缓存,取不到就降级,不影响查词。发音走浏览器内置语音 speechSynthesis,零网络、离线可用,优先挑系统里的 natural/online 英文音色,选中的音色与语速记在本地。浏览器不允许录制合成结果,所以没有音频文件缓存,每次都是本机实时合成。

自动发音默认开启,可以关。开关在 设置 → 发音偏好 → 自动发音。进入学习页、单词出现、看答案、拼写结果出来时会各读一遍,营造”边看边听”的环境;喇叭图标随时手动重听,自动播放出错不弹提示。

生词本与能力画像

查过的词自动进生词本,记录原句、遇见次数,并生成五维能力画像:认得、意思、能写、能听、读准。可以收藏和加笔记。

学习页和 AI 分析里的易混淆词/近义词是虚线小标签,鼠标停留或点一下会浮出音标和释义,卡片里可一键加入生词本。悬浮只是预览,不会把扫过的词都塞进生词本。

外观跟随 DSH 主题,颜色取主题令牌 --dsw-alias-*,明暗切换自动跟随,不需要重启。

AI 分析模型与失败提示

词根拆解、干扰项、记忆法用哪个模型,在设置页从 DSH 已有的文本模型列表里选,默认用第一个,不跟随对话的默认模型;改完下一次分析立刻生效。分析失败时会区分原因:拿不到模型服务、没配 Key、限流、输出不是 JSON,分别报出来,不再一律显示”可能是模型不可用”。

学习页与 FSRS-6

左栏上半部分有「英语学习」入口,点开是整页面板,包含今日复习、明日到期、未来 14 天预测、近 14 天复习量、学习进度、能力画像和报表。排期用 FSRS-6(ts-fsrs@6.0.0,MIT),每个词有两条独立线:认得出(receptive)和写得出(productive)。

这里有几条实现上的规则值得看一下:

1、写得出要等认得出稳了才上线。receptive 进入复习态(state>=2)且评过至少 2 次,productive 才排进队列;查词建卡时 productive 只是先把结构建好,不进队列。
2、一个词一轮只出现一次。两条线同一天到期时先做更早到期的那张(同 due 时先认得出),另一张留到下一轮;看板的今日、明日、预测也按词去重。否则就会变成连着做同一个词的 massed practice,而不是间隔重复——README 提到早先的实现漏过这两条,会出现”刚背完一个词,下一张还是它”。
3、两条线练的东西不一样。认得出给英文、选释义;写得出给中文释义、要把单词拼出来,拼对/笔误/写错分别算太简单/记得/忘了。
4、反复忘到 8 次会自动挂起(leech),不再进队列。

「忘了」怎么处理

评「忘了」时不是直接给答案,而是先自己写一次意思,对照释义和原句,再把词拼对一次,才评 Again(1)。单词在拼写阶段被藏起来,喇叭和跳过也一并收起。这一步只增加提取与产出,不改变评级:补记成功照样评「忘了」,免得骗过 FSRS 把间隔拉长。

有义项材料时会先做四选一。AI 按”这个词 + 你遇见它的原句”生成义项材料后,「忘了」会先让你从四个义项里选这句里是哪个,再给”你选的是 X / 这句里是 Y”的反差,然后才进拼写;分析还没跑完时自动退回自由回忆。

另外还有两层:会话末补记,把今天评过「忘了」的词在本轮结束前再拼一次,拼对才清掉那笔”补记债”;次日回访,第二天进学习页做一分钟”昨天忘过的词,这两句里同一个意思吗”,答对清债、答错重开债,只记日志、不动 FSRS,可以跳过。

对话内联标注

读到的英文里,在学、有卡片的词会带一条虚线下划线,悬停或聚焦出小卡,显示这个词在这句里的义项和「收进复习」。原文不改、不翻译。代码块、行内代码、文件名、URL、链接、弹窗、其它插件界面都不标;折叠内容只标标题,展开后才补标;流式生成中的文字不碰。关掉的方式是控制台执行 localStorage['dwl-annotate'] = 'off' 后刷新。

数据位置与备份

文件 位置 说明
词典 <插件目录>/data/ecdict.db 只读,可重新生成
生词本 $DSH_HOME/dsh-word-learn/user.db 不可再生,请备份
外部缓存 $DSH_HOME/dsh-word-learn/cache/ 可删

生词本不可再生,升级或迁移前先备份这个文件。

接口与安全边界

前端(划词卡、标注、学习页)全部编译在 dist/client.js 一个产物里,由宿主按 package.json 的 exports["./client"] 加载,没有前端脚本路由,也没有页面注入。宿主入口是 package.json 的 exports["."] → lib/host/index.js。

数据面有 22 条接口,路径以 src/host/routes/paths.ts 为唯一出口,例如 GET|POST /dsh-word-learn/lookup、POST /dsh-word-learn/grade、GET /dsh-word-learn/dashboard。写操作只接受表里声明的方法,其余返回 405 并带 Allow 头;跨站请求一律 403。这层栅栏对第三方脚本同样生效。

需要重新生成词典时,README 给出的流程是下载 ECDICT 再构建:

# 1) 下载 ECDICT(63 MB)
curl -L -o D:\dsh-cache\tmp\ecdict.csv https://raw.githubusercontent.com/skywind3000/ECDICT/master/ecdict.csv

# 2) 构建
python scripts\build_dict.py

安装与使用前提

README 里没有给出统一的 dsh plugin add ... 命令。安装前先到社区目录页和仓库确认入口,不要凭仓库名拼接安装命令。上手前建议先读仓库里的 AGENTS.md 和 CONVENTIONS.md:前者是改代码前的硬约束和”改 X 去哪里”定位表,后者是目录边界、路由契约、数据访问和测试纪律。提交改动前跑 pnpm verify,它串起构建、产物检查、类型/lint/格式/依赖检查和测试。

插件以当前 DSH 进程权限运行,能读写宿主文件和发起 HTTP 请求。安装前应当检查源码与许可证,确认它不触碰你不希望它访问的数据。

结尾

dsh-word-learn 的价值在于把”读到一个词”和”记住这个词”连起来:本地词典保证查词离线可用,词频分级避免在已掌握的词上反复消耗,FSRS-6 保证复习排期而不是一次性查词。项目处于早期,星标和社区反馈都还很少,适合愿意自己读源码、按 AGENTS.md 约束改代码的开发者。目录页与仓库如下。

  • 社区目录:https://www.skillhub.cn/plugins/guicaiyue/dsh-word-learn
  • GitHub:https://github.com/guicaiyue/dsh-word-learn
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜