建立语言模型的目的是为了计算一个句子出现的概率,利用语言模型,可以确定哪个单词序列出现的可能性更大,或者给定若干个单词,预测下一个最可能出现的词语。语言模型的常用评价指标是复杂度,刻画的是通过某一个语言模型估计的一句话出现的概率。例如当已经知道(w1,w2,w3,…,w(m)这句话出现在语料库之中,那么通过语言模型得到这句话的概率越高越好,也就是复杂度越小越好。复杂度perplexity表示的概念是平均分支系数,即模型预测下一个词时的平均可选择数量。计算perplexity值的公式如下:
相比乘积开根号的方式,另一种计算方式使用加法的形式加速计算,也能有效避免概率为0时导致整个计算结果为0的问题:
PTB文本数据集是语言模型学习中目前最广泛使用的数据集,TensorFlow提供了两个函数来帮助实现数据的预处理,将原始数据中的单词转化为单词ID:
ptb_raw_data(DATA_PATH):读取原始数据
ptb_producer(raw_data,batch_size,num_steps):用于将数据组织成大小为 batch_size,长度为 num_steps 的数据组
以下是这两个函数的示例:
#读取数据并转化为单词ID
import tensorflow as tf
from tensorflow.models.tutorials.rnn.ptb import reader
#数据存放路径
DATA_PATH = r"F:\学校事务\论文资料\tensorflow\PTB数据集\simple-examples\data"
#读取原始数据
train_data, valid_data, test_data, _ = reader.ptb_raw_data(DATA_PATH)
print(len(train_data))
print(train_data[:100])
#将训练数据组织成batch大小为4,截断为5的数据组。要放在开启多线程之前.
batch = reader.ptb_producer(train_data, 4, 5)
with tf.Session() as sess:
tf.global_variables_initializer().run()
#开启多线程
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(coord=coord)
# 读取前两个batch,其中包括每个时刻的输入和对应的答案,ptb_producer()会自动迭代
for i in range(2):
x,y = sess.run(batch)
print('X:',x)
print('Y:',y)
# 关闭多线程
coord.request_stop()
coord.join(threads)
输出:
因为ptb_producer() 函数中使用了 tf.train.range_input_producer() 函数,所以需要开启多线程。
以下是完整的TensorFlow样例程序,通过循环神经网络实现语言模型:
import numpy as np
import tensorflow as tf
from tensorflow.mod