继续搓英汉双解词典v3
Posted | stdout
去年搓了个词典,本来懒得动了,但是看到opencode订阅还没用完,deepseek那么便宜,想着不用白不用,找了个最浪费token的方式,让AI再写一部词典
当年的AI我记得还是 gemini-2,其实很多东西不成熟。我也对AI脾气没摸准,很自然的就:“请输出 JSON”。今年学聪明了,直接上YAML。AI高呼你这想法真离经叛道但又极度合理。
甚至,block scalar(|)支持多行文本,不转义!
一个小技巧是,尽量避免嵌套的,什么 map套entries,每个 entry 再挂一个 senses 列表、每个 sense 再挂一个 examples 列表,别玩这一套。直接拍扁,层级尽可能少,整个 schema 里不允许出现一个方括号!
AI帮我写了个 validator,调教这一块还得是AI卷AI。不对劲的就返回错误让AI二次输出。但是基本都是1-pass通过。之前JSON翻车太多了。
跑了一圈还发现,短码对模型不友好。词性枚举最初写成 n/v/adj/adv,模型就开始输出 v.、V、vb、verb,改成全称 noun/verb/adjective 。我觉得这个跟 LLM 预训练 token 的分布高度相关,不要以为「缩写」对人和机器更友好!LLM是反过来的。
10年前第一版想的是薅Google Dictionary羊毛,去年第二版静态站中毒,想弄json,后来发现不对。20k的词汇量,对应20k个零碎小文件不可控。
这次第三版,回到传统RDBMS。一开始想一张 FTS5 全文索引表,让用户能模糊搜索、子串匹配,甚至搜中文释义——感觉这才配得上"AI 词典"的科技感。
然后又想了下,问了自己一个本该一开始就问的问题:用户到底是怎么用词典的?
输入一个完整的词,得到词条。前缀联想 输入 "run" 提示 "running" 用一句 LIKE 'run%' 就够了,一共三张表
words:词头senses:义项surfaces:一切能解析到这个词的可供检索字符串:原形、变形、同义词、反义词、搭配
一个激进的决定,words 这个表甚至不保存词汇的归一化原始形式!直接作为 lemma 放到 surfaces 表里!
接下来,让AI写了个「递归」采集器,很简单,随便想几个单词,prompt就是让AI做词典;然后词典里的解释、例句再分词,再翻译。直到所有翻译和解释能自我包含,这样自动生成一部完整的词典。
让AI搓 BFS,起初几万词汇很舒服,很快发现,漂移进生僻词陷阱了:water 的释义带出了 odorless、colorless、tasteless,这些是英语词没错,所以又让AI给每个词标上分级,A1 A2 B1 B2 C1 C2 按顺序遍历。但我脑子抽了,没想到,这词在生成YAML之前,不知道自己的等级,AI提醒我,假设子词继承父词级别——够用就行。
后来想了下,反正AI闲着也是闲着,于是下载了一个权威 CEFR 词表,17 万词
https://github.com/Maximax67/Words-CEFR-Dataset/
这个词表的 level 是浮点,1.0=A1 … 6.0=C2,1.5 是 A1/A2 边界,天然可以先处理常用词后采集偏科的
甚至还提供了真实词频,the 出现了 928 亿次,还有 lemma 链接:ran→run、went→go、children→child,甚至还可以求出 clothes 没有链接,所以它是真词头。
跑起来之后,词典开始自己生长,敲入 caffeinate 睡了一觉。第二天起来一看,额度才用了 10% 不到。。Deepseek太耐烧了
顺便发现opencode关只在流式模式下返回内容,非流式直接返回空 body。挺浪费的说实话。
整理发现这个 CEFR 也tmd掺水,AI看了下挺多 复数、连字符、西语、意大利语词汇混进去,后来干脆一刀切100w以上词频才纳入采集
哎,还得二次清洗
后续会把这个词典做出 on-demand 的:用户查一个词,命中缓存直接返回;没命中,当场调一次 AI 生成、校验、入库
最后,地址依然是:https://def.est.im/
清洗的时候AI又说怎么这么多 人名 地名 乐队名,噪音可以跳过。
我想了下,其实对 language learner 还挺有用的。你输入一个名字,其实想知道这个名字的内涵,来源,是否得体,有坑的。
传统词典那些老学究那有时间给你折腾这那的。
一个地名儿,既然你查了,肯定是从某个书 杂志 地图册 上碰到的,你是冲着大新闻、 奇闻逸事 来的。传统词典只告诉这是某国某地,有啥用?
其次AI又挑三拣四,说这西语词汇,扔了吧。老美现在西语人口那么多,流行文化我感觉都半边天了,用户查词汇碰到的概率很高。
过去纸质时代,让双语高手静下来编一部这样的词典,不容易
但是AI时代,有机会了。
我想就从这样的第一性原理,做一个完全服务语言学习者,感兴趣的词典。
不过 tokens 已经耗尽了,下次再说。
Comments