n-gram统计 计算句子概率 SRILM安装使用

不是非要写一篇的,是这个网上太少了,而且貌似也没有其他工具来做这项工作了。因此本文主要写怎么使用SRILM统计n-gram,并使用该工具得到的语言模型进行句子概率的计算。当然如果有更好的工具请大家一定要推荐一下。

1、安装

安装官方写的很简单,遇到问题,又很少有解答的,难道其他人都一次性安装成功了吗。

环境:unbuntu16.04 64bit

1.1 下载

SRILM下载地址:http://www.speech.sri.com/projects/srilm/download.html

1.2安装依赖

  1.C/C++ compiler:编译器gcc 3.4.3及以上版本
  2.GNU make:构建和管理工程的工具,解释Makefile里的指令,描述了整个工程所有文件的编译顺序和编译规则。这里是为了控制 SRILM 的编译和安装
  3.GNU gawk:GNU所做的awk程序语言。对于文字资料的修改,对比,抽取等处理,使用c或passcal等不方便且费时,awk 能够以很短的程序完成。这里是处理SRILM里的一些脚本文件
  4.GNU gzip:使用C语言编写的一种解压缩软件。这里是为了使 SRILM 能够处理.Z和.GZ后缀的压缩文件
  5.bzip2:数据压缩软件,压缩效率更高。这里是使SRILM能处理.bz2后缀的压缩文件
  6.p7zip:数据压缩软件。这里是使SRILM能处理7-Zip的压缩文件
  7.csh:Unix shell的一种 特别注意我就是这个没有安装,找了一下午问题。
查看是否安装以上依赖,简单的办法就是在命令行下输入命令,比如“csh”,
最好要测试一下,因为貌似make报错不显示那个依赖没有安装。

csh

1.3 修改配置文件

   主目录下修改Makefile文件
   1.找到:

     # SRILM = /home/speech/stolcke/project/srilm

     另起一行输入 SRILM 的安装路径 SRILM = $(PWD)

    2.找到:
     通过 uname -m 命令可以看到我的机器架构是x86_64

     MACHINE_TYPE := (shell (SRILM)/sbin/machine-type)

     在其前加#注释掉,并另起一行输入:

     MACHINE_TYPE := i686-m64

    用编辑器修改 srilm/common/Makefile.machine.i686-m64

   1.找到:

     TCL_INCLUDE =

     TCL_LIBRARY =

     修改为

     TCL_INCLUDE =

     TCL_LIBRARY =

     NO_TCL = X  

    2.找到:

     GAWK = /usr/bin/awk

     修改为

     GAWK = /usr/bin/gawk

1.4.安装SRILM并测试

    1.编译 SRILM

     make World

    2.修改环境变量

     运行命令 export PATH=/home/moses/tools/srilm/bin/i686-m64:/home/moses/tools/srilm/bin:$PATH

    3.测试

     编译通过不等于编译成功,必须利用 SRILM 提供的测试模块进行测试,进入 SRILM 根目录

     make test

2 SRILM使用

SRILM工具包的有两个核心模块,一个是利用训练数据构建语言模型,是ngram-count模块,另一个是对语言模型进评测(计算测试集困惑度),是ngram模块。

2.1. ngram-count

对于ngram-count模块,有很多的计数功能,可以单独生成训练语料的计数文件,然后可以读取计数文件构建语言模型,也可以两步一起做。

假设语料库的名字是train.data,如下:

it ‘s just down the hall . I ‘ll bring you some now . if there is anything else you need , just let me know .
No worry about that . I ‘ll take it and you need not wrap it up .
Do you do alterations ?
the light was red .
we want to have a table near the window .
it ‘s over there , just in front of the tourist information .
I twisted it playing tennis . it felt Okay after the game but then it started turning black - and - blue . is it serious ?
please input your pin number .

1.计数功能——生成计数文件

命令:

ngram-count -text train.data -order 3 -write train.data.count

其中text指向的后边是输入文件, order 3是3元语法到意思,-write后跟到是输出到计数文件,如果不指定-order选项的话,默认是3元语法。

从rain.data.count得到的部分结果如下:

please 1
please input 1
please input your 1
8
it 2
it 's 2
the 1
the light 1
we 1
we want 1
…...
up 1
up . 1
up .
1
Do 1
Do you 1
Do you do 1

