当前位置:   article > 正文

kenlm实战探索(一)

kenlm

kenlm概述

kenlm是一款统计语言模型工具,训练速度快,而且支持单机大数据的训练。

优点

训练语言模型用的是传统的“统计+平滑”的方法,使用kenlm这个工具来训练。它快速,节省内存,最重要的是,允许在开源许可下使用多核处理器。 kenlm是一个C++编写的语言模型工具,具有速度快、占用内存小的特点,也提供了Python接口。

kenlm安装

编译

mkdir -p build
cd build
cmake …
make -j 4

python模块安装

pip install https://github.com/kpu/kenlm/archive/master.zip

kenlm模型训练

原始语料

文件为:raw.txt,每一行的样本语聊如下所示:

法国斗牛犬体重标准
鹦鹉是如何分类的
两个月不吃东西
巨型阿拉斯加眼睛颜色
宝宝出生不吃东西
锦鲤中毒什么症状
金毛流口水是怎么了
狗狗尿黄尿血是怎么回事
法国斗牛犬体重标准
鹦鹉是如何分类的
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

预处理生成语料

生成语料未见seg_raw.txt,每一行通过空格“ ”进行分割。

<s> 法 国 斗 牛 犬 体 重 标 准 </s>
<s> 鹦 鹉 是 如 何 分 类 的 </s>
<s> 两 个 月 不 吃 东 西 </s>
<s> 巨 型 阿 拉 斯 加 眼 睛 颜 色 </s>
<s> 宝 宝 出 生 不 吃 东 西 </s>
<s> 锦 鲤 中 毒 什 么 症 状 </s>
<s> 金 毛 流 口 水 是 怎 么 了 </s>
<s> 狗 狗 尿 黄 尿 血 是 怎 么 回 事 </s>
<s> 法 国 斗 牛 犬 体 重 标 准 </s>
<s> 鹦 鹉 是 如 何 分 类 的 </s>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

模型训练

训练是根据build/bin/lmplz 来进行,一般来说有两种方式:

管道方式传递

数据print的方式,苏神之前的博客【中文分词系列】 5. 基于语言模型的无监督分词】

python p.py|./kenlm/bin/lmplz -o 4 > weixin.arpa
  • 1

p.py为:

import pymongo
db = pymongo.MongoClient().weixin.text_articles

for text in db.find(no_cursor_timeout=True).limit(500000):
    print ' '.join(text['text']).encode('utf-8')
  • 1
  • 2
  • 3
  • 4
  • 5

生成训练文本

命令行加载训练文本训练模型

./kenlm/bin/lmplz -o 3 --skip_symbols "<unk>" < data/seg_raw.txt > model/model.arpa
or
./kenlm/bin/lmplz -o 3 --verbose_header --text data/seg_raw.txt --arpa model/model.arpa
  • 1
  • 2
  • 3

其中可能涉及参数的大致意义:
-o n:最高采用n-gram语法
-verbose_header:在生成的文件头位置加上统计信息
–text text_file:指定存放预料的txt文件
–arpa:指定输出的arpa文件
-S [ --memory ] arg (=80%) Sorting memory内存预占用量
–skip_symbols : Treat , , and as whitespace instead of throwing an exception

生成的语料可以不加开头、结尾符号。其中, 需要特别介绍三个特殊字符。 结对使用,模型在计算概率时对每句话都进行了处理,将该对标记加在一句话的起始和结尾。 这样就把开头和结尾的位置信息也考虑进来。 如“我 喜欢 吃 苹果” --> “<s> 我 喜欢 吃 苹果 </s>” 表示unknown的词语,对于oov的单词可以用它的值进行替换。

训练过程可参考图解N-gram语言模型的原理–以kenlm为例

kenlm语言模型使用

基本用法

该模块,可以用来测试词条与句子的通顺度:

import kenlm
model = kenlm.Model('model/model.arpa')
print(model.score('鹦 鹉 是 如 何 分 类 的', bos = True, eos = True))
  • 1
  • 2
  • 3

文本之间需要添加空格“ ”,其中参数bos=True,eos=True表示添加<s>和</s>。
其中, 每个句子通过语言模型都会得到一个概率(0-1),然后对概率值取log得到分数(-\propto ,0],得分值越接近于0越好。 score函数输出的是对数概率,即log10(p(‘微 信’)),bos=False, eos=False意思是不自动添加句首和句末标记符,得分值越接近于0越好。 一般都要对计算的概率值做log变换,不然连乘值太小了,在程序里会出现 inf 值。

场景应用

可以用于句子合理度判别,判断一句话是否是一个正常的句子,是否具备合理性。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/357113
推荐阅读
相关标签
  

闽ICP备14008679号