语言模型是现代NLP技术的基础,所有基于统计的NLP算法都是以语言模型作为基础来设计的。什么是语言模型?简单地说,语言模型就是用来计算一个句子的概率的模型,即P(W1,W2,...Wk)。利用语言模型,可以确定哪个词序列的可能性更大,或者给定若干个词,可以预测下一个最可能出现的词语。 训练一个能覆盖很多语料的语言模型有些难度,以下通过一个简单的RNN的demo来说明它的奇妙。
基于RNN的语言模型与传统的语言模型还是有所不同。
一、 传统的语言模型:
- 每个词只和它前面出现的词有关
- 每个词只和它前面出现的个词有关,
- 将词序列的联合概率转化为每个词条件概率的连乘形式。
- 每个词条件概率的计算通过
n-gram
的形式。
二、基于RNN的语言模型
- 利用RNN本身输入是序列的特点,在隐含层神经元之上加了全连接层、Softmax层,得到输出词的概率分布
# 导入包
from keras.models import Sequential
from keras.layers.recurrent import SimpleRNN
from keras.layers.embeddings import Embedding
from keras.preprocessing.sequence import pad_sequences
from keras.utils import to_categorical
# 构造词表
vocab_dict = {"哈士奇": 1, "是": 2, "一": 3, "条": 4, "狗": 5, "萨摩耶": 6,
"头": 7, "辛巴": 8, "狮子": 9, "布偶": 10, "英短": 11, "只": 12, "猫": 13, "UNK": 0}
r_vocab_dict = {v: k for k, v in vocab_dict.items()}
# 语句编码
input_x = [[1, 2, 3, 4],
[6, 2, 3, 4],
[8, 2, 3, 7],
[9, 2, 3, 12],
[11, 2, 3, 12]]
input_y = [[5], [5], [9], [13], [13]]
# 构造训练集
x_train = pad_sequences(input_x, maxlen=10)
y_train = to_categorical(input_y, num_classes=14)
# 建立模型
model = Sequential()
model.add(Embedding(14, 10, input_length=10))
model.add(SimpleRNN(14, return_sequences=False))
model.summary()
# 模型编译
model.compile(loss="mse", optimizer="adam", metrics=["accuracy"])
# 模型训练
model.fit(x_train, y_train, epochs=100, batch_size=1, verbose=0)
# 模型预测
# Question_1
"".join([r_vocab_dict[x] for x in input_x[0]])
# Answer_1
y_pred = model.predict_classes(x_train)
"".join(r_vocab_dict[y_pred[0]])
test:
Q:'哈士奇是一条'
A: '狗'