- 一、关于 kenlm
- 二、安装
- 三、训练 N-gram 模型
- 四、Python 中调用评分
- 五、pycorrector + kenlm 文本纠错
一、关于 kenlm
KenLM: Faster and Smaller Language Model Queries
kenlm 主页:https://kheafield.com/code/kenlm/
Github:https://github.com/kpu/kenlm
常用的 N-gram 训练工具有
- SRILM, http://www.speech.sri.com/projects/srilm
- IRSTLM, http://hlt.fbk.eu/en/irstlm
- BerkeleyLM
- KenLM
…
二、安装
1、下载源码
git clone https://github.com/kpu/kenlm.git
2、安装依赖包
macOS:缺失的包可以通过 brew 安装
$ brew install cmake boost eigen
Debian/Ubuntu
$ sudo apt install build-essential cmake libboost-system-dev libboost-thread-dev libboost-program-options-dev libboost-test-dev libeigen3-dev zlib1g-dev libbz2-dev liblzma-dev
3、编译
mkdir -p build cd build cmake .. make -j 4
4、安装 python 包
在源码目录下执行:
$ python setup.py install
三、训练 N-gram 模型
1、使用 lmplz 训练
lmplz 工具在 build/bin 文件中
./lmplz -o 5 --verbose_header --text data/test.txt --arpa result/xx.arpa --vocab_file result/xx.vocab
- 文件必须是分词以后的文件(chat_log.txt)。
- -o 后面的5表示的是 5-gram,一般取到3即可,但可以结合自己实际情况判断。
- -verbose_header:在生成的文件头位置加上统计信息;
- -S 表示使用系统内存大小,比如 -S 4G, -S 80% 。注意:需要设置合适的内存大小,不然可能会运行失败
2、使用 build_binary 压缩。
压缩模型为二进制,方便模型快速加载:
./build_binary result/xx.arps result/xx.klm
- 你可以命名为 xx.klm 或 xx.bin,有的人会使用后者。但 .klm 和其他模型一起使用的时候,更能明确这是 kenlm 训练的。
四、Python 中调用评分
使用kenlm判断一句话概率
import kenlm
model = kenlm.Model('result/test.arpa')
print(model.score('this is a sentence .', bos = True, eos = True))
- model.score() 中接的是分词后的文本,中文记得分词,否则分数有问题。
- model 加载文件,将 .arpa 文件换为刚压缩的 bin 文件,跑出来的结果是一样的,但是训练速度会快。
五、pycorrector + kenlm 文本纠错
pycorrector 是一个中文文本纠错工具。
支持 Kenlm,ConvSeq2Seq,BERT,MacBERT,ELECTRA,ERNIE,Transformer,T5等模型实现,开箱即用。
pycorrector github :https://github.com/shibing624/pycorrector
安装 pycorrector
pip install -U pycorrector
使用
from pycorrector import Corrector
import os
pwd_path = os.path.abspath(os.path.dirname(__file__))
lm_path = os.path.join(pwd_path, './people2014corpus_chars.klm')
model = Corrector(language_model_path=lm_path)
corrected_sent, detail = model.correct('少先队员因该为老人让坐')
print(corrected_sent, detail)
# 少先队员应该为老人让座 [('因该', '应该', 4, 6), ('坐', '座', 10, 11)]
伊织 2022-06-23(四)



