Gensim训练词向量与Embedding相关知识

在进行文本分类的时候,预处理我们可以自己做一个词向量模型,也可以采用预训练的模型。采用预训练的模型比如谷歌基于goole news训练的Word2vec模型,由于在大量文本数据中训练过,所以词的概率分布会比较准确,当自己的数据集比较小的时候,用预训练数据有利于提升模型的准确度。

以下内容使用了tensorflow。

训练文本生成word2vec模型

自己训练模型一般有以下几步:

  1. 处理数据集,首先gensim的Word2Vec()方法需要的输入是句子顺序的单词,比如 我 爱 你 而不是我爱你,所以要将文本数据分词处理,在这个过程中,我们可以去除停用词,英文全部小写,语法统一等处理,可能对词向量的训练比较有帮助。
  2. 完成文本的处理以后,我们得到一个分词后的文本数据集,比如一个列表[‘she’, ‘is’, ‘beautiful’],在gensim模块中可以简单的使用model=gensim.models.word2vec.Word2Vec()得到训练的模型。
    该方法有一些参数:
        sentences-即数据集;sg-设置训练算法,0代表CBOW,1代表skip-gram算法;
        size-指特征向量的维度,默认为100,大的size需要更多数据,效果更好,但是过大则浪费资源,效果提升不明显;
        window-当前词与预测词在一个句子中的最大距离,默认是5,比如 我 今天 成功 完成 工作,对于 成功,如果设置窗口为2,可能去预测的词就是我 今天 完成 和 工作,注意是最大值而不是一定选取四个词。最后模型输出的是一个概率分布,即一个词出现在其他词边的概率是多少,我们也就可以据此去发现相似的词。
        min_count-去除词频小于min_count的词;
        hs-1采用hierarchy softmax,0采用negative sample;
        iter-迭代次数
        workers-参数控制训练的并行数¨C9C    更多参考:https://www.cnblogs.com/kjkj/p/9825418.html

其他训练词向量有相似的方法和思路,网上有很多资料。

使用预训练词向量

首先加载获取到准备好的模型,然后我们的目标是得到一个embedding_metrics即词向量矩阵,词向量矩阵的shape为(vocab_size, embedding_dim),它是我们要用于训练的数据的每个词(更具体的说是词表中的词)在训练好的模型中的词向量组成的矩阵。

接下来处理训练数据,即用tokenizer处理训练后的数据得到词表,然后将每条文本数据转变为用词表索引数字代替各单词表示的列表,这里给词编码的顺序是词频由高到低,再进行padding使句子输入变为定长,最后我们利用word_index和模型生成embedding_metrics,数据的准备就基本完成了。这些步骤使用tensorflow提供的api可以很简单的实现。

生成代码及相关解释如下:

embedding_matrix = np.zeros((len(word_index) + 1, word2vec.vector_size))

#  len(word_index) + 1,加1是因为word_index的标记是从1开始而非0,这样词索引与词向量刚好对应,并且对于padding后为
#  0的填充位置可以有对应的映射。

for word, index in word_index.items():
    try:
        embedding_vector = word2vec.wv.getitem(str(word))
        embedding_matrix[int(index)] = embedding_vector
    except KeyError:
        print("vector not found for word - %s" % word)

Embedding层做了什么?

Embedding层就是以one hot为输入、中间层节点为词向量维数的全连接层!而这个全连接层的参数,就是一个“词向量表”即我们的embedding_metrics,也就是说,其实onehot的作用就是查表,选择onehot表示的词对应的词向量,然后输出到下一层去。如果我们不用预处理的词向量,就是放一个空矩阵在embedding层(或者说是随机初始化参数),然后在训练网络过程中更新参数。

Embedding(len(vocab) + 1, embedding_dim, input_length=50, weights=[embedding_matrix], trainable=False)
# (len(vocab) + 1, embedding_dim)与embedding_matrix的shape是一致的。

参考:

苏剑林. (2016, Dec 03). 《词向量与Embedding究竟是怎么回事?》

https://blog.csdn.net/asialee_bird/article/details/88813385

https://www.cnblogs.com/kjkj/p/9825418.html

https://blog.csdn.net/zgj_gutou/article/details/89683727

https://blog.csdn.net/qq_17249717/article/details/101752670

Leave a Reply