中文预训练资料下载
按照词向量不同的维度,可大可小,会有多个版本的预训练词向量,可以根据自己需求进行选择:
预训练词向量文件,一般比较大很难打开,大部分文件的格式由3个部分组成,以glove举例:
- 第一行有2个数字,左边的表示字典有多少个词,右边的表示词向量的维度
- 每行的第一个元素是词本身
- 每行的其它元素是词向量
预训练词向量的使用步骤
- 将所有语料转化为词索引序列(word_index)。所谓词索引就是为每一个词一次分配一个整数ID。
- 生成一个词向量矩阵(embedding_matrix)。第 i 列表示词索引为 i 的词的词向量。
- 将词向量矩阵载入Keras Embedding层,设置该层的权重不可再训练(也就是说在之后的网络训练过程中,词向量不再改变)。
数据预处理
我们可以将语料样本转化为神经网络训练所用的tensor。所用到的Keras库是keras.preprocessing.text.Tokenizer和keras.preprocessing.sequence.pad_sequences。代码如下
1 | from keras.preprocessing.text import Tokenizer |
Embedding layer 设置
接下来,我们从词向量预训练文件中解析出每个词和它所对应的词向量,并用字典(embedding_index)的方式存储。下面主要生成embedding_index:
1 | embeddings_index = {} |
此时,我们可以根据得到的embedding_index生成上文所定义的词向量矩阵embedding_matrix:
1 | # embedding_matrix的维度 =(语料单词的数量,预训练词向量的维度) |
现在我们将这个词向量举证加载到Embedding 层中,注意,我们设置trainable=False使得这个编码层不可再训练。
1 | from keras.layers import Embedding |
一个Embedding层的输入应该是一系列的整数序列,比如一个2D的输入,它的shape值为(samples,indices),也就是一个samples行,indices列的矩阵。
下面的是以函数形式写入dictionary模块的demo,跟上面的差不多,仅作参考:
1 | from gensim.models import KeyedVectors |
写在最后
之前在做QA任务的优化时,尝试使用预训练的词向量,那时候还没直接用Bert。先说结果:效果提升不大,甚至说没啥提升。
主要原因:某垂直领域的词向量,太接近了,起不到分开词意的作用。词向量可能在非常泛的语义区分中有作用,比如在聊天的时候,谈的天南地北,能分清钢琴和大米是两回事,但是可能分不清钢琴和吉他,甚至两个向量表达十分地接近。
后面接触Bert之后,就没有深入再做词向量预训练的工作了,只能说Bert使人懒惰😂,接下来会写几篇Bert实战相关文章,敬请期待~