一、小数据
假设有去除特殊符号的训练文本trainfile.txt,以及测试文本testfile.txt,那么训练一个语言模型以及对其进行评测的步骤如下:
1:词频统计
1 | ngram-count -text trainfile.txt -order 3 -write trainfile.count |
其中-order 3为3-gram,trainfile.count为统计词频的文本
2:模型训练
1 | ngram-count -read trainfile.count -order 3 -lm trainfile.lm -interpolate -kndiscount |
其中trainfile.lm为生成的语言模型,-interpolate和-kndiscount为插值与折回参数
3:测试(困惑度计算)
1 | ngram -ppl testfile.txt -order 3 -lm trainfile.lm -debug 2 > file.ppl |
其中testfile.txt为测试文本,-debug 2为对每一行进行困惑度计算,类似还有-debug 0 , -debug 1, -debug 3等,最后 将困惑度的结果输出到file.ppl。
二、大数据(BigLM)
对于大文本的语言模型训练不能使用上面的方法,主要思想是将文本切分,分别计算,然后合并。步骤如下:
1:切分数据
1 | split -l 10000 trainfile.txt filedir/ |
即每10000行数据为一个新文本存到filedir目录下。
2:对每个文本统计词频
1 | make-bath-counts filepath.txt 1 cat ./counts -order 3 |
其中filepath.txt为切分文件的全路径,可以用命令实现:ls $(echo $PWD)/* > filepath.txt,将统计的词频结果存放在counts目录下
3:合并counts文本并压缩
1 | merge-batch-counts ./counts |
不解释
4:训练语言模型
1 | make-big-lm -read ../counts/*.ngrams.gz -lm ../split.lm -order 3 |
用法同ngram-counts
5: 测评(计算困惑度)
1 | ngram -ppl filepath.txt -order 3 -lm split.lm -debug 2 > file.ppl |