word2vec简单总结
Posted aelum
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了word2vec简单总结相关的知识,希望对你有一定的参考价值。
目录
一、Skip-Gram
Skip-Gram 模型假设中心词可以用来生成上下文词。
词表中的每个词都由两个 d d d 维向量来表示,具体来说,对于索引为 i i i 的词,我们分别用 v i , u i \\boldsymbolv_i,\\boldsymbolu_i vi,ui 表示其用作中心词和上下文词的两个向量。
设词 w o w_o wo 位于中心词 w c w_c wc 的上下文窗口内,则
P ( w o ∣ w c ) = exp ( u o ′ v c ) ∑ i ∈ V exp ( u i ′ v c ) P(w_o|w_c)=\\frac\\exp(\\boldsymbolu_o'\\boldsymbolv_c)\\sum_i\\in \\mathcalV\\exp(\\boldsymbolu_i'\\boldsymbolv_c) P(wo∣wc)=∑i∈Vexp(ui′vc)exp(uo′vc)
其中 V = 0 , 1 , ⋯ , ∣ V ∣ − 1 \\mathcalV=\\0,1,\\cdots,|\\mathcalV|-1\\ V=0,1,⋯,∣V∣−1 是词表的索引集。
设上下文窗口大小为 m m m,则 Skip-Gram 模型的似然函数为
L = ∏ t = 1 T ∏ − m ≤ j ≤ m , j ≠ 0 P ( w t + j ∣ w t ) \\mathcalL=\\prod_t=1^T \\prod_-m\\leq j\\leq m,j\\neq 0P(w_t+j|w_t) L=t=1∏T−m≤j≤m,j=0∏P(wt+j∣wt)
最大化 L \\mathcalL L 等价于最小化 − log L -\\log\\mathcalL −logL,即
− ∑ t = 1 T ∑ − m ≤ j ≤ m , j ≠ 0 log P ( w t + j ∣ w t ) -\\sum_t=1^T\\sum_-m\\leq j\\leq m,j\\neq 0\\log P(w_t+j|w_t) −t=1∑T−m≤j≤m,j=0∑logP(wt+j∣wt)
二、CBOW
与 Skip-Gram 相反,CBOW 模型假设上下文词可以用来生成中心词。
设上下文窗口大小为 m m m,则上下文词的数量为 2 m 2m 2m。在计算条件概率时我们通常会对这些上下文词取平均,即
v o ‾ = 1 2 m ∑ 1 ≤ ∣ i ∣ ≤ m v c + i \\overline\\boldsymbolv_o=\\frac12m\\sum_1\\leq|i|\\leq m\\boldsymbolv_c+i vo=2m11≤∣i∣≤m∑vc+i
记 W o ( c ) = v c − m , ⋯ , v c − 1 , v c + 1 , ⋯ , v c + m \\mathcalW_o(c)=\\\\boldsymbolv_c-m,\\cdots,\\boldsymbolv_c-1,\\boldsymbolv_c+1,\\cdots,\\boldsymbolv_c+m\\ Wo(c)=vc−m,⋯,vc−1,vc+1,⋯,vc+m,则
P ( w c ∣ W o ( c ) ) = exp ( u c ′ v o ‾ ) ∑ i ∈ V exp ( u i ′ v o ‾ ) P(w_c|\\mathcalW_o(c))=\\frac\\exp(\\boldsymbolu_c'\\overline\\boldsymbolv_o)\\sum_i\\in\\mathcalV\\exp(\\boldsymbolu_i'\\overline\\boldsymbolv_o) P(wc∣Wo(c))=∑i∈Vexp(ui′vo)exp(uc′vo)
CBOW 模型的似然函数为
L = ∏ t = 1 T P ( w c ∣ W o ( c ) ) \\mathcalL=\\prod_t=1^T P(w_c|\\mathcalW_o(c)) L=t=1∏TP(wc∣Wo(c))
三、Gensim实现
先导入接下来所需要用到的包:
from gensim.models import Word2Vec, KeyedVectors
from gensim.test.utils import common_texts
import gensim.downloader as api
我们可以使用 gensim
自带的 Word2Vec
来实现相关计算:
sentences = [['first', 'sentence'], ['second', 'sentence']]
# 词向量维度是5
# 出现次数低于1的单词会被丢弃
# 使用4个线程训练
model = Word2Vec(sentences=sentences, vector_size=5, min_count=1, workers=4)
word_vectors = model.wv
# 训练结束后可查看词向量
print(word_vectors['sentence'])
# [-0.01072454 0.00472863 0.10206699 0.18018547 -0.186059 ]
训练完成后,可以保存模型以便下次使用
model.save('word2vec.model') # 保存模型
model = Word2Vec.load('word2vec.model') # 读取模型
当然也可以保存训练好的词向量
word_vectors.save("word2vec.wordvectors") # 保存词向量
word_vectors = KeyedVectors.load("word2vec.wordvectors", mmap='r') # 读取词向量,r代表只读
我们还可以查看与某个单词最相似的几个单词
model = Word2Vec(sentences=common_texts, vector_size=5, min_count=1)
sims = model.wv.most_similar('computer', topn=3)
print(sims)
# [('minors', 0.4151746332645416), ('time', 0.18495501577854156), ('interface', 0.05030104145407677)]
使用现成的预训练模型:
word_vectors = api.load('glove-twitter-25')
print(word_vectors.most_similar('twitter', topn=10))
# [('facebook', 0.948005199432373), ('tweet', 0.9403423070907593), ('fb', 0.9342358708381653), ('instagram', 0.9104824066162109), ('chat', 0.8964965343475342), ('hashtag', 0.8885937333106995), ('tweets', 0.8878158330917358), ('tl', 0.8778461217880249), ('link', 0.877821147441864), ('internet', 0.8753896355628967)]
以上是关于word2vec简单总结的主要内容,如果未能解决你的问题,请参考以下文章