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,每一行的样本语聊如下所示:

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

预处理生成语料

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

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

模型训练

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

管道方式传递

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

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

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')

生成训练文本

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

./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

其中可能涉及参数的大致意义:
-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))

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

场景应用

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

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI研习室

您的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值