Hunspell 拼写检查完全教程 / 第 01 章:Hunspell 概述
第 01 章:Hunspell 概述
1.1 什么是 Hunspell
Hunspell 是一个开源的拼写检查器(Spell Checker)和形态分析器(Morphological Analyzer),采用 C++ 编写,提供跨平台的 C/C++ 库(libhunspell)及命令行工具。它是目前世界上使用最广泛的拼写检查引擎,被集成在以下主流软件中:
| 软件/平台 | 集成方式 | 备注 |
|---|---|---|
| LibreOffice / OpenOffice | 内置引擎 | 从 OpenOffice.org 2.0 开始替代 MySpell |
| Mozilla Firefox / Thunderbird | 内置引擎 | 自 Firefox 3 起替代 Aspell |
| Google Chrome / Chromium | 内置引擎 | 早期使用 WebKit SpellCheck,后切换 |
| macOS(10.6+) | 系统级支持 | 替代 Apple Spell |
| VS Code / Atom | 编辑器插件 | 通过 spell-check 扩展 |
| Emacs | ispell/flyspell 后端 | 通过 ispell.el 桥接 |
| R Studio / TeXstudio | 内置集成 | 学术写作场景 |
| Adobe InDesign | 拼写检查模块 | 排版出版领域 |
1.2 发展历史
1.2.1 MySpell 时代(1998-2003)
Hunspell 的前身是 MySpell,由 Kevin Hendricks 于 1998 年开发,最初为 StarOffice/OpenOffice.org 提供拼写检查功能。MySpell 的设计灵感来自 Ispell,但做了重要改进:
- 支持 Unicode/UTF-8 编码,而非仅限 Latin 字符集
- 引入 条件替换(Conditional Replacement) 机制
- 使用简化的 Flag 系统 管理词缀
时间线:
1998 Kevin Hendricks 开发 MySpell
│
2002 OpenOffice.org 1.0 采用 MySpell
│
2003 László Németh 开始开发 Hunspell(Hungarian + Spell)
│
2005 OpenOffice.org 2.0 切换到 Hunspell
│
2006 Mozilla Firefox 3 采用 Hunspell
│
2007 Hunspell 1.1 发布,支持 Compound 模式
│
2010 macOS 10.6 Snow Leopard 系统级集成
│
2014 Google Chrome 从 WebKit SpellCheck 切换
│
2017 Hunspell 1.6 重写核心算法,性能大幅提升
│
2019 Hunspell 1.7 发布,持续维护至今
1.2.2 命名由来
Hunspell 的名称来源于 Hungarian(匈牙利语)+ Spell,因为作者 László Németh 是匈牙利人,最初的目标是为匈牙利语这种高度屈折语言(Agglutinative Language)提供高效的拼写检查。匈牙利语的一个单词可以有数十万种词形变化,这对词典压缩和检查算法提出了极高的要求。
1.3 核心设计理念
1.3.1 基于词缀的压缩
Hunspell 不存储所有词形,而是存储 词根(Stem)+ 词缀规则(Affix Rules)。例如英语单词 running 不会单独存储,而是通过:
词根:run
词缀规则:N → runn + ing(通过 SFX N 规则)
这种压缩方式使得英语词典(~50,000 词根)能覆盖约 400,000+ 词形。
1.3.2 双文件架构
每个语言词典由两个文件组成:
| 文件 | 扩展名 | 内容 |
|---|---|---|
| 词典文件 | .dic | 词根列表及关联的 affix 标志 |
| 词缀文件 | .aff | 词缀规则、替换规则、特殊标志 |
en_US.dic en_US.aff
───────────── ─────────────
abandon/DGS SET UTF-8
abandonment/S TRY esianrtolcdugmphbyfvkwz
abbreviate/XDGNS
abbreviation/SM SFX D Y 4
... SFX D 0 d e
SFX D 0 ed [^e]
SFX D y ied [^aeiou]y
SFX D 0 ed [^aeiou][ey]
1.3.3 UTF-8 原生支持
Hunspell 从设计之初就支持 UTF-8 编码,能够处理世界上几乎所有书写系统:
- Latin(英、法、德、西……)
- Cyrillic(俄、乌克兰、保加利亚……)
- CJK(中文、日文、韩文——通过特殊机制)
- Arabic、Hebrew、Devanagari 等复杂文字
1.4 Hunspell vs Aspell vs Enchant
1.4.1 Aspell 简介
GNU Aspell 是由 Kevin Atkinson 开发的拼写检查器,长期作为 Linux 系统的默认后端。它的核心特色是基于 发音相似度(Phonetic) 的建议算法——即使拼写严重错误,也能通过发音匹配提供建议。
1.4.2 详细对比
| 特性 | Hunspell | Aspell | Enchant |
|---|---|---|---|
| 开发语言 | C++ | C | C |
| 核心算法 | 词缀匹配 + 编辑距离 | 编辑距离 + 发音相似 | 抽象层,代理多种后端 |
| 建议质量 | ★★★★ | ★★★★★ | 取决于后端 |
| 检查速度 | ★★★★★ | ★★★ | 取决于后端 |
| 词典压缩 | ★★★★★ | ★★ | 取决于后端 |
| Unicode 支持 | 原生 UTF-8 | 需要配置 | 统一接口 |
| 复合词支持 | 完善 | 有限 | 取决于后端 |
| 形态学 | 内置 | 无 | 取决于后端 |
| 语言覆盖 | 100+ 语言 | 70+ 语言 | 代理所有后端 |
| 维护状态 | 活跃(2024) | 基本停止 | 活跃 |
| 许可协议 | LGPL/MPL/GPL | LGPL | LGPL |
| 典型用户 | LibreOffice, Firefox | Emacs, mutt | AbiWord, GOffice |
1.4.3 Enchant 的角色
Enchant 不是独立的拼写检查引擎,而是一个 抽象层/代理(Abstraction Layer),由 AbiWord 项目开发。它可以统一调用多种后端:
┌──────────────────────────────────────────┐
│ 应用程序 (Application) │
│ ┌──────────────┐ │
│ │ Enchant │ ← 统一 API │
│ └──────┬───────┘ │
│ ┌─────────┼─────────┐ │
│ ┌────┴────┐ ┌───┴───┐ ┌──┴────┐ │
│ │ Hunspell│ │ Aspell │ │ Hspell│ │
│ └─────────┘ └────────┘ └───────┘ │
└──────────────────────────────────────────┘
Enchant 的设计哲学是:让用户/开发者不必纠结于底层引擎的选择,系统自动使用可用的最佳后端。
1.4.4 选择建议
| 场景 | 推荐 | 原因 |
|---|---|---|
| 嵌入应用/桌面软件 | Hunspell | 语言覆盖广、性能好、压缩率高 |
| 终端邮件客户端 | Aspell | 发音匹配对打字错误更有效 |
| 需要多后端切换 | Enchant | 一行代码切换底层引擎 |
| 学术写作(LaTeX) | Hunspell | TeX 生态集成成熟 |
| CI/CD 文档检查 | Hunspell | 命令行工具成熟、词典丰富 |
| 弱势语言/方言 | Aspell | 部分小语种 Aspell 词典更成熟 |
1.5 适用场景详解
1.5.1 桌面办公
最经典的使用场景。LibreOffice 使用 Hunspell 作为默认拼写检查引擎,支持:
- 实时红色波浪线标注
- 右键菜单建议更正
- 用户自定义词典
- 多语言文档混合检查
# 查看 LibreOffice 使用的 Hunspell 词典
ls /usr/share/hunspell/
# 输出:en_US.aff en_US.dic zh_CN.aff zh_CN.dic ...
1.5.2 Web 浏览器
Firefox 和 Chrome 的内置拼写检查都基于 Hunspell:
// Firefox 扩展可以通过 XPCOM 访问 Hunspell
// 以下为概念性代码
let spellChecker = Components.classes["@mozilla.org/spellchecker/engine;1"]
.getService(Components.interfaces.mozISpellCheckingEngine);
spellChecker.dictionary = "en-US";
let isCorrect = spellChecker.check("helol"); // false
1.5.3 IDE 与代码编辑器
VS Code 的 streetsidesoftware.code-spell-checker 扩展底层使用 Hunspell:
// VS Code settings.json
{
"cSpell.language": "en",
"cSpell.customDictionaries": {
"project-words": {
"name": "project-words",
"path": "${workspaceFolder}/.vscode/project-words.txt"
}
}
}
1.5.4 CI/CD 自动化
在持续集成管道中自动检查文档拼写:
# GitHub Actions 示例
name: Spell Check
on: [push, pull_request]
jobs:
spellcheck:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Hunspell
run: sudo apt-get install -y hunspell hunspell-en-us
- name: Check spelling
run: |
find docs/ -name "*.md" -exec cat {} \; | \
hunspell -d en_US -l | sort -u
1.5.5 内容管理系统
在 CMS 后台对用户提交的内容进行拼写检查:
# Django 中使用 hunspell 进行内容审核
import subprocess
def check_spelling(text: str, lang: str = "en_US") -> list[str]:
"""返回文本中拼写错误的单词列表"""
process = subprocess.run(
["hunspell", "-d", lang, "-l"],
input=text, capture_output=True, text=True
)
return [word for word in process.stdout.strip().split("\n") if word]
# 使用
errors = check_spelling("This sentense has a typoo")
# → ['sentense', 'typoo']
1.5.6 出版与排版
Adobe InDesign 和 Scribus 使用 Hunspell 进行专业排版时的拼写检查:
- 支持连字符(Hyphenation)断词
- 支持语言标记的混合文档
- 支持自定义专业词典(医学、法律、科技)
1.6 Hunspell 的局限性
尽管 Hunspell 应用广泛,了解其局限性也很重要:
| 局限 | 说明 | 替代方案 |
|---|---|---|
| 不理解上下文 | 只检查单个词,无法发现 their/there 混用 | LanguageTool |
| 无语法检查 | 不能检查主谓一致、时态错误 | LanguageTool, Grammarly |
| 形态学有限 | 对高度屈折语言(芬兰语、土耳其语)支持复杂 | Voikko (芬兰语) |
| 复合词爆炸 | 德语等复合词可能导致性能问题 | 限制复合词深度 |
| CJK 语言局限 | 中文需要分词预处理 | jieba + hunspell 混合方案 |
| 建议质量 | 对严重拼写错误的建议不如 Aspell | 配合发音算法 |
1.7 本章小结
| 要点 | 说明 |
|---|---|
| Hunspell 是什么 | 开源拼写检查引擎,基于词缀匹配 + 编辑距离 |
| 谁在用 | LibreOffice, Firefox, Chrome, macOS, VSCode 等 |
| 从哪来 | MySpell 的继承者,2003 年由匈牙利开发者启动 |
| 核心优势 | 语言覆盖广、性能好、词典压缩率高、UTF-8 原生支持 |
| 主要局限 | 无上下文分析、无语法检查、CJK 需预处理 |
| 选择标准 | 嵌入式应用选 Hunspell,发音匹配选 Aspell,多后端选 Enchant |
1.8 下一章预告
在第 02 章中,我们将详细介绍如何在各平台上安装 Hunspell,包括 Linux(apt/yum/pacman)、macOS(Homebrew)和 Windows(MSYS2/Chocolatey),以及如何安装和配置不同语言的词典包。
扩展阅读
- Hunspell 官方 GitHub — 源代码与发布
- Hunspell 作者 László Németh 的论文 — 词缀压缩算法详解
- MySpell 原始设计文档
- Aspell 手册 — 对比学习
- Enchant 项目主页
- Mozilla Spell Checking Architecture — Firefox 中的实现细节
- Wikipedia: Hunspell — 更多历史背景