当前位置: 首页 > news >正文

试了下KenLM

图解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 「通过浪费时间获得快乐」!

http://www.rkmt.cn/news/44817.html

相关文章:

  • P14359 [CSP-J 2025] 异或和 / xor(官方数据)
  • 实现AI和BI整合的初步思路和探索
  • 对长度为 n 的数组 arr,调用 `merge_sort(a, 0, n-1)`,在排序过程中,`merge` 函数的递归调用次数大约是多少?
  • 解析SP3D VUE和PDMS RVM文件-PlantAssistant
  • VBA之Word应用第四章第三节:段落集合Paragraphs对象的手段(一)
  • 日记?
  • 用《西游记》讲透Python name模型:撕最后一张符咒,山为何会消失?
  • 鸿蒙应用开发实战:实现分享卡片保存为图片功能
  • nvidia边缘计算平台 —— Jetson AGX Thor —— 英伟达NVIDIA Jetson AGX Thor 128G开发者套件 AI智能 T5000模组
  • 实用指南:Starlake:一款免费开源的ETL数据管道工具
  • [LangChain] 16. 检索优化
  • 详细介绍:Excel如何排序?【图文详解】Excel表格排序?Excel自动排序?
  • Python实践指南:del与__del__的正确用法,避坑指南
  • 摸鱼笔记[4]-电脑桌面常用软件简介
  • POSIX兼容系统上read和write系统调用的行为总结
  • Spring BeanDefinition接口
  • pythontip 计算字符串中的音节数
  • 2025/11/09 LGNOIpR23
  • 11.7 联考总结
  • 折腾笔记[36]-调用海康SDK实现相机拍照
  • CSP-S 2025 趋势记
  • 结合400行mini-react代码,图文解说React原理
  • UE:告别加载卡顿!一键合并StaticMeshActor方案
  • 第三次
  • CF2013D 题解
  • 题解:AT_agc068_a [AGC068A] Circular Distance
  • 用 OKHttp 和 Retrofit 打造稳如磐石的网络请求:连接池与重试机制的实战指南 - 教程
  • 电脑监控软件,后台监控,千里眼监控
  • go sync.pool 学习笔记
  • 初识分布式训练