# Etymology-Rag
**Repository Path**: williamsucas/etymology-rag
## Basic Information
- **Project Name**: Etymology-Rag
- **Description**: Etymology Intelligent RAG Project - English Vocabulary Knowledge Graph Visualization System
词源智能RAG项目 - 英语词汇知识图谱可视化系统 英
- **Primary Language**: Unknown
- **License**: AGPL-3.0
- **Default Branch**: feature/morphology-databases
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-09-11
- **Last Updated**: 2026-11-02
## Categories & Tags
**Categories**: Uncategorized
**Tags**: 玩转英语词汇, 智能体, AI
## README
# EtymologyRAG · 词源智能 RAG
**输入一个英文单词,把它的词源链、同源词族、语义关系、搭配与真实语料一起摊开。**
后端是一个只读的 SQLite 词库 + Flask API,前端是一份不需要构建的静态页面。
> 当前版本:**V11.121**(`frontend/vue_latest/js/app.js` 里的 `APP_VERSION` 是唯一版本源)
> 许可:**AGPL-3.0-or-later** —— 见 [LICENSE](LICENSE)
> 🧊 **已冻结(2026-10-24)**:自 V11.121 起不再开发。这份是桌面主项目代码;后续要做安卓版时另立工程,不改这里的任何一行。
| | |
|---|---|
| 词条 | 2,380,743 行(`words`) |
| 语义关系 | 4,940,254 条(`relations`)+ 5,156,540 条分类(`relation_categories`) |
| 主库体积 | 4.32 GiB(`data/unified_db/vocabulary.db`) |
| 后端 | Python 3 + Flask(37 个 `.py`(含 `ai/` 包 3 个)/ 31 个路由) |
| 前端 | 23 个 `window.createXxxModule` 模块 + `app.js` + `api.js` / `constants.js` / `utils.js`,**无打包器** |
| 前端依赖 | Vue **3.5.44** / Cytoscape **3.28.1**,**本地固定副本**(`frontend/vue_latest/vendor/`)—— 断网可用 |
| 守卫脚本 | 43 个 `tests/check_*.py` + 3 个 `tests/check_*.js`(无头 `vm` 门)+ 8 个 `tests/test_*.py` + 1 个无头前端 harness |
| 交付加密 | 九个只读库可用 SQLCipher 页级加密(`build/windows/encrypt_data.py`),密钥**不在仓库** |
---
## 1. 运行环境
| 项 | 要求 |
|---|---|
| 操作系统 | Windows 10 1809+ / 11 x64(打包目标);Linux / macOS 源码可跑,未做安装包 |
| Python | **3.10+**;开发与打包实测 **3.12.10 x64** |
| 依赖 | 见 `requirements.txt`(Flask / flask-cors / requests / networkx) |
| 词库 | **不在仓库里**,见第 2 节 |
```bat
python -m venv venv
venv\Scripts\python.exe -m pip install -r requirements.txt
```
> `requirements.txt` 只列**运行时**依赖。`data_processing/` 下重建词库需要
> `nltk` / `wiktextract` / `lupa` / `joblib` 等重包,**不建议**装进同一个 venv
> —— PyInstaller 会把它们一起拖进安装包(`.spec` 里已列进 `excludes`)。
---
## 2. 词库:这是跑起来的前提
仓库**只放代码**,不放数据。`data/` 已被 `.gitignore` 忽略,主库一个文件就 4.32 GiB。
```
data\
├─ unified_db\vocabulary.db 主库(4.32 GiB,词条 / 关系 / 义项标签)
├─ ecdict.db 英汉词典(74.8 MB)
├─ collocations.db 搭配与语料统计(145 MB)
├─ word_family.db 词族与词频(81.2 MB)
├─ oewn.db Open English WordNet(41.8 MB)
├─ wordfreq.db 词频排序(9.6 MB)
├─ cmudict.db 美式音标(5.2 MB)
├─ polarity.db 情感极性(1.8 MB)
└─ degree_scale.db 程度量级(84 KB)
```
三条取数据的路:
1. **拿现成的词库包**(推荐):项目的 Release 里提供 `EtymologyRAG-Data-*.exe`
(Inno 安装包,**2026.11 版实测 833 MiB**,装的是 9 个库、不是整棵 `data\`)。
它**默认装到 `%LOCALAPPDATA%\EtymologyRAG\data`** —— 便携版(exe 旁边)、
Inno 版、MSIX 版三条路都从这个位置读库,所以先装程序还是先装词库都可以。
例外:如果程序是用 Inno 包**装到自定义目录**的(比如为了省 C 盘选 `D:\RAG`),
词库包会跟随过去,装成 `<程序目录>\data`(`launcher` 的候选第 1 条);
老位置已有词库时**不会搬**,避免一份 4.57 GB 变两份。
手动版也行:把这 9 个库按同样结构拷到那个目录即可。
2. **自己重建**:`data_processing/` 下的脚本 + 原始语料(Brown / OANC / ECDICT /
Open English WordNet 等,见 `docs/EXTERNAL_DATA_SOURCES.md`)。**需要几十 GB 磁盘
与数小时算力**,普通使用者不要走这条。
3. **只跑前端看界面**:没有词库时服务会以 503 回应查询接口,但页面本身能打开。
> 程序如何找到词库:`launcher.py` 按 **① exe 旁边的 `data\` → ② `%LOCALAPPDATA%\EtymologyRAG\data`
> → ③ `%LOCALAPPDATA%\Programs\EtymologyRAG\data`(老路径)** 依次探测,谁有主库接谁;
> `--data-dir` / `ETYMOLOGY_DATA_DIR` 仍然优先。`--selftest` 会打出 `data_source` 与
> `data_candidates` 两行,回答「我词库到底装哪了」。
> 装了词库包的话,`data\DATA_VERSION.json` 记着 9 个库的字节数与 sha256 ——
> 报障时先看它(`make_data_version.py --check` 可核对有没有被换过)。
> ⚠️ **`data\vocab_user.db` 与 `data\translation_tm.db` 是「用户可写数据」**
> (单词本、翻译记忆)。程序运行时会自动接管到 `%LOCALAPPDATA%\EtymologyRAG`。
> 发布词库时**绝不能**把它们打进去 —— 那等于把自己的单词本发给所有用户。
### 词库可以是密文(V11.83 起)
交付层的九个只读库可以选择用 **SQLCipher 页级加密**(`build/windows/encrypt_data.py`)。
程序**按文件头判**,不看配置:头 16 字节是 `SQLite format 3\0` 就是明文,否则走 sqlcipher3。
所以明文库与密文库可以同时存在,同一个 exe 都能读。
密文库需要一把密钥,三级查找(**顺序固定**):
`ETYMOLOGY_DB_KEY` 环境变量 → 程序目录的 `dbkey.hex`(打包版在 `_internal\`)→
用户目录 `%LOCALAPPDATA%\EtymologyRAG\dbkey.hex`。密钥本身**永远不进仓库**
(`.gitignore` 已挡 `dbkey.hex` / `build/private/`),丢了就只能重新发一份词库。
排障看 `--selftest` 的三行:`db_kind`(plain / encrypted)/ `db_key`(present + 来源)/
`db_driver`(sqlite3 / sqlcipher3)。细节见 `docs/DB_ENCRYPTION.md`。
---
## 3. 从源码直接运行
```bat
:: ① 常规启动(需要显式给 --db 与 --port)
venv\Scripts\python.exe web_service\web_api.py --db data\unified_db\vocabulary.db --port 5099
:: ② 桌面入口(推荐):自动把 data\ 接到词库、自动挑空闲端口、就绪后开浏览器
venv\Scripts\python.exe web_service\launcher.py
:: ③ 自检:打印四根路径出口 + 主库是否可读(打包后排查"数据到底在哪")
venv\Scripts\python.exe web_service\launcher.py --selftest
```
浏览器打开 即可。
页面**不依赖外网**:Vue 与 Cytoscape 是仓库里的固定副本(`frontend/vue_latest/vendor/`),
断网、CDN 被墙、公司防火墙拦 CDN 都能打开。**不要再往 `index.html` 里加 `http(s)://` 的
`