尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

试了下KenLM

试了下KenLM
📅 发布时间:2026/6/21 9:24:30

〔图解N-gram语言模型的原理〕〔KenLM〕

先下载编译KenLM

wget -O - https://kheafield.com/code/kenlm.tar.gz | tar xz
# 7z最大压缩后 315Klibboost-program-options-dev libboost-system-dev libboost-thread-dev libboost-test-dev
# 需要下载14.2MB。解压后占据185MB。
# 作者推荐libboost-all-dev,我没装也编译出来了。mkdir kenlm/build cd kenlm/build cmake .. make -j2 # make -j 2路编译,make只是慢点而已

再写个分字程序:

enum { YI = 0x4E00 }; // 第1个汉字的编码是U+4E00,“一”‌void do_file (FILE* f) {static char buf[4 * 1024 * 1024];setvbuf(f, buf, _IOFBF, sizeof(buf));for (wint_t b = 0, c;;) {int n = 0;while ((c = getwc(f)) != WEOF && c != '\n' && c < YI) ++n;if (c == WEOF) return;else if (c == '\n') putwc(c, stdout);else {if (n || b >= YI) putwc(' ', stdout);putwc(c, stdout);}b = c;}
}int main (int argc, char** argv) {static char buf[4 * 1024 * 1024];setvbuf(stdout, buf, _IOFBF, sizeof(buf));setlocale(LC_CTYPE, "");for (int i = 1; i < argc; i++) {if (FILE* f = fopen(argv[i], "r")) do_file(f), fclose(f);}
}#include <stdio.h>
#include <locale.h>
#include <wchar.h>
View Code

然后分字,seg *.txt | lmplz -o 2 >slm.arpa

lmplz默认从stdin读,写到stdout. 

  • --arpa file Write ARPA to a file instead of stdout
  • --text file  Read text from a file instead of stdin

接着‌build_binary‌ slm.arpa slm.bin. 它默认使用mmap: map a file into memory.

不带输出文件名的build_binary‌给出将要使用多大空间的信息。


然后准备q.txt for query,它和seg的输出都是用一个空格把汉字分开,如:

  三 亚 市
  四 亚 县

$ query slm.bin <q.txt
This binary file contains probing hash tables.
三=94 2 -2.183814	亚=222 2 -2.062365	市=61 2 -1.069804	</s>=2 2 -0.59742165 Total: -5.9134045 OOV: 0
四=116 2 -2.7783926	亚=222 1 -4.9270372	县=13 1 -1.9410045	</s>=2 2 -1.3998605	Total: -11.046295 OOV: 0
</s>=2 1 -2.6049278	Total: -2.6049278 OOV: 0
Perplexity including OOVs:	149.2270280712436
Perplexity excluding OOVs:	149.2270280712436
OOVs:	0
Tokens:	9
Name:query	VmPeak:7196 kB	VmRSS:4332 kB	RSSMax:5188 kB
user:0.004243 sys:0 CPU:0.00431801 real:0.000905842

里面的概率应该是10 ** x,反正三亚市的可能性大(多)了。算概率时记着用+而不是*即可。


预告:在下要做个IME.NT,NT代表No Threshold.

拼音到字的转换表和字的bi-gram存放在sqlite数据库里。Console程序,输入拼音串,显示概率最高的汉字串。

我倒是幻想Nuclear Threat: “村村有地道”,人人会做输入法。 :-) 奈何“人生不如意之事,十有八九”。

Penilum meum pullo sententia Latin a est 「通过浪费时间获得快乐」!

相关新闻

  • P14359 [CSP-J 2025] 异或和 / xor(官方数据)
  • 实现AI和BI整合的初步思路和探索
  • 对长度为 n 的数组 arr,调用 `merge_sort(a, 0, n-1)`,在排序过程中,`merge` 函数的递归调用次数大约是多少?

最新新闻

  • IPXWrapper:让经典游戏在现代Windows上重获联机能力的魔法钥匙
  • 魔兽争霸III辅助工具:免费开源的游戏体验增强方案
  • 清运效率提升42%:常州旗硕智慧科技案例解析 - 速递信息
  • Ubuntu 20.04 NFS手动挂载实战:从连接拒绝到稳定自启
  • i.MX 6SoloX引脚配置全解析:从BGA封装到PCB设计实战
  • VisualCppRedist AIO:终极VC++运行库一站式解决方案完全指南

日新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号