使用Keras加载词向量

本文接在上一篇使用将序列数据预处理成向量以后,接着我们会将取出的word_index,它里面所存储的是:词:索引
比如:

1
the: 101

我们现在要干的事情就是将词转化成已经训练好的词向量了,比如GLOVE、Word2Vec等等,本文以Glove为例,讲解如何加载预训练好的词向量。

加载词向量

首先第一步,我们能从网上下载到glove的词向量文件,100d表示它的维度是100维的。我们先将这个文件读入进来。(下载地址为: https://nlp.stanford.edu/projects/glove)
代码为:

1
2
3
4
5
6
7
8
9
10
11
12
glove_dir = '/Users/fchollet/Downloads/glove.6B'
 
embeddings_index = {}
f = open(os.path.join(glove_dir, 'glove.6B.100d.txt'))
for line in f:
values = line.split()
word = values[0]
coefs = np.asarray(values[1:], dtype='float32')
embeddings_index[word] = coefs
f.close()
 
print('Found %s word vectors.' % len(embeddings_index))

可以看到,代码很简单,就是读取一个文件,然后这个文件是以空格分割的,第一个放的是单词,后面所有的是维度。
到这里我们获得了一个embeddings_index的字典,keywordvalue是词向量。

挑选需要的词向量

然后我们要干的事当然就是将我们序列中出现的单词的词向量挑出来了!

所以,进行一个很简单的循环获取我们的词向量。

1
2
3
4
5
6
7
8
embedding_dim = 100
 
embedding_matrix = np.zeros((max_words, embedding_dim))
for word, i in word_index.items():
if i < max_words:
embedding_vector = embeddings_index.get(word)
if embedding_vector is not None:
embedding_matrix[i] = embedding_vector

这里还需要注意的是,嵌入索引(embeddings_index)中找不到的词,其嵌入向量全为0。

到这里我们获得我们自己的embedding_matrix

将词向量塞入网络中

很明显,网络应该被塞入第一层Embedding层,对于Sequential的写法,我们可以按照下面这样来写:

1
2
3
4
5
6
7
8
9
from keras.models import Sequential
from keras.layers import Embedding, Flatten, Dense
 
model = Sequential()
model.add(Embedding(max_words, embedding_dim, input_length=maxlen))
model.add(Flatten())
model.add(Dense(32, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.summary()

定义好模型之后,将权重塞入第一层中。

1
2
model.layers[0].set_weights([embedding_matrix])
model.layers[0].trainable = False