这里的分别表示句子的开始和结束,计数文件的格式是:

a_z c(a_z)

a_z:a表示n元语法的第一个词,z表示最后一个词,_表示在a和z之间的0个或多个词
c(a_z):表示a_z在训练语料中的计数

2.从计数文件构建语言模型

命令:

ngram-count -read train.data.count -order 3 -lm train.lm

其中参数-read指向输入文件,此处为 train.data.count ;-order与上同;-lm指向训练好的语言模型输出文件,此处为train.lm,此命令为后面可以接具体的打折算法,和后退或插值相结合,比如后面接-interpolate -kndiscount,其中-interpolate为插值平滑,-kndiscount为 modifiedKneser-Ney 打折法,如果不指定的话,默认使用Good-Turing打折和Katz退避算法,这里使用默认。

train.lm文件部分结果如下:

\data\
ngram 1=75
ngram 2=106
ngram 3=2

\1-grams:
-1.770852 ‘ll -0.03208452
-1.770852 ‘s -0.02453138
-1.770852 , -0.4659371
-1.770852 - -0.02832437
-1.030489 . -0.5141692

……

\2-grams:
-1.361728 ‘ll bring
-1.361728 ‘ll take
-1.361728 ‘s just
-1.361728 ‘s over
-0.1760913 , just
-1.361728 - and
-1.361728 - blue

……
\3-grams:
-0.1760913 . I ‘ll
-0.1760913 it ‘s

其中文件格式:
log10(f(a_z)) a_z log10(bow(a_z))

注:f(a_z)是条件概率即P(z|a_),bow(a_z)是回退权重

第一列表示以10为底对数的条件概率P(z|a_),第二列是n元词,第三列是以10为底的对数回退权重(它为未看见的n+1元词贡献概率)

3.直接结合上面两步

一般的直接利用训练语料构建语言模型,即结合上面两部,命令如下:

ngram-count -text train.data -lm train.lm

这里没写-order,默认是3,没指定打折算法,默认使用Good-Turing打折和Katz退避算法

2.2. n-gram模块测试集困惑度

假设测试集为test.data,如下:

we want to have a table near the window .
read a list of sentence .

先用如下命令:

ngram -ppl test.data -order 3 -lm train.lm

参数-ppl有两个主要任务,一是计算句子对数概率(log10P(T),其 中P(T)为所有句子的概率乘积)二是计算测试集困惑度,有两个指标ppl, 和ppl1

在终端上得到输出结果:
file test.data: 2 sentences, 16 words, 3 OOVs
0 zeroprobs, logprob= -17.9098 ppl= 15.6309 ppl1= 23.8603

输出信息的第一行:2个句子,16单词,3个未登录词;
输出信息的第二行:无零概率,logP(T)=-17.9098,ppl= 15.6309 ppl1= 23.8603
其中ppl和ppl1分别计算如下(这里参考自http://www.52nlp.cn/language-model-training-tools-srilm-details):

ppl=10^{-{logP(T)}/{Sen+Word}};ppl1=10^{-{logP(T)}/Word}
其中Sen和Word分别代表句子和单词数。

在原来命令基础上如果想要得到更详细的输出信息,可以加选项-debug 0-4,-debug 0对应这里的默认情况。比如用ngram -ppl test.data -order 3 -lm train.lm -debug 1,终端上得到输出信息如下:
reading 75 1-grams
reading 106 2-grams
reading 2 3-grams
we want to have a table near the window .
1 sentences, 10 words, 0 OOVs
0 zeroprobs, logprob= -12.4723 ppl= 13.6096 ppl1= 17.6697

read a list of sentence .
1 sentences, 6 words, 3 OOVs
0 zeroprobs, logprob= -5.43749 ppl= 22.8757 ppl1= 64.9379

file test.data: 2 sentences, 16 words, 3 OOVs
0 zeroprobs, logprob= -17.9098 ppl= 15.6309 ppl1= 23.8603

参考
http://blog.csdn.net/a635661820/article/details/43939773
http://blog.csdn.net/zhoubl668/article/details/7759370

你可能感兴趣的:(NLP,n-gram模型,卷积神经网络,SRILM)