SRILM是一个统计和分析语言模型的工具,提供一些命令行工具,如ngram,ngram-count,可以很方便的统计NGRAM的语言模型。
1,下载
我开始在这个站上下载,感觉很慢。 http://www.speech.sri.com/projects/srilm/download.html。 然后直接换了个站下载,直接下载1.5版本的。
wget ftp://ftp.speech.sri.com/pub/people/stolcke/srilm/srilm-1.5.7.tar.gz 。这个版本也不低,现在最高的版本是1.7.
2,安装
我的机器是64位的。
安装这个包依赖于TCL包,TCL的下载地址是:http://www.tcl.tk/software/tcltk/download.html(这个包的安装,很常规,解压后,进入unix目录,下面就有configure文件了)
安装srilm过程:
- export SRILM=`pwd`。
- make MACHINE_TYPE=i686-m64。
- 如果提示找不到TCL库之类的错误,就修改Makefile文件,里面有 TCL_INCLUDE 与 TCL_LIBRARY 两个变量 ,比如可以分别设为-I/usr/local/include 以及 -L/usr/local/tcl8.5
- 进入test目录试一下,cd test ; make all .
新建一个文本文件,如source.txt,随便搞个内容,如下:
- [root@localhost lm]# cat source.txt
- If you do want to use SRILM or are generally interested in it, please consider joining the SRILM user mailing list.
- [root@localhost lm]#
- ngram-count -text source.txt -lm source.lm
这就会建立基于source.txt的统计语言模型了,存储在source.lm中,如下:
- [root@localhost lm]# cat source.lm
- \data\
- ngram 1=22
- ngram 2=22
- ngram 3=0
- \1-grams:
- -1.341524 </s>
- -99 <s> -99
- -1.341524 If -99
- -1.050479 SRILM -7.440329
- -1.341524 are -99
- -1.341524 consider -99
- -1.341524 do -99
- -1.341524 generally -99
- -1.341524 in -99
- -1.341524 interested -99
- -1.341524 it, -99
- -1.341524 joining -99
- -1.341524 list. -99
- -1.341524 mailing -99
- -1.341524 or -99
- -1.341524 please -99
- -1.341524 the -99
- -1.341524 to -99
- -1.341524 use -99
- -1.341524 user -99
- -1.341524 want -99
- -1.341524 you -99
- \2-grams:
- 0 <s> If
- 0 If you
- -0.30103 SRILM or
- -0.30103 SRILM user
- 0 are generally
- 0 consider joining
- 0 do want
- 0 generally interested
- 0 in it,
- 0 interested in
- 0 it, please
- 0 joining the
- 0 list. </s>
- 0 mailing list.
- 0 or are
- 0 please consider
- 0 the SRILM
- 0 to use
- 0 use SRILM
- 0 user mailing
- 0 want to
- 0 you do
- \3-grams:
- \end\
- [root@localhost lm]#
如果希望只针对指定的词进行统计,就建立一个词列表文件,如source.dict
- [root@localhost lm]# cat source.dict
- you
- are
- list
- please
- [root@localhost lm]#
这样的话,等下就只是统计这四个单词。执行命令:
- ngram-count -text source.txt -lm source.lm -vocab source.dict
- [root@localhost lm]# cat source.lm
- \data\
- ngram 1=6
- ngram 2=0
- ngram 3=0
- \1-grams:
- -0.60206 </s>
- -99 <s>
- -0.60206 are
- -7.180781 list
- -0.60206 please
- -0.60206 you
- \2-grams:
- \3-grams:
- \end\
- [root@localhost lm]#
没有2-grams,修改source.dict,使其可以出现2-grams语法,如下:
- [root@localhost lm]# cat source.dict
- you
- do
- mailing
- are
- list
- please
- [root@localhost lm]#
再执行ngram-count,结果如下:
- [root@localhost lm]# cat source.lm
- \data\
- ngram 1=8
- ngram 2=1
- ngram 3=0
- \1-grams:
- -0.7781513 </s>
- -99 <s>
- -0.7781513 are
- -0.7781513 do
- -7.269613 list
- -0.7781513 mailing
- -0.7781513 please
- -0.7781513 you -99
- \2-grams:
- 0 you do
- \3-grams:
- \end\
- [root@localhost lm]#
此时,you do作为一个2-gram出现,表示you 后面有do出现的概率。
- 假设下一个词的出现依赖它前面的一个词,即 bigram,则有:
p(S)=p(w1)p(w2|w1)p(w3|w1,w2)…p(wn|w1,w2,…,wn−1)=p(w1)p(w2|w1)p(w3|w2)…p(wn|wn−1)
- 假设下一个词的出现依赖它前面的两个词,即 trigram,则有:
p(S)=p(w1)p(w2|w1)p(w3|w1,w2)…p(wn|w1,w2,…,wn−1)=p(w1)p(w2|w1)p(w3|w1,w2)…p(wn|wn−2,wn−1)
那么,我们在面临实际问题时,如何选择依赖词的个数,即 N 呢?
- 更大的 n:对下一个词出现的约束信息更多,具有更大的辨别力;
- 更小的 n:在训练语料库中出现的次数更多,具有更可靠的统计信息,具有更高的可靠性。
理论上,n 越大越好,经验上,trigram 用的最多,尽管如此,原则上,能用 bigram 解决,绝不使用 trigram。
从本质上说,这种统计语言模型描述的是有限状态的正则文法语言,而自然语言是不确定性语言,因此与真实语言差异较大,表达能力有限,尤其无法较好的处理长距离依赖语言现象。但是,其抓住了自然语言中的局部性约束(Local Constrain)性质,因此该模型在实际应用中取得了较大的成功