实验目的
理解并实践语言模型
实验内容
- 用python 编程实践语言模型(uni-gram 和bi-gram) ,加入平滑技术。
- 计算测试集中句子的perplexity,对比uni-gram 和bi-gram 语言模型效果。
数据集
Example:
(每行数据是一段对话,句子间用__eou__分隔)
How much can I change 100 dollars for ? __eou__ What kind of currency do you
want ? __eou__ How much will it be in Chinese currency ? __eou__ That’s 680 Yuan .
__eou__
What kind of account do you prefer ? Checking account or savings account ?
__eou__ I would like to open a checking account . __eou__ Ok , please just fill out
this form and show us your ID card . __eou__ Here you are . __eou__
实验环境
- python 3.7.1
- nltk
- 安装过程:
- pip install nltk
- 进入python命令行模式
- 执行以下命令
下载安装所有文件import nltk nltk.download()
- 安装过程:
实验思路
train
- 对训练集进行预处理
- 全部转化为小写
- 去标点
- 分句(使用bi-gram时,句尾句首词不会组成二元组,保证句子间独立性)
*在bi-gram中,将词组成二元组,并且储存以wi为前缀的bi-gram的种类数量(例:词表中只存在go to和go back两种组合,则wgo的值为2)
- 训练
- 以词作为基元,对每个分句进行分词,并统计每个基元在整个数据集中出现的频数
- 加入未登录词,并将频数置为0(注意维护wi为前缀的bi-gram的种类数量)
- 对数据进行平滑并利用频数计算词的频率,以此代替词的概率(此次实验采用加一平滑法)
test
- 计算测试集中每个句子的perplexity
注:因概率值极小,为了减小误差,将先累乘再取对数的运算转化成先取对数再累加 - 对测试集句子的perplexity取平均值
代码实现
from nltk.tokenize import word_tokenize
from nltk import bigrams, FreqDist
from math import log
# 读取数据 小写 替换符号 分句
dataset = open("train_LM.txt", 'r+', encoding='utf-8').read().lower()\
.replace(',',' ').replace('.',' ').replace('?',' ').replace('!',' ')\
.replace(':',' ').replace(';',' ').replace('<',' '