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

Aspell 拼写检查完全教程 / 第4章 词典管理

第 4 章:词典管理

词典是拼写检查的核心。本章详解 Aspell 的词典体系——主词典、个人词典、额外词典的管理方法,以及词典格式规范和常见运维操作。


4.1 Aspell 词典体系总览

┌──────────────────────────────────────────────────────┐
│                  Aspell 词典层次                       │
├──────────────────────────────────────────────────────┤
│                                                      │
│  ┌────────────┐  ┌────────────┐  ┌────────────┐     │
│  │  主词典     │  │  个人词典   │  │  额外词典   │     │
│  │ (Master)   │  │ (Personal) │  │ (Extra)    │     │
│  │            │  │            │  │            │     │
│  │ en_US-aspell│ │ ~/.aspell. │  │ tech.pws   │     │
│  │ en_GB-aspell│ │ en_US.pws  │  │ names.pws  │     │
│  │ de-aspell  │  │            │  │            │     │
│  └────────────┘  └────────────┘  └────────────┘     │
│       │                │               │             │
│       └────────┬───────┘────────┬──────┘             │
│                │                │                     │
│         ┌──────▼────────────────▼──────┐              │
│         │      词典查找顺序             │              │
│         │  Personal → Extra → Master   │              │
│         └──────────────────────────────┘              │
│                                                      │
└──────────────────────────────────────────────────────┘

词典类型说明

类型说明文件格式位置
主词典 (Master)语言官方词典,随词典包安装.aspell(压缩)/usr/lib/aspell-0.60/
个人词典 (Personal)用户自定义补充词表.pws (plain word list)~/.aspell.<lang>.pws
额外词典 (Extra)项目/领域专用词表.pws任意路径

查找优先级

输入单词 → 个人词典 → 额外词典 → 主词典 → 未找到(拼写错误)

如果单词在任何一层词典中被找到,则认为拼写正确。


4.2 个人词典(Personal Dictionary)

个人词典是 Aspell 最灵活的词典管理机制,用于存储用户名、专业术语、缩写等主词典中没有的词汇。

4.2.1 默认路径

# 查看个人词典默认路径
aspell config personal
# 输出: ~/.aspell.en_US.pws

# 不同语言对应不同个人词典
# en_US → ~/.aspell.en_US.pws
# de    → ~/.aspell.de.pws

4.2.2 自动添加(交互模式)

在交互模式中,按 4(Add)或 5(Add lowercase)将单词加入个人词典:

aspell check document.txt
# 当遇到 "Aspell" 时按 5 → 会将 "aspell" 加入个人词典
# 当遇到 "GitHub" 时按 4 → 会将 "GitHub" 加入个人词典(保留大小写)

4.2.3 手动编辑

个人词典是纯文本文件,可以直接编辑:

# 查看个人词典内容
cat ~/.aspell.en_US.pws

# 典型内容:
# personal_ws-1.1 en 3
# Aspell
# GitHub
# Markdown

格式说明:

personal_ws-1.1 en <count>
word1
word2
word3
  • 第一行:文件头,包含版本号、语言代码、单词数量
  • 后续行:每行一个单词

4.2.4 手动创建个人词典

# 创建个人词典文件
cat > ~/.aspell.en_US.pws << 'EOF'
personal_ws-1.1 en 5
API
Aspell
Docker
GitHub
Kubernetes
EOF

# 验证
echo "Aspell" | aspell -a --personal=~/.aspell.en_US.pws
# 应该输出 * (拼写正确)

4.2.5 指定自定义路径

# 使用自定义路径的个人词典
aspell check --personal=./project-dict.pws document.txt

# 管道模式
echo "Aspell" | aspell -a --personal=./project-dict.pws

4.2.6 个人词典合并

#!/bin/bash
# merge_dicts.sh — 合并多个个人词典

DICTS=("~/.aspell.en_US.pws" "./project.pws" "./team.pws")
OUTPUT="./merged.pws"

# 收集所有单词(跳过文件头)
WORDS=()
for dict in "${DICTS[@]}"; do
    expanded=$(eval echo "$dict")
    if [ -f "$expanded" ]; then
        tail -n +2 "$expanded" >> /tmp/all_words.txt
    fi
done

# 去重并生成新词典
SORTED=$(sort -u /tmp/all_words.txt)
COUNT=$(echo "$SORTED" | wc -l)

{
    echo "personal_ws-1.1 en $COUNT"
    echo "$SORTED"
} > "$OUTPUT"

rm /tmp/all_words.txt
echo "合并完成: $OUTPUT ($COUNT 个单词)"

4.3 主词典(Master Dictionary)

主词典由语言包安装时提供,包含该语言的完整词表和 affix 规则。

4.3.1 查看主词典信息

# 查看当前语言的主词典路径
aspell config master

# 查看主词典数据目录
aspell config dict-dir

# 列出主词典中的单词数(会很多,用 head 查看前几个)
aspell -d en_US dump master | head -20

