首先我们还是先举例,比如我们有一个词库V:
V = (apple, going, I, home, machine, learning)
首先是最简单的词袋模型的表达方式:
apple: (1,0,0,0,0,0)
going: (0,1,0,0,0,0)
I going home: (0,1,1,1,0,0)
稍微高级一点的,通过tf-idf的方式进行表达,可能是这样:
每一项会附上权重
I going home: (0, 0.3, 0.8, 0.7, 0, 0)
以上都是传统的one-hot encoding的表达方式,缺点在于它无法展示出两个词语的相似性,比如"go"和"went"的相似度,要明显高于"go"和"apple"的相似度,但是在上述例子中,很可能两组相似度都为0。
为了解决上述问题,接下来我们引入分布式表示(Dense Vector)
相比于传统的表达方法,它有以下优点:
对于第3点,我们可以举例说明:
①传统方式: apple: (0,1,0,…,0,0) 它的维度可能是V = 10^4
②分布式: apple: (0.2, 0.3, …, 0.7) 它的维度可能是100
①中,1W维的空间的表达能力(表达多少个单词)是10^4
②中,可能只需要100维就可以解决问题,而且可以表达理论上无限多(infinite)的单词。
为了实现分布式表达方式,我们可以使用Skip-Gram模型。Skip-Gram模型的核心是:在文本中,距离越近的单词相似度会越高。
例如 “We are working on NLP project, it is hard.” 模型在关注一个单词时,会观察它的前后单词
此时的间距(window size)为1,当然也可以考虑window size = 2,5,10…
大致的思路是这样,模型部分在此不做过多的展开,会在之后的文章中单独讲解Skip-Gram和Cbow模型。