强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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 扩展
Emacsispell/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 详细对比

特性HunspellAspellEnchant
开发语言C++CC
核心算法词缀匹配 + 编辑距离编辑距离 + 发音相似抽象层,代理多种后端
建议质量★★★★★★★★★取决于后端
检查速度★★★★★★★★取决于后端
词典压缩★★★★★★★取决于后端
Unicode 支持原生 UTF-8需要配置统一接口
复合词支持完善有限取决于后端
形态学内置取决于后端
语言覆盖100+ 语言70+ 语言代理所有后端
维护状态活跃(2024)基本停止活跃
许可协议LGPL/MPL/GPLLGPLLGPL
典型用户LibreOffice, FirefoxEmacs, muttAbiWord, GOffice

1.4.3 Enchant 的角色

Enchant 不是独立的拼写检查引擎,而是一个 抽象层/代理(Abstraction Layer),由 AbiWord 项目开发。它可以统一调用多种后端:

┌──────────────────────────────────────────┐
│              应用程序 (Application)        │
│            ┌──────────────┐               │
│            │   Enchant    │  ← 统一 API    │
│            └──────┬───────┘               │
│         ┌─────────┼─────────┐             │
│    ┌────┴────┐ ┌───┴───┐ ┌──┴────┐       │
│    │ Hunspell│ │ Aspell │ │ Hspell│       │
│    └─────────┘ └────────┘ └───────┘       │
└──────────────────────────────────────────┘

Enchant 的设计哲学是:让用户/开发者不必纠结于底层引擎的选择,系统自动使用可用的最佳后端。

1.4.4 选择建议

场景推荐原因
嵌入应用/桌面软件Hunspell语言覆盖广、性能好、压缩率高
终端邮件客户端Aspell发音匹配对打字错误更有效
需要多后端切换Enchant一行代码切换底层引擎
学术写作(LaTeX)HunspellTeX 生态集成成熟
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),以及如何安装和配置不同语言的词典包。


扩展阅读