# 统计主词典单词数
aspell -d en_US dump master | wc -l

4.3.2 dump 命令族

# 列出所有已安装的词典
aspell dump dicts

# 列出词典配置
aspell dump config

# 列出某个词典的详细配置
aspell -d de dump config

# 列出主词典内容
aspell -d en_US dump master

# 列出个人词典内容
aspell -d en_US dump personal

# 列出所有词典(主 + 个人)
aspell -d en_US dump all

4.3.3 词典别名

# 查看语言别名映射
cat /usr/lib/aspell-0.60/en.alias
# 典型内容:
# en.multi
# en_US.multi

# 查看 multi 文件内容
cat /usr/lib/aspell-0.60/en.multi
# 典型内容:
# add en_US-aspell
# add en_GB-aspell

4.4 额外词典(Extra Dictionaries)

额外词典用于项目或团队级别的补充词表,不修改个人词典或主词典。

4.4.1 创建额外词典

# 创建项目专用词典
cat > ./project-dict.pws << 'EOF'
personal_ws-1.1 en 8
API
Backend
Dockerfile
Frontend
Kubernetes
Microservice
OAuth
WebSocket
EOF

4.4.2 使用额外词典

# 单个额外词典
aspell check --extra-dicts=./project-dict.pws document.txt

# 多个额外词典
aspell check \
    --extra-dicts=./project-dict.pws \
    --extra-dicts=./names.pws \
    document.txt

# 管道模式
echo "Dockerfile" | aspell -a --extra-dicts=./project-dict.pws

4.4.3 团队共享词典

# 将词典放入版本控制
git add project-dict.pws
git commit -m "chore: add project spelling dictionary"

# 团队成员使用
aspell check --extra-dicts=./project-dict.pws README.md

4.4.4 词典文件组织建议

project-root/
├── .aspell/
│   ├── project.pws      # 项目通用词典
│   ├── tech.pws         # 技术术语词典
│   └── names.pws        # 人名/组织名词典
├── docs/
│   └── ...
└── .github/
    └── workflows/
        └── spellcheck.yml

4.5 词典文件格式详解

4.5.1 .pws 格式(Personal Word List)

