Word2vec

发布时间 2023-10-08 08:54:49作者: emanlee

https://blog.csdn.net/weixin_43301333/article/details/104861975

 

GOOD

https://blog.csdn.net/v_JULY_v/article/details/102708459

https://blog.csdn.net/weixin_43301333/article/details/104861975

 

Word2vec模型可用来映射每个词到一个向量。

Google 公司在 2013年开放了 Word2vec这一款用于训练词向量的软件工具。Word2vec 可以根据给定的语料库,通过优化后的训练模型快速有效地将一个词语表达成向量形式,为自然语言处理领域的应用研究提供了新的工具。Word2vec依赖 skip-grams连续词袋(CBOW)来建立神经词嵌入。Word2vec为托马斯·米科洛夫(Tomas Mikolov)在Google带领的研究团队创造。

 

Word2vec确实没那么简单,涉及的知识点包括神经网络、语言模型、n-gram、One-Hot、NNLM、到CBOW、Skip-gram、哈夫曼编码、反向传播、Hierarchical SoftMax、负采样等等,各种概念,

 

Word2vec基本出发点是上下文相似的两个词,它们的词向量也应该相似,比如香蕉和梨在句子中可能经常出现在相同的上下文中,因此这两个词的表示向量应该就比较相似。

我们来看个例子,如何用 Word2vec 寻找相似词:

    对于一句话:她们 夸 吴彦祖 帅 到 没朋友,如果输入 x 是吴彦祖,那么 y 可以是:“她们、夸、帅、没朋友”这些词
    现有另一句话:她们 夸 我 帅 到 没朋友,如果输入 x 是:我,那么不难发现,这里的上下文 y 跟上面一句话一样
    从而 f(吴彦祖) = f(我) = y,所以大数据告诉我们:我 = 吴彦祖(完美的结论)

所以说,word2vec模型中比较重要的概念是词汇的上下文,说白了就是一个词周围的词,比如wt的范围为1的上下文就是wt−1和wt+1。
https://blog.csdn.net/v_JULY_v/article/details/102708459

 

 

 

词袋模型
CBOW(Continuous Bag-of-Word):以上下文词汇预测当前词,即用w_{t-2}w_{t-1}w_{t+1}w_{t+2}去预测 w_{t}
 
词袋模型(Bag-of-words model)是在自然语言处理和信息检索(IR)下被简化的表达模型。此模型下,像是句子或是文件这样的文字可以用一个袋子装着这些词的方式表现,这种表现方式不考虑文法以及词的顺序。最近词袋模型也被应用在计算机视觉领域。词袋模型被广泛应用在文件分类,词出现的频率可以用来当作训练分类器的特征。关于"词袋"这个用字的由来可追溯到泽里格·哈里斯于1954年在Distributional Structure的文章。
 
 
 
Skip-gram 模型
SkipGram:以当前词预测其上下文词汇,即用w_{t}去预测w_{t-2}w_{t-1}w_{t+1}w_{t+2}
 
Skip-gram 模型是一个简单但却非常实用的模型。在自然语言处理中,语料的选取是一个相当重要的问题: 第一,语料必须充分。一方面词典的词量要足够大,另一方面要尽可能多地包含反映词语之间关系的句子,例如,只有“鱼在水中游”这种句式在语料中尽可能地多,模型才能够学习到该句中的语义和语法关系,这和人类学习自然语言一个道理,重复的次数多了,也就会模仿了; 第二,语料必须准确。 也就是说所选取的语料能够正确反映该语言的语义和语法关系,这一点似乎不难做到,例如中文里,《人民日报》的语料比较准确。 但是,更多的时候,并不是语料的选取引发了对准确性问题的担忧,而是处理的方法。 n元模型中,因为窗口大小的限制,导致超出窗口范围的词语与当前词之间的关系不能被正确地反映到模型之中,如果单纯扩大窗口大小又会增加训练的复杂度。Skip-gram 模型的提出很好地解决了这些问题。顾名思义,Skip-gram 就是“跳过某些符号”,例如,句子“中国足球踢得真是太烂了”有4个3元词组,分别是“中国足球踢得”、“足球踢得真是”、“踢得真是太烂”、“真是太烂了”,可是我们发现,这个句子的本意就是“中国足球太烂”可是上述 4个3元词组并不能反映出这个信息。Skip-gram 模型却允许某些词被跳过,因此可以组成“中国足球太烂”这个3元词组。 如果允许跳过2个词,即 2-Skip-gram [2]  。

 

 

传统词嵌入的问题

 


不管是基于local训练的Word2vec,还是基于全局的Glove,传统词嵌入存在的一个很大的问题:一旦预训练词向量,就只能将其按照训练结果嵌入模型中,这样会导致词向量无法根据具体语境作动态的调整。比如说下面这个句子:

There is a traffic 'jam',so I began to eat my apple 'jam'.

第一个jam是堵塞,第二个jam是果酱。明显,两个单词的含义完全不同。如果仅仅只是将jam用同一个词向量表示,无疑给下游任务造成了巨大的噪声。因此传统词嵌入只能依据具体语境去训练Embedding(或者在有更多语料的相似语境训练),无法像CV一样做迁移学习(VGGNet)。
————————————————
链接:https://blog.csdn.net/weixin_43301333/article/details/104861975