语言模型 python实现uni-gram和bi-gram 使用ppl困惑度对比模型效果 山东大学2019 NLP实验1

实验目的

理解并实践语言模型

实验内容

  1. 用python 编程实践语言模型(uni-gram 和bi-gram) ,加入平滑技术。
  2. 计算测试集中句子的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__

实验环境

  1. python 3.7.1
  2. nltk
    • 安装过程:
      1. pip install nltk
      2. 进入python命令行模式
      3. 执行以下命令
        import nltk
        nltk.download()
        
        下载安装所有文件

实验思路

train
  1. 对训练集进行预处理
    • 全部转化为小写
    • 去标点
    • 分句(使用bi-gram时,句尾句首词不会组成二元组,保证句子间独立性)
      *在bi-gram中,将词组成二元组,并且储存以wi为前缀的bi-gram的种类数量(例:词表中只存在go to和go back两种组合,则wgo的值为2)
  2. 训练
    • 以词作为基元,对每个分句进行分词,并统计每个基元在整个数据集中出现的频数
    • 加入未登录词,并将频数置为0(注意维护wi为前缀的bi-gram的种类数量)
    • 对数据进行平滑并利用频数计算词的频率,以此代替词的概率(此次实验采用加一平滑法
test
  1. 计算测试集中每个句子的perplexity
    注:因概率值极小,为了减小误差,将先累乘再取对数的运算转化成先取对数再累加
  2. 对测试集句子的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('<',' '
  • 9
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值