srilm是著名的约翰霍普金斯夏季研讨会(Johns Hopkins Summer Workshop)的产物,诞生于1995年,由SRI实验室的Andreas Stolcke负责开发维护。
srilm支持语言模型的估计和评测。估计是从训练数据(训练集)中得到一个模型,包括最大似然估计及相应的平滑算法;而评测则是从测试集中计算其困惑度。
1. 生成n-gram统计文件
ngram-count -vocab train.dict -text train.txt -order 3 -write train.count -unk
ngram-count -vocab train.dict -text train.txt -order 3 -write train.count -unk
其中,-vocab train.dict中 train.dict为词典文件,每行一个词,格式如下:
科学
技术
科技
是
实现
生产力
第一
需要
-text train.txt 中 train.txt为语料库文件,每行中的词用空格隔开,表示分词结果,格式如下:
科学 技术 是 第一 生产力
实现 现代化 需要 科学 技术 因为 它 是 第一 生产力
-order 最大的n元模型,3表示unigram,bigram,trigram
-write train.count 统计文件写到train.count中
-unk 表示没有在词典中的词用<unk>表示
train.count中的内容如下(每行格式为:ngram 词频):
<s> 2
<s> 科学 1
<s> 科学 技术 1
<s> 实现 1
<s> 实现 <unk> 1
科学 2
科学 技术 2
科学 技术 是 1
科学 技术 <unk> 1
技术 2
技术 是 1
技术 是 第一 1
技术 <unk> 1
技术 <unk> <unk> 1
是 2
是 第一 2
是 第一 生产力 2
第一 2
第一 生产力 2
第一 生产力 </s> 2
生产力 2
生产力 </s> 2
</s> 2
实现 1
实现 <unk> 1
实现 <unk> 需要 1
<unk> 3
<unk> 需要 1
<unk> 需要 科学 1
<unk> <unk> 1
<unk> <unk> 是 1
<unk> 是 1
<unk> 是 第一 1
需要 1
需要 科学 1
需要 科学 技术 1
2. 生成语言模型
ngram-count -vocab train.dict -read train.count -order 3 -lm train.lm -interpolate -unk
ngram-count -vocab train.dict -read train.count -order 3 -lm train.lm -interpolate -unk
其中,-read train.count 读取上一步生成的统计文件
-lm train.lm 生成最高为trigram的语言模型train.lm
-interpolate 利用差值算法
生成的语言模型train.lm为ARPA格式的语言模型,如下:
\data\
ngram 1=11
ngram 2=13
ngram 3=2
\1-grams:
-0.9542425 </s>
-99 <s> -0.39794
-0.7781513 <unk> -0.4259686
-1.255273 实现 -0.2218487
-0.9542425 技术 -0.3357921
-0.9542425 是 -0.4259687
-0.9542425 生产力 -0.4259687
-0.9542425 科学 -0.4259687
-1.255272 科技
-0.9542425 第一 -0.4259687
-1.255273 需要 -0.2498775
\2-grams:
-0.4771213 <s> 实现
-0.4771213 <s> 科学
-0.60206 <unk> <unk>
-0.60206 <unk> 是
-0.60206 <unk> 需要
-0.30103 实现 <unk>
-0.4771213 技术 <unk>
-0.4771213 技术 是
-0.1760913 是 第一 0
-0.1760913 生产力 </s>
-0.1760913 科学 技术
-0.1760913 第一 生产力 0
-0.30103 需要 科学
\3-grams:
-0.1760913 第一 生产力 </s>
-0.1760913 是 第一 生产力
\end
上面的两个步骤可以直接生成,如下:
ngram-count -vocab train.dict -text train.txt -order 3 -lm train2.lm -interpolate -unk
ngram-count -vocab train.dict -text train.txt -order 3 -lm train2.lm -interpolate -unk
3. 计算测试数据的困惑度
上面已经生成了语言模型train.lm,利用它来测试数据的困惑度
ngram -ppl test.txt -order 3 -lm train.lm -unk -debug 2
ngram -ppl test.txt -order 3 -lm train.lm -unk -debug 2
测试数据的格式同语料数据,每个句子内部用空格隔开表示分词。
结果如下:
reading 11 1-grams
reading 13 2-grams
reading 2 3-grams
科技 人员 需要 科学 技术
p( 科技 | <s> ) = [1gram] 0.02222224 [ -1.653212 ]
p( <unk> | 科技 ...) = [1gram] 0.1666667 [ -0.7781513 ]
p( 需要 | <unk> ...) = [2gram] 0.25 [ -0.60206 ]
p( 科学 | 需要 ...) = [2gram] 0.5 [ -0.30103 ]
p( 技术 | 科学 ...) = [2gram] 0.6666666 [ -0.1760913 ]
p( </s> | 技术 ...) = [1gram] 0.05128205 [ -1.290035 ]
1 sentences, 5 words, 0 OOVs
0 zeroprobs, logprob= -4.800579 ppl= 6.310976 ppl1= 9.122542
我们 国家 需要 科技 的 大力 发展
p( <unk> | <s> ) = [1gram] 0.06666666 [ -1.176091 ]
p( <unk> | <unk> …) = [2gram] 0.25 [ -0.60206 ]
p( 需要 | <unk> …) = [2gram] 0.25 [ -0.60206 ]
p( 科技 | 需要 …) = [1gram] 0.03125004 [ -1.505149 ]
p( <unk> | 科技 …) = [1gram] 0.1666667 [ -0.7781513 ]
p( <unk> | <unk> …) = [2gram] 0.25 [ -0.60206 ]
p( <unk> | <unk> …) = [2gram] 0.25 [ -0.60206 ]
p( </s> | <unk> …) = [1gram] 0.04166668 [ -1.380211 ]
1 sentences, 7 words, 0 OOVs
0 zeroprobs, logprob= -7.247843 ppl= 8.053421 ppl1= 10.84941
file test.txt: 2 sentences, 12 words, 0 OOVs
0 zeroprobs, logprob= -12.04842 ppl= 7.254402 ppl1= 10.09335