引领先锋|基于深度学习的文本数据特征提取方法之Word2Vec(一)( 三 )

下面的输出显示了语料库中的总行数以及预处理如何处理文本内容 。
Output ------ Total lines: 30103Sample line: ['1', ':', '6', 'And', 'God', 'said', ',', 'Let', 'there', 'be', 'a', 'firmament', 'in', 'the', 'midst', 'of', 'the', 'waters', ',', 'and', 'let', 'it', 'divide', 'the', 'waters', 'from', 'the', 'waters', '.']Processed line: god said let firmament midst waters let divide waters waters现在让我们来看看一些流行的词嵌入模型和对我们的语料库做的特征工程!
Word2Vec模型
该模型由谷歌于2013年创建 , 是一种基于预测的深度学习模型 , 用于计算和生成高质量的、连续的dense的单词向量表示 , 并捕捉上下文和语义相似性 。 本质上 , 这些是无监督的模型 , 可以接收大量的文本语料库 , 创建可能的单词的词汇表 , 并为表示该词汇表的向量空间中的每个单词生成dense的单词嵌入 。 通常可以指定单词的嵌入向量的大小 , 向量的总数本质上就是词汇表的大小 。 这使得该向量空间的维度大大低于传统的词袋模型构建出的高维稀疏的向量空间 。
Word2Vec可以利用两种不同的模型结构来创建这些单词嵌入表示 。

  • Continuous Bag of Words(CBOW)模型
  • Skip-gram模型
Continuous Bag of Words (CBOW) 模型
CBOW模型体系结构试图基于上下文单词(周围单词)预测当前目标单词(中心单词) 。 考虑一个简单的句子 , “the quick brown fox jumps over the lazy dog” , 这可以是(context_window, target_word)对 , 如果我们考虑一个大小为2的上下文窗口 , 我们有([quick, fox] ,brown)、([the, brown] ,quick)、(([the, dog] ,lazy))等例子 。 因此 , 该模型试图基于context_window单词预测target_word 。
引领先锋|基于深度学习的文本数据特征提取方法之Word2Vec(一)虽然Word2Vec系列模型是无监督的 , 这意味着可以给它一个没有附加标签或信息的语料库 , 它可以从语料库构建密集的单词嵌入 。 但是 , 一旦你拥有了这个语料库 , 你仍然需要利用一个监督的分类方法来实现这些嵌入 。 但是我们将在没有任何辅助信息的情况下 , 从语料库本身来做 。 我们现在可以将CBOW结构建模为一个深度学习分类模型 , 这样我们就可以将上下文单词作为输入X , 并尝试预测目标单词Y 。 实际上 , 构建这个结构比skip-gram模型更简单 , 在skip-gram模型中 , 我们试图从源目标单词预测一大堆上下文单词 。
实现Continuous Bag of Words (CBOW)模型
虽然使用像gensim这样具有Word2Vec模型的框架非常好用 , 但是现在让我们从头开始实现它 , 以了解幕后的工作原理 。 我们将利用norm_bible变量中包含的Bible语料库来训练模型 。 实现将集中于四个部分:
  • 构建语料库词汇表
  • 建立一个CBOW(上下文 , 目标)生成器
  • 构建CBOW模型架构
  • 训练模型
  • 获取Word Embeddings
构建语料库词汇表
首先 , 我们将构建语料库词汇表 , 从词汇表中提取每个惟一的单词 , 并将一个惟一的数字标识符映射到它 。
from keras.preprocessing import text from keras.utils import np_utils from keras.preprocessing import sequencetokenizer = text.Tokenizer() tokenizer.fit_on_texts(norm_bible) word2id = tokenizer.word_index# build vocabulary of unique words word2id['PAD'] = 0 id2word = {v:k for k, v in word2id.items()} wids = [[word2id[w] for w in text.text_to_word_sequence(doc)] for doc in norm_bible]vocab_size = len(word2id) embed_size = 100 window_size = 2 # context window sizeprint('Vocabulary Size:', vocab_size) print('Vocabulary Sample:', list(word2id.items())[:10])


推荐阅读