【资料分析师自学笔记|概念+实作篇:自然语言处理入门 之 Word2Vec, Doc2Vec 比较】
本篇笔记 Python自然语言处理入门的常用方法 Word2Vec,及其延伸:Doc2Vec。尽可能表述他们之间的关联,并以Python实作比较不同方法分辨同样两个语句的效果。
Word2Vec是什幺?
顾名思义 Word to vector,通过神经网路训练, 将字词表示成空间中的向量,让我们可以用向量间的距离,来代表文本语意上的相似程度
。这种把字词向量化的概念即称为 “embedding”,目的是让机器理解人类用的词语,把符号数学化。
那怎幺做到”让语意相近的字词向量越靠近”?
Word2Vec主要由两种神经网络演算法构成:
1. CBOW (
Continuous Bag of Words) :根据上下文关係,预测当前词语出现的机率
。
利用所有input data(语料库)中,每个(经过断词后)的上下文词语组合,预测目标字词本身出现的机率有多少。图中的w是每个词的权重矩阵(训练完成后会就是该词的词向量),CBOW模型的目的是让当前字词(要被预测的对象)的出现机率越高越好。
譬如:[‘感冒’, ‘要’, ‘多’, ‘休息’], [‘生病’, ‘要’, ‘多’, ‘休息’]
假设语料库输入大多是跟生病休养相关的语句,此时模型就可以判断上下文关係,学习到 ‘感冒’ 和 ‘生病’ 的语意是相近的,最后算出的cos(余弦值)也会越大(空间中两向量越靠近)。
2. Skip-gram
:CBOW的相反, 根据当前词语预测上下文词语的机率
。
那Doc2Vec是…
模型能够判断单词间的语意相近程度了,那进一步我们想要知道,词语组合成的「段落」间的相近程度是如何。
我们有一个选择,可以将Word2Vec算出的词向量相加做平均处理,来代表这些词组成的一段段落的向量;但是这样就没有考虑到字词的先后顺序,以及上下文关係,而且段落长度可能相差非常多。
于是Word2Vec论文作者 Tomas Mikolov 再延伸提出了 Doc2Vec方法, 比起直接将字词相加,Doc2Vec考虑字词先后顺序后算出代表一语句段落的向量。
那如何做到让模型”参考到字词顺序及上下文关係”?
Doc2Vec跟Word2Vec有异曲同工之妙,这两种神经网络演算法其实跟Word2Vec很类似:
图片来源: https://link.springer.com/chapter/10.1007/978-3-319-66808-6_16
- PV-DM
- (Paragraph Vector – Distributed Memory)
- 跟CBOW很像,只是多了paragraph_id (会先映射成一paragraph vector)。训练过程中 paragraph_id跟词一样保持不变、参与每个词的训练,待每个词都被训练到以后,也会获得一个代表这段文档的向量(文档权重D)。
- PV-DBOW
- (Paragraph Vector – Distributed Bag-of-words)
- 跟Skip-gram很像,使用文档权重矩阵来预测每个词出现的机率。
同一个文档段落,用单词Word2Vec相加 v.s. Doc2Vec 的效果
参考资料: 1. 【演算法】word2vec与doc2vec模型:http://www.ipshop.xyz/9903.html 2. 一周论文 | Word2Vec 作者Tomas Mikolov 的三篇代表作:https://kknews.cc/zh-tw/news/69j4am.html 3. 深度学习笔记——Word2vec和Doc2vec原理理解并结合代码分析:https://blog.csdn.net/mpk_no1/article/details/72458003
Be First to Comment