自然语言处理初步作业四

发布时间 2023-08-09 06:27:15作者: LateSpring

1.阅读参考书中介绍的其它数据平滑方法,自行选择一种进行简要的评价

Katz平滑方法属于后备(back-off)平滑方法。这种方法的中心思想是,当某一事件在样本中出现的频率大于k时,运用最大似然估计经过减值来估计其概率。当某一事件的频率小于k时,使用低阶的语法模型作为代替高阶语法模型的后备,而这种代替必须受归一化因子α的作用。对于这种方法的另一种解释是,根据低阶的语法模型分配由于减值而节省下来的剩余概率给未见事件,这比将剩余概率平均分配给未见事件要合理
这和其他所获得的实验取得一样好的结果。同时,该模型更容易构建、实现和使用。最后,该方法的新颖之处在于非线性的“back-off”过程,它利用了对不可见的m-gram的概率的显式估计,而不是像图灵公式一样在计算的细节中。

2.使用讲义中提到的2个语言模型工具(任选一个),对人民日报语料训练语言模型[人民日报语料会提供给大家];需要提交一个报告,说明使用工具的过程。

我使用的是SRI语言模型工具,以下是报告:

使用SRI语言模型工具报告

一、实验步骤:

1.安装并配置SRILM

在Ubuntu上安装SRILM比在Windows上简单得多。
我安装的是srilm-1.7.1,下载srilm-1.7.1.tar.gz,将下载的文件移至/home/jinyuos/下载。
打开终端,输入以下命令(默认目录为 /usr/share/srilm,如果要更改,需将其替换为对应的路径):

mkdir /usr/share/srilm
mv srilm-1.7.1.tar.gz /usr/share/srilm/
cd /usr/share/srilm
tar xvf srilm-1.7.1.tar.gz

打开Makefile文件

sudo gedit Makefile

修改Makefile:在第7行中,查找以下内容

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

删除#并替换为此行:

SRILM = /usr/share/srilm

保存并关闭文件。返回终端,使用超级用户权限sudo。如果遇到错误tcsh: command not found,请在再次尝试之前键入sudo apt-get install tcsh。我使用的是Ubuntu 64位:

sudo tcsh
sudo make NO_TCL=1 MACHINE_TYPE=i686-m64 World
sudo ./bin/i686-m64/ngram-count -help

2.Execute SRILM

下载人民日报语料。将文件人民日报语料.txt的Utf-8编码版复制到路径\usr\share\srilm\i686-m64。手动复制可能不起作用,可以使用Terminal,使用如下命令:

sudo cp 人民日报语料.txt '/usr/share/srilm/bin/i686-m64'

现在移到上面的文件夹并运行程序,统计语料库生成n-gram统计文件:

cd '/usr/share/srilm/bin/i686-m64'
sudo ./ngram-count -text 人民日报语料.txt -order 3 -write ceshicount.txt -unk

-text 语料库,一行行的数据,行内数据用空格隔开来表示切词,格式如下:

迈向  充满  希望  的  新  世纪  ——  一九九八年  新年  讲话  (  附  图片  1  张  )  

-order 最大的n元模型,3表示统计1元模型(unigram)、2元模型(bigram)、3元模型(trigram)
-write 生成的统计文件
-unk 把不在词典里面的次表示为
生成的统计文件(部分):

网线	1
网线 ”	1
网线 ” 之	1
因噎废食	3
因噎废食 。	2
因噎废食 。 </s>	1
因噎废食 。 如果	1
因噎废食 ,	1
因噎废食 , 应该	1
……
结荚	2
结荚 。	1
结荚 。 这	1
结荚 油菜	1
结荚 油菜 喷	1

3.生成语言模型
ngram-count -read ceshicount.txt -order 3 -lm my.lm -kndiscount1 -kndiscount2 -kndiscount3

-read 读统计文件
-lm 产生的语言模型文件,产生的格式如下:

\data\
ngram 1=55305
ngram 2=460654
ngram 3=95131

