Genism word2vec 研读

neaural networks in https://code.google.com/p/word2vec/

初始化中的参数作用
def __init__(
self, sentences=None, size=100, alpha=0.025, window=5, min_count=5,
max_vocab_size=None, sample=1e-3, seed=1, workers=3, min_alpha=0.0001,
sg=0, hs=0, negative=5, cbow_mean=1, hashfxn=hash, iter=5, null_word=0,
trim_rule=None, sorted_vocab=1, batch_words=MAX_WORDS_IN_BATCH):

sentances 句子
sg sg = 0, 用 CBOW, 否则, 用 skip-gram
size 特征向量的维度 (通常为4的倍数)
window 这个应该就是 n - gram 的n
alpha 最初的学习率,有随着训练的持续而下降
seed 生成随机数, 为每个词创造初始向量
min_count 比这个频次小的词就不要了
max_vacab_size 限制内存和单词个数,优先裁剪频次最小的单词, 10,000,000 个单词大致需要1GB, 不限制的话设为None
sample 多高频单词进行向下采样(需研究)
workers 多核机器上加速
hs hs = 1, 用 hierarchical softmax, hs = 0 and ‘negative‘ 不为0, 用negative sampling(需研究)
negative > 0, 用nagetive sampling, 分值为采用多少噪音单词
cbow_mean 使用 cbow 的时候, 若为0, 用上下文向量 累加, 若为1, 用上下文向量 平均
iter 多少轮, 默认为5
trim_rule 确认保留词,特别是当频次 < min_count 的时候采用
sorted_vocab = 1, 按频次排列
batch_words 一次传多少给workers

一些参数
self.layer1_size = size

流程
1 build_vocab
def build_vocab(self, sentences, keep_raw_vocab=False, trim_rule=None, progress_per=10000, update=False):

1.1 scan vocab
self.scan_vocab(sentences, progress_per=progress_per, trim_rule=trim_rule) # initial survey
对句子中存在的单词进行扫描
vocab 频次词典
vocab[word] += 1
如果vocab 长度 大于 max_vocab_size, 进行剪枝, 去掉除了 trim_rule 的频次最小词
self.corpus_count = sentence_no + 1, 这个意思是 句子编号, 即有多少个句子
self.raw_vocab = vocab

1.2 scale_vocab
self.scale_vocab(keep_raw_vocab=keep_raw_vocab, trim_rule=trim_rule, update=update)
剪枝(对低频次单词而言)和向下采样(对高频次单词而言)
def scale_vocab(self, min_count=None, sample=None, dry_run=False, keep_raw_vocab=False, trim_rule=None, update=False):
min_count => 作用于低频次单词
sample => 作用于高频次单词
keep_raw_vocab : True, 在构建完scale之后删除 dict 以释放空间

1.2.1 首次构建

遍历 raw_vocab
满足大于最小频次条件
保留数据 retain_words.append && retain_total += v
否则
drop_unique += 1
drop_total += v

original_unique_total <= 原来的词典长度(有频次, 非去重)
retain_unique_pct <= 保留词的频次占比
original_total <= 有多少种词
retain_pct <= 保留多少种词的占比
* 种为category

1.2.2 更新
如果 word 在 self.wv.vocab, 更新 pre_exist_words 和 pre_exists_total
如果 不在, 更新 new_words, new_total
再依次更新 original_unique_total, pre_exist_unique_pct, new_unique_pct, retain_words, retain_total

1.2.3 向下采样
sample
1. 没有
threshold_count = ratain_total
2. < 1. 是proportion
3. > 1 表示对sample多的words 都向下采样

遍历每一个在retain的词w和频次V
用V THRESHOLD_COUNT 计算 word_probability
如果 word_probability < 1.0
downsample_unique += 1
downsample_total += word_probability * v
else
word_probability = 1.0
downsample_total += v

1.3 finalize_vocab 构建
sort_vocab -> index2word 按频次排序

1.3.1 create_binary_tree
建立哈夫曼树
通过 vocab 建立堆 heap
heapify 进行堆排序 heapq
遍历 vocab
min1, min2 为堆顶heapq的两个元素, 通过 heappop弹出
再把融合过的元素 返回队 heappush
通过堆建立 node

1.3.2 make_cum_table
如果有 negative , 建立累积table
cum_table = zeros(vocab_size,)
遍历 vocab
train_words_pow += 对应词频 的 power 次方
遍历 vocab
cum += 对应词频 的 power 次方
cum_table[index] = cum / train_words_pow * domain

2 训练
def train(self, sentences, total_words=None, word_count=0,
total_examples=None, queue_factor=2, report_delay=1.0):
如果有negative, neg_labels = zeros(self.negative + 1)

对worker中的多线程进行分配
在每个线程中, 调用 worker_loop
2.1 worker_loop
work = REAL * size
neu1 = REAL * size
如果还有 job
sentances, alpha = job
tally, raw_tally = self._do_train_job(sentences, alpha, (work, neu1))

2.2 _do_train_job
训练一个单独的batch

2.2.1
训练 CBOW
train_batch_cbow

def train_batch_cbow(model, sentences, alpha, work=None, neu1=None):
获取 一个句子 的 log like-hood

