KenLM简介及安装使用

一、KenLM 简介

KenLM 是一个开源、高性能 N-Gram LM 库

支持:

1~5 Gram LM

字符级或词级 N-Gram

高速概率查询,适合大词表(中文大字表 V≈7000)

优势:

查询快(C++ 或 Python wrapper)

内存占用优化,支持二进制 LM 文件(.bin)

二、使用场景

1.CTC 手写识别

CRNN+CTC 输出概率矩阵 T, C

Beam Search 生成候选序列

用 KenLM 对候选序列打分

2.解码阶段

对每条候选序列:

α 为权重,可调

三、KenLM LM 构建步骤

3.1 语料准备

文本语料最好和手写场景匹配(中文长文本或英文句子)

语料格式:

python 复制代码
今天天气真好,我们去公园散步。
今天上午上课内容包括...

3.2 构建 LM

python 复制代码
# 安装 KenLM(Linux/macOS 示例)
git clone https://github.com/kpu/kenlm.git
cd kenlm
mkdir build && cd build
cmake ..
make -j

# 构建 trigram LM
# 假设语料文件:train_corpus.txt
# 输出二进制 LM
./lmplz -o 3 < train_corpus.txt > trigram.arpa
build/bin/build_binary trigram.arpa trigram.bin

-o 3 → trigram

.arpa → 原始文本 LM

.bin → KenLM 二进制 LM,高速查询

四、Python 使用 KenLM

python 复制代码
import kenlm

# 加载 LM
lm = kenlm.LanguageModel("trigram.bin")

# 计算序列 log 概率
seq = "今天的天气真好"
log_prob = lm.score(seq, bos=True, eos=True)  # 包括句首/句尾概率
print(log_prob)

五、CTC + Beam Search + KenLM 解码流程

1.CTC 模型输出

T, C logits → softmax → 概率矩阵

Beam Search

beam width = K(5~10)

2.每条候选序列记录累计 CTC log probability

KenLM 打分

3.对每条候选序列:

python 复制代码
total_score = ctc_log_prob + alpha * lm.score(seq, bos=True, eos=True)

4.选分数最高序列 → 最终识别结果

六、安装kenlm编译遇到问题:

python 复制代码
/home/anaconda3/lib/libboost_program_options.so.1.82.0:对'std::__throw_bad_array_new_length()@GLIBCXX_3.4.29'未定义的引用

1.问题原因:

a.你的系统可能是 GCC < 11,但 libboost_program_options.so.1.82.0 是用 GCC 11+ 编译的

b.Boost 库和系统 C++ 标准库 (libstdc++.so) ABI 不一致

c.典型表现:

KenLM CMake 默认使用系统 GCC

Anaconda 自带 Boost 或 libstdc++ 与系统不一致 → 链接失败

2.解决方案

使用系统自带 Boost 而不是 Anaconda 的

python 复制代码
# 移除 Anaconda Boost 路径对编译器的影响
export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH
export CPLUS_INCLUDE_PATH=/usr/include:$CPLUS_INCLUDE_PATH

或者

python 复制代码
cmake .. -DBOOST_ROOT=/usr -DBoost_NO_SYSTEM_PATHS=ON
相关推荐
锋行天下4 小时前
langgraph 后端发自定义数据,前端接收方法概括
人工智能·python
benchmark_cc6 小时前
用 QuantDash 读取单只股票五档盘口:抽样、缺失值检查与复现记录
python·数据分析·pandas·量化交易·股票数据·quantdash
曲径海盗6 小时前
【Python 学习第 55 天】列表基础
python·学习笔记·编程入门
专注仿真6 小时前
知识问答模型用到的算法集详解及代码实例
python·算法·代码·大模型训练·控制算法
jyOverQ7 小时前
我写了一个 CSDN Markdown 图片助手:告别本地图片逐张上传
python·工具·csdn
刘马想放假10 小时前
CANviz 使用指南|Linux 安装、DBC 解码、实时曲线与 J1939 实战
linux·python·websocket
2601_9679873711 小时前
python判断变量名不要调用任何函数实现
python·函数·语法·判断·变量名
卷无止境11 小时前
SALib敏感性分析的python库学习笔记
后端·python
duansamve12 小时前
Python3+Flask+PostgreSQL18+Vue3项目生产环境用docker如何部署?
python·docker·flask
特立独行的猫A13 小时前
少 3 个环节、少 1 次 ABI、少 3500 行代码:cj-tauri 与 Ionic/Capacitor 的鸿蒙桥接机制对比
java·后端·python