词向量模型之CBOW

CBOW 是通过中心词来预测上下文,然后用这个预测过程中的参数权重来形成一个词向量,具体的操作如下:

  1. 首先需要找一个语料库,比如百科,微博等等。

  2. 然后对这个语料进行分词处理。一般用jieba, 比较快。或者paddla lac(做过分词和词性标注)

  3. 然后对分出来的词做个词频统计,将词频出现较高的词排在前面

  4. 将排序好的词形成一个大的dict (词表字典),便于词表搜索查询

  5. 开始生成模型能够读取的数据格式。首先要有一个可滑动窗口,窗口的目的是获取到当前词的上下文(一般窗口大小不超过3,也就是前三个词,后三个词)

  6. 如果是直接计算 中心词推测出来的临近词 的label的话,计算量太大。(例如这个词典表中有10000个词,每个滑动窗口为3,也就是6个词,那么一个核心词就要6*10000个类别),因此采用负采样的方式将问题从多分类转化为2分类任务。

  7. 负采样的操作如下:随机从所有词典表中选择n个词(非滑动窗口中的词),然后将上文中滑动窗口中的词的label 标记为 1, 随机选择的标记为 0 。然后将所有的词通过词典表,转化为数字形式。例如:“我 爱 中国”=> [29, 452, 2510], 最后生成数据集,格式为[(head_word_ids, target_word_ids, label), ......., (head_word_ids, traget_word_ids, label)]

  8. 生成一个初始化的 embedding 表,整个表的shape 是[vocab_size, emb_size], vocab_size: 之前生成的词典表的len, emb_size:想要生成的向量维度(一般是128, 256, 512, 768等)

  9. 遍历所有的数据集,将 head_word_ids和target_word_ids, 转化为向量的形式。因为生成的初始化embedding 表的大小就是 vocab_size 的大小,因此head_word_ids 转化为向量就相当于获取embedding [head_word_ids] 的值。

  10. 开始计算:embedding [head_word_ids] 和 embedding [target_word_ids]通过点乘的方式计算中心词到目标词的输出概率,然后将当前向量维度从emb_size, 相加成1,并通过simgod函数估计这个词是正样本还是负样本。

  11. 最后定义梯度下降函数降低损失,等损失稳定后,将模型的权重保存,这个权重就是生成的词向量。

    

你可能感兴趣的:(NLP自然语言处理,自然语言处理,算法,人工智能)