英汉词典数据库 ECDICT 实战指南:一个文件解决你阅读工具的词形、词频与模糊匹配难题
【免费下载链接】ECDICTFree English to Chinese Dictionary Database项目地址: https://gitcode.com/gh_mirrors/ec/ECDICT
每次想给阅读器、背单词 App 或翻译插件加一个"靠谱的英汉词典",你是不是都会卡在同一个环节:查gave提示未收录,查perceived也无结果,想按四六级筛选词汇却拿不到标注数据。与其自造轮子,不如直接用ECDICT 英汉词典数据库——这份开源数据内置 76 万词条、双词频与考试标签,并附带一套 Python 接口,把词形变化、词干还原和模糊匹配一次补齐。
为什么值得用:三个其他词典数据给不了的差异点
1. 它把"单词的亲戚关系"都存下来了
绝大多数词典数据只有"单词 → 释义"的映射,动词时态、名词复数只能靠你自己写算法猜。ECDICT 的exchange字段记录了每个词的完整词形变化,perceive 的数据长这样:
d:perceived/p:perceived/3:perceives/i:perceiving含义是过去分词(d)、过去式(p)、第三人称单数(3)、现在分词(i)。这让你做阅读器时,遇到任意变形都能直接跳回原词展示释义,而不是弹出一句"未收录"。
2. 词频不是单一维度,而是传统与现代双轨
bnc是英国国家语料库的词频排名(覆盖几百年历史文献),frq是当代语料库排名(最近 20 年)。同一单词在两个榜单里可能天差地别——quay(码头)在 BNC 排 8906 名,当代语料库却跌出两万;Taliban 恰好相反。如果你做的是名著阅读工具,bnc更值得参考;做科技资讯阅读器,frq更贴近现实。一次查询,两种口径都在手里。
3. 附带一份 1 亿词条语料训练出的词干数据库
lemma.en.txt扫描了 BNC 全部一亿个词条,把gave → give、teeth → tooth这类不规则的还原关系直接写死在数据库里。对做词频统计、拼写检查的人来说,这比任何基于词尾猜测的算法都可靠。
从零跑通:五分钟做出你的第一个词典查询
环境要求只有 Python 3,无需安装任何第三方依赖。先把数据拉下来:
git clone https://gitcode.com/gh_mirrors/ec/ECDICT cd ECDICT仓库里的stardict.py是唯一要用的接口文件,ecdict.csv是 76 万词条的基础版数据。写个最小查询脚本:
from stardict import DictCsv d = DictCsv('ecdict.csv') # 加载,约 4~5 秒 word = d.query('perceive') print(word['translation']) print('词频:', word['bnc'], word['frq']) print('考试标签:', word['tag'])预期输出(在当前数据上实测):
vt. 感觉, 认知, 理解, 意识到 词频: 2776 2165 考试标签: cet4 cet6 ky toefl ielts到这里你已经能查任意单词了。查询接口对大小写不敏感,query('Perceive')与query('perceive')结果一致。
深入实战:三个能直接搬进业务场景的用法
场景一:给背单词工具做"考试词汇 + 词频"双筛选
要做一套四六级词汇表,用tag字段过滤即可,还能结合双词频按重要性排序:
from stardict import DictCsv d = DictCsv('ecdict.csv') def exam_words(exam, limit=20): result = [] for _, word in d: # 遍历全部词条 data = d.query(word) if exam in data['tag'] and data['frq']: result.append((data['frq'], word)) result.sort() # 按当代词频升序 return [w for _, w in result[:limit]] print(exam_words('cet4')[:5])这段代码筛出四级词并取当代语料库中最常用的 5 个,输出形如:
['a', 'of', 'to', 'and', 'in']做 Anki 卡片时,把词频、柯林斯星级、时态信息一并拼进卡片模板,学习排序就自动合理了。
场景二:抓词软件遇到变形词,先用词干还原再查词典
阅读器里鼠标取词,最烦的就是取到gave、taken这类变形。正确的处理链路是"词干还原 → 词典查询 → 模糊匹配兜底":
from stardict import DictCsv, LemmaDB d = DictCsv('ecdict.csv') lm = LemmaDB() lm.load('lemma.en.txt') # 加载词干库,约 8 万组 def lookup(word): data = d.query(word) if data: return data stems = lm.word_stem(word) # 变形词 → 原型 if stems: return d.query(stems[0]) return None print(lookup('gave')['translation'][:30])gave的词干是give,所以最终打印的是 give 的中文释义前 30 个字符。实测['gave', 'taken', 'teeth']分别还原为['give', 'take', 'tooth'],不规则的teeth也一次命中。
场景三:CSV 太慢?一行代码转 SQLite,查询提速到毫秒级
CSV 加载需要 4~5 秒,本地工具用起来还是偏慢。stardict.py提供了格式转换接口,转换后单次查询在毫秒级:
from stardict import convert_dict, StarDict convert_dict('ecdict.db', 'ecdict.csv') # CSV → SQLite s = StarDict('ecdict.db') # 直接读 SQLite print(s.query('perceive')['phonetic'])转换只需运行一次,之后StarDict与DictCsv的接口完全一致——query、match、query_batch、count全部通用,业务代码不用改一行。这也是项目作者自己推荐的使用方式:日常查询用 SQLite,修订数据时才用 CSV。
附赠:模糊匹配的隐藏字段sw
stardict.py的match(word, limit, strip)第三个参数设为True时,会走sw(strip-word)索引,忽略连字符与空格。搜索long-time时,能同时找到longtime、long time等所有形态——实测匹配结果里前五项就是longtime, long time ago, long-time burning oil, ...。用户拼写不规范时,这一招能救回大量查询失败。
避坑与调优:最常踩的 4 个坑
- 别用 Excel 直接打开 ecdict.csv。数据是 UTF-8 编码,直接双击会乱码。要么用代码读取,要么在 Excel 里走"数据 → 从文本导入",指定逗号分割和 UTF-8 编码。
exchange里偶发冗余标签。早期数据存在f(复数)、b(比较级)、z(最高级)这些与s/r/t重复的旧标签。仓库里的del_bfz.py专门做清洗,转换库之前可以先跑一遍,不影响主流程。- MySQL 版本需要额外驱动。
DictMySQL依赖MySQLdb,没装会直接抛ImportError: No module named MySQLdb。单机应用优先选 SQLite,省心且足够快。 - 词干查询是首选,算法才是兜底。
lemma.en.txt覆盖了 BNC 语料中 95% 的变形,但查不到时不要硬编规则,先用match(..., strip=True)模糊匹配,两者都失败再考虑写后缀判断。
生态与扩展:这些文件各有用武之地
| 文件 | 作用 | 适合场景 |
|---|---|---|
ecdict.csv/stardict.7z | 基础版 / 完整版数据 | 直接查询、PR 修订 |
lemma.en.txt | 8.4 万组词干数据 | 词频统计、取词还原 |
dictutils.py | 词典生成与转换工具 | 导出 StarDict / mdx / Anki 模板 |
wordroot.txt | 词根词缀资料(JSON) | 词源学习功能 |
resemble.txt | 近义词辨析数据 | 辨析类词典扩展 |
linguist.py | WordNet / NodeBox 封装 | 获取英文释义、生成词形 |
社区已有 T.vim、Trans.nvim 等编辑器翻译插件基于 ECDICT 构建,如果你的项目是 Vim/Neovim 插件,可以直接参考它们的接入方式。数据本身是 CSV 纯文本,随时可以 fork 一份自己修订词条,改完再合并回来。
下一步:现在就能动手的三件事
第一,把仓库 clone 到本地,用上面的最小脚本查 10 个你最近学到的单词,看看exchange、tag、双词频这些字段长什么样;第二,写一个convert_dict把数据转成 SQLite,体验毫秒级查询;第三,把你手头某个"查不到变形词"的老功能接上LemmaDB,你会立刻看到取词失败率的下降。
如果对某个字段(比如pos里的词性比例n:46/v:54)或某种转换格式有疑问,仓库里的README.md字段说明和stardict.py自带测试用例就是最好的参考文档。数据在手,剩下的就交给你的想象力了。
【免费下载链接】ECDICTFree English to Chinese Dictionary Database项目地址: https://gitcode.com/gh_mirrors/ec/ECDICT
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考