NLP - KenLM

文章目录

    • 一、关于 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

brew 如果设置为其他源(中科大、清华等),可能导致下载失败,可以尝试切换为原本的源,参考:
https://blog.csdn.net/lovechris00/article/details/121613647


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.klmxx.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(四)

你可能感兴趣的:(NLP,深度学习,kenlm)