遍历 sentance
遍历 在sentance中的word
其中 word_vocabs 包含 index pos 和 词语 word
------ sample int?
会生成一个reduce_window, 随机减少 window( n_gram ) 的宽度
start = index - n_gram + reduce_window
end = index + n_gram + 1 - reduce_window
window_pos 为 word_vocab 扫描窗口 n_gram 的数据
word2 为 window_pos 的word
word2_indeces = word2.index ... window_pos的下标
l1 是 通过 sv.syn0 进行 context 累加
如果 采用 cbow_mean l1 /= len(word2_indices)

log_prob_sentence += score_cbow_pair(model, word, word2_indices, l1)

时间: 2024-08-07 00:18:33

Genism word2vec 研读的相关文章

情感分析的现代方法(包含word2vec Doc2Vec)

英文原文地址:https://districtdatalabs.silvrback.com/modern-methods-for-sentiment-analysis 转载文章地址:http://datartisan.com/article/detail/48.html 情感分析是一种常见的自然语言处理(NLP)方法的应用,特别是在以提取文本的情感内容为目标的分类方法中.通过这种方式,情感分析可以被视为利用一些情感得分指标来量化定性数据的方法.尽管情绪在很大程度上是主观的,但是情感量化分析已经有

Automatic Generation of Animated GIFs from Video论文研读及实现

论文地址:Video2GIF: Automatic Generation of Animated GIFs from Video 视频的结构化分析是视频理解相关工作的关键.虽然本文是生成gif图,但是其中对场景RankNet思想值得研究. 文中的视频特征表示也是一个视频处理值得学习的点.以前做的视频都是基于单frame,没有考虑到时空域,文中的参考文献也值得研读一下. 以下是对本文的研读,英语水平有限,有些点不知道用汉语怎么解释,直接用的英语应该更容易理解一些. Abstract 从源视频当中提

Windows下使用Word2vec继续词向量训练

word2vec是Google在2013年提出的一款开源工具,其是一个Deep Learning(深度学习)模型(实际上该模型层次较浅,严格上还不能算是深层模型,如果word2vec上层再套一层与具体应用相关的输出层,如Softmax,便更像是一个深层模型),它将词表征成实数值向量,采用CBOW(Continuous Bag-Of-Words Model,连续词袋模型)和Skip-Gram(Continuous Skip-GramModel)两种模型.具体原理,网上有很多. 本文是在window

wiki中文语料+word2vec (python3.5 windows win7)

环境: win7+python3.5 1. 下载wiki中文分词语料   使用迅雷下载会快不少,大小为1个多G      https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2 2. 安装opencc用于中文的简繁替换 安装exe的版本 到https://bintray.com/package/files/byvoid/opencc/OpenCC 中下载 opencc-1.0.1-win64.7

重磅︱文本挖掘深度学习之word2vec的R语言实现

笔者寄语:2013年末,Google发布的 word2vec工具引起了一帮人的热捧,大家几乎都认为它是深度学习在自然语言领域的一项了不起的应用,各种欢呼"深度学习在自然语言领域开始发力 了". 基于word2vec现在还出现了doc2vec,word2vec相比传统,考虑单词上下文的语义:但是doc2vec不仅考虑了单词上下文的语义,还考虑了单词在段落中的顺序. 如果想要了解word2vec的实现原理,应该读一读官网后面的三篇参考文献.显然,最主要的应该是这篇: Distributed

word2vec skip-gram系列2

CBOW和Skip-gram模型 word2vec有两个模型,分别是CBOW和Skip-gram模型.这两个模型又都可以有两种优化方法.分别是 Hierarchical Softmax与Negative Sampling .所以实现word2vec有四种方式: 2013年末,Google发布的word2vec引起了一帮人的热捧.在大量赞叹word2vec的微博或者短文中,几乎都认为它是深度学习在自然语言领域的一项了不起的应用,各种欢呼"深度学习在自然语言领域开始发力了".但实际上,简单

word2vec 中的数学原理详解(一)目录和前言

  word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包,它简单.高效,因此引起了很多人的关注.由于 word2vec 的作者 Tomas Mikolov 在两篇相关的论文 [3,4] 中并没有谈及太多算法细节,因而在一定程度上增加了这个工具包的神秘感.一些按捺不住的人于是选择了通过解剖源代码的方式来一窥究竟,出于好奇,我也成为了他们中的一员.读完代码后,觉得收获颇多,整理成文,给有需要的朋友参考. 相关链接 (一)目录和前言 (二)预备知

word2vec 中的数学原理详解(二)预备知识

  word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包,它简单.高效,因此引起了很多人的关注.由于 word2vec 的作者 Tomas Mikolov 在两篇相关的论文 [3,4] 中并没有谈及太多算法细节,因而在一定程度上增加了这个工具包的神秘感.一些按捺不住的人于是选择了通过解剖源代码的方式来一窥究竟,出于好奇,我也成为了他们中的一员.读完代码后,觉得收获颇多,整理成文,给有需要的朋友参考. 相关链接 (一)目录和前言 (二)预备知

word2vec 中的数学原理详解(三)背景知识

  word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包,它简单.高效,因此引起了很多人的关注.由于 word2vec 的作者 Tomas Mikolov 在两篇相关的论文 [3,4] 中并没有谈及太多算法细节,因而在一定程度上增加了这个工具包的神秘感.一些按捺不住的人于是选择了通过解剖源代码的方式来一窥究竟,出于好奇,我也成为了他们中的一员.读完代码后,觉得收获颇多,整理成文,给有需要的朋友参考. 相关链接 (一)目录和前言 (二)预备知