\1-grams:
-5.551212	19980114-01-001-005	-0.1101607
……
\2-grams:
-0.6495646	19980114-01-001-005 艰苦奋斗
……
\3-grams:
-0.1234466	( ±% )
 
\end\

-kndiscount1 对1元模型进行的折扣平滑的方法,有很多,如good-turing,kneser-ney等

4.用语言模型计算测试数据的困惑度
ngram -ppl 人民日报语料.txt  -order 3 -lm my.lm -unk -debug 2

测试数据的格式同语料数据,每个句子内部用空格隔开表示分词。
部分输出结果如下:

迈向 充满 希望 的 新 世纪 —— 一九九八年 新年 讲话 ( 附 图片 1 张 )
p( 迈向 | <s> ) 	= [2gram] 4.51219e-05 [ -4.34561 ]
p( 充满 | 迈向 ...) 	= [2gram] 0.0667088 [ -1.17582 ]
p( 希望 | 充满 ...) 	= [3gram] 0.505162 [ -0.296569 ]
p( 的 | 希望 ...) 	= [3gram] 0.655038 [ -0.183734 ]
p( 新 | 的 ...) 	= [3gram] 0.0375433 [ -1.42547 ]
p( 世纪 | 新 ...) 	= [3gram] 0.0141996 [ -1.84772 ]
p( —— | 世纪 ...) 	= [2gram] 0.000691745 [ -3.16005 ]
p( 一九九八年 | —— ...) 	= [2gram] 0.00146468 [ -2.83426 ]
p( 新年 | 一九九八年 ...) 	= [2gram] 0.0485156 [ -1.31412 ]
p( 讲话 | 新年 ...) 	= [2gram] 0.0123271 [ -1.90914 ]
p( ( | 讲话 ...) 	= [2gram] 0.00781594 [ -2.10702 ]
p( 附 | ( ...) 	= [3gram] 0.375433 [ -0.425468 ]
p( 图片 | 附 ...) 	= [3gram] 0.994845 [ -0.00224438 ]
p( 1 | 图片 ...) 	= [3gram] 0.706651 [ -0.150795 ]
p( 张 | 1 ...) 	= [3gram] 0.992794 [ -0.00314102 ]
p( ) | 张 ...) 	= [3gram] 0.992794 [ -0.00314102 ]
p( </s> | ) ...) 	= [3gram] 0.984483 [ -0.00679193 ]
1 sentences, 16 words, 0 OOVs
0 zeroprobs, logprob= -21.1911 ppl= 17.6415 ppl1= 21.1078

……

file 人民日报语料.txt: 19054 sentences, 1.10995e+06 words, 0 OOVs
0 zeroprobs, logprob= -2.21496e+06 ppl= 91.5967 ppl1= 98.9826

logprob是每个n-元组概率的对数和,ppl= 91.5967 ppl1= 98.9826,均为困惑度。

二、实验其他问题解决、实验收获与体会

1.一开始我使用的是对Ubuntu 32位的命令:

sudo tcsh
sudo make NO_TCL=1 MACHINE_TYPE=i686-gcc4 World
sudo ./bin/i686-gcc4/ngram-count -help

然后出现了很多次以下报错

cc1: error: CPU you selected does not support x86-64 instruction set

在互联网上进行了查找资料后改为了Ubuntu 64位的命令,成功运行。

2.在执行以下代码时:

sudo apt-get install tcsh

出现了报错:

E: 无法获得锁 /var/lib/dpkg/lock-frontend。锁正由进程 2681(unattended-upgr)持有 
N: 请注意,直接移除锁文件不一定是合适的解决方案,且可能损坏您的……

我使用了以下命令试图解决:

sudo apt-get update
sudo rm /var/cache/apt/archives/lock  
sudo rm /var/lib/dpkg/lock
sudo rm /var/lib/dpkg/lock-frontend

最终直接kill掉2681进程后消除了报错:

sudo kill 2681

3.不将人民日报语料.txt转为utf-8编码结果会输出乱码

4.统计语料库生成n-gram统计文件,因为我们没有词典文件,所以我们不用-vocab 词典.txt命令