personal_ws-1.1 <lang> <count>
word1
word2
word3
字段说明
personal_ws-1.1固定文件头标识(版本 1.1)
<lang>语言代码(如 endefr
<count>单词数量(Aspell 会自动更新)

规则:

  • 每行一个单词
  • 支持 UTF-8 编码
  • 大小写敏感:APIapi 是两个不同条目
  • # 开头的行为注释(非官方支持,部分版本可用)

4.5.2 .prepl 格式(Replacement Pairs)

.prepl 文件定义"替换对"——当用户输入某个词时,自动建议替换为另一个词。

personal_repl-1.1 <lang> <count>
<misspelled> -> <correct>

示例:

# 创建替换对文件
cat > ~/.aspell.en_US.prepl << 'EOF'
personal_repl-1.1 en 3
teh -> the
recieve -> receive
occured -> occurred
EOF

使用效果:

echo "teh" | aspell -a
# & teh 3 0: the, tea, tee   ("the" 排在第一位,因为有替换对)

4.5.3 词典与替换对的区别

特性.pws 个人词典.prepl 替换对
作用让单词被视为"正确"让错误单词有优先建议
格式每行一个单词错误 → 正确
使用场景添加专有名词、术语纠正常见拼写错误
路径~/.aspell.<lang>.pws~/.aspell.<lang>.prepl

4.6 词典维护实践

4.6.1 从文档中提取候选词

#!/bin/bash
# extract_candidates.sh — 从文档中提取可能需要加入词典的单词

FILE="$1"
if [ -z "$FILE" ]; then
    echo "用法: $0 <file>"
    exit 1
fi

# 提取拼写错误的单词
ERRORS=$(aspell list < "$FILE" | sort -u)

if [ -z "$ERRORS" ]; then
    echo "没有拼写错误"
    exit 0
fi

echo "以下单词不在词典中:"
echo "$ERRORS"
echo ""
echo "建议操作:"
echo "  1. 确认是正确的专有名词/术语 → 加入个人词典"
echo "  2. 确认是拼写错误 → 修正文档"
echo ""
echo "将这些单词加入词典?(y/N)"
read -r confirm
if [ "$confirm" = "y" ] || [ "$confirm" = "Y" ]; then
    DICT_FILE="${2:-~/.aspell.en_US.pws}"
    # 确保文件头存在
    if [ ! -f "$DICT_FILE" ]; then
        echo "personal_ws-1.1 en 0" > "$DICT_FILE"
    fi
    echo "$ERRORS" >> "$DICT_FILE"
    # 更新计数
    COUNT=$(tail -n +2 "$DICT_FILE" | wc -l)
    sed -i "s/personal_ws-1.1 en [0-9]*/personal_ws-1.1 en $COUNT/" "$DICT_FILE"
    echo "已加入 $DICT_FILE"
fi

4.6.2 清理个人词典中的错误条目

#!/bin/bash
# clean_dict.sh — 检查个人词典中的"可疑"条目

DICT="$1"
if [ -z "$DICT" ]; then
    DICT="$HOME/.aspell.en_US.pws"
fi

echo "检查词典: $DICT"
echo "=========="

# 检查重复条目
DUPES=$(tail -n +2 "$DICT" | sort | uniq -d)
if [ -n "$DUPES" ]; then
    echo "重复条目:"
    echo "$DUPES" | sed 's/^/  /'
fi

# 检查空行
BLANKS=$(grep -c '^$' "$DICT")
if [ "$BLANKS" -gt 0 ]; then
    echo "空行数: $BLANKS"
fi

# 检查大小写冲突(如同时有 API 和 api)
WORDS=$(tail -n +2 "$DICT" | tr '[:upper:]' '[:lower:]' | sort)
CONFLICTS=$(echo "$WORDS" | uniq -d)
if [ -n "$CONFLICTS" ]; then
    echo "可能的大小写冲突:"
    for word in $CONFLICTS; do
        grep -i "^${word}$" "$DICT" | sed 's/^/  /'
    done
fi

echo ""
echo "词典统计:"
echo "  总行数: $(wc -l < "$DICT")"
echo "  单词数: $(tail -n +2 "$DICT" | grep -c '.')"

4.6.3 备份与恢复

# 备份个人词典
cp ~/.aspell.en_US.pws ~/.aspell.en_US.pws.bak

# 恢复个人词典
cp ~/.aspell.en_US.pws.bak ~/.aspell.en_US.pws

# 自动备份脚本
#!/bin/bash
BACKUP_DIR="$HOME/.aspell-backups"
mkdir -p "$BACKUP_DIR"
DATE=$(date +%Y%m%d_%H%M%S)
for dict in ~/.aspell.*.pws; do
    if [ -f "$dict" ]; then
        BASENAME=$(basename "$dict")
        cp "$dict" "$BACKUP_DIR/${BASENAME}.${DATE}"
    fi
done
echo "词典已备份到 $BACKUP_DIR"

4.7 词典优先级与冲突处理

4.7.1 查找顺序

# 当同一个单词出现在多个词典中时:
# 个人词典 > 额外词典 > 主词典

# 验证查找顺序
echo "Aspell" | aspell -a --personal=test.pws --extra-dicts=extra.pws

4.7.2 大小写处理

规则:
- 如果单词在词典中以大写开头(如 API),只有精确匹配才通过
- 如果单词在词典中以小写开头(如 api),大小写变体也通过
- 如果个人词典中有 "api",则 "api"、"Api"、"API" 都通过
- 如果个人词典中有 "API",只有 "API" 通过,"api" 不通过
# 演示大小写规则
cat > test.pws << 'EOF'
personal_ws-1.1 en 2
api
EOF

echo "api" | aspell -a --personal=test.pws  # * (通过)
echo "Api" | aspell -a --personal=test.pws  # * (通过)
echo "API" | aspell -a --personal=test.pws  # * (通过)
cat > test.pws << 'EOF'
personal_ws-1.1 en 2
API
EOF

echo "api" | aspell -a --personal=test.pws  # & (不通过!)
echo "Api" | aspell -a --personal=test.pws  # & (不通过!)
echo "API" | aspell -a --personal=test.pws  # * (通过)

4.7.3 最佳实践

建议:对于缩写词(如 API、HTTP、JSON),使用小写形式加入词典(apihttpjson),这样大小写变体都能通过。


4.8 业务场景

场景 1:技术文档项目词典

# .aspell/project.pws — 项目专用词典
personal_ws-1.1 en 15
api
backend
cache
containerization
devops
dockerfile
frontend
json
kubernetes
microservice
oauth
proxy
restful
websocket
yaml

场景 2:学术论文词典

# 创建学术论文专用词典
cat > academic.pws << 'EOF'
personal_ws-1.1 en 10
heteroscedasticity
multicollinearity
homoscedasticity
pseudocode
preprocessing
subgradient
backpropagation
hyperparameter
regularization
crossvalidation
EOF

场景 3:多语言项目

# 为不同语言维护不同词典
aspell check --lang=en --personal=~/.aspell.en.pws docs/en/
aspell check --lang=de --personal=~/.aspell.de.pws docs/de/
aspell check --lang=fr --personal=~/.aspell.fr.pws docs/fr/

4.9 本章小结

要点说明
主词典语言包提供,包含完整词表和 affix 规则
个人词典~/.aspell.<lang>.pws,用户自定义补充词表
额外词典项目/团队级别词表,通过 --extra-dicts 使用
替换对.prepl 文件,定义错误→正确的优先建议
大小写规则小写词典条目匹配所有大小写变体,大写只匹配精确形式
查找顺序个人词典 → 额外词典 → 主词典

下一步

第 5 章:过滤模式 — 学习 Aspell 如何智能处理 TeX、HTML、Email 等格式文档。