Gensim库的使用——Word2vec模型(一)模型的简单介绍与加载预训练的模型进行测试

Word2vec模型

介绍一下Word2vec模型以及在Lee Evaluation语料库上进行使用

import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s',level=logging.INFO)

Word2vec是一种基于神经网络的而且被广泛使用的算法,也可以看成“深度学习”的一种算法,虽然它本身层次可能并不深。

Word2vec通过使用大量的没有注释过的文本,自动的学习单词之间的关系。这个算法的输出是向量,每一个单词对应一个具有显性的线性关系的向量,比如下面的例子

  • vec(“king”) - vec(“man”) + vec(“woman”) =~ vec(“queen”)

  • vec(“Montreal Canadiens”) – vec(“Montreal”) + vec(“Toronto”) =~ vec(“Toronto Maple Leafs”)

可以看到,“国王”的向量减去“男人”的向量加上“女人”的向量大约等于“女王”的向量

word2vec模型在自动文本标注、推荐系统和机器翻译等应用领域具有很大的应用价值

回顾:Bag-of-words模型

在开始介绍Word2vec模型之前,必须确保你对Bag-of-words已经有了了解,这里先对词袋(bag-of-words)模型进行回顾:

Bag-of-words模型是将每个文档转换成一个固定长度的整数向量的方法,比如说有以下的两个句子:

  • John likes to watch movies. Mary likes movies too.

  • John also likes to watch football games. Mary hates football.

 词袋模型可能给出的对应的两个向量为:

  • [1, 2, 1, 1, 2, 1, 1, 0, 0, 0, 0]

  • [1, 1, 1, 1, 0, 1, 0, 1, 2, 1, 1]

 输出的向量每一个都有10个元素,每个元素代表的值是某个特定的单词出现的次数,元素的顺序并没有规定,在上面的例子中使用的顺序可能是下面这样:

["John", "likes", "to", "watch", "movies", "Mary", "too", "also", "football", "games", "hates"].

 词袋模型出乎意料的很有效,但是也存在一些不足

词袋模型的不足:

<1>词袋模型丢失了词序,那么就意味着“John likes Mary” 和 “Mary likes John”这两个句子具有相同的向量,但是很明显这两个句子的含义并不相同。

<2>词袋模型并没有学习到底层的单词之间的联系,所以两个句子之间的距离不能够反应意义上的差异。

对于第一个不足,可以通过让词袋模型考虑长度为n的词组作为固定长度的向量来表示文档,可以获取到局部的词序,但是却存在着稀疏性和高维性。

而Word2vec模型可以很好地解决第二个不足

介绍:Word2vec模型

Word2vec模型是一种较新的模型,它可以使用浅层的神经网络来把单词嵌入到低维向量空间。

模型的输出是一组单词的向量,在这个向量空间当中,向量在上下文的基础上具有相似的意义,彼此距离较远的向量具有不同的含义。

比如说,“strong”和“powerful”可能距离很近,但是“strong”和“paris”距离较远。

Word2vec模型的版本

Word2vec模型存在两个版本,分别是

1、Skip-grams(SG)

2、Continuous-bag-of-words(CBOW)

以Skip-grams模型举例,它通过使用窗口在数据上进行移动而产生的词对(word1,word2)进行训练,根据给定的输入词训练出一个1-hidden-layer的神经网络,从而来给出附近词语对输入词语的预测的概率分布。

一个单词的one-hot编码通过“投影层”到达隐藏层,这些投影的权重就是单词的嵌入。

如果隐藏层有300个神经元,那么这个网络就会产生300维的单词嵌入。

CBOW模型和Skip-grams模型很相似,它也是使用一个单隐层的神经网络。通过使用多个目标词的上下文词语来预测目标词。

同样的,将一个one-hot词转化为和隐藏层相同宽度的投影权重就是对应词的嵌入。

Word2vec Demo

现在我们来看看word2vec到底能做些啥,我们来加载一个预先训练好的模型,并且对它进行测试。

首先获取在googlenews中的数据集的一部分上训练的模型,这个模型大概覆盖了300万个单词和短语,如果想要自己手动训练这个模型,可能会需要花费几个小时,如果只是加载这个训练好的模型,只需要几分钟就可以。

import gensim.downloader as api
wv = api.load('word2vec-google-news-300')

注意:这个模型很大,大概2GB,如果真的要下载国内的网络比较慢,要下挺久。

最常用的一个方法,是检索一下这个模型里面的词汇表,你可以这么做:

for index, word in enumerate(wv.index_to_key):
    if index == 10:
        break
    print(f"word #{index}/{len(wv.index_to_key)} is {word}")
word #0/3000000 is 
word #1/3000000 is in
word #2/3000000 is for
word #3/3000000 is that
word #4/3000000 is is
word #5/3000000 is on
word #6/3000000 is ##
word #7/3000000 is The
word #8/3000000 is with
word #9/3000000 is said

另一个方法是获取这个模型得到的单词的向量:

vec_king = wv['king']

注意!模型不能够为没见过的词给出向量表示!

所以你可以这么做:

try:
    vec_cameroon = wv['cameroon']
except KeyError:
    print("The word 'cameroon' does not appear in this model")
The word 'cameroon' does not appear in this model

Word2vec模型可以支持一些现成的单词相似性的任务,你可以观察到模型对单词给出的输出:

pairs = [
    ('car', 'minivan'),   # a minivan is a kind of car
    ('car', 'bicycle'),   # still a wheeled vehicle
    ('car', 'airplane'),  # ok, no wheels, but still a vehicle
    ('car', 'cereal'),    # ... and so on
    ('car', 'communism'),
]
for w1, w2 in pairs:
    print('%r\t%r\t%.2f' % (w1, w2, wv.similarity(w1, w2)))
'car'   'minivan'       0.69
'car'   'bicycle'       0.54
'car'   'airplane'      0.42
'car'   'cereal'        0.14
'car'   'communism'     0.06

 你可以打印出与“car”或者“minivan”最相似的5个单词:

print(wv.most_similar(positive=['car', 'minivan'], topn=5))
[('SUV', 0.8532192707061768), ('vehicle', 0.8175783753395081), ('pickup_truck', 0.7763688564300537), ('Jeep', 0.7567334175109863), ('Ford_Explorer', 0.7565720081329346)]

 或者你可以召出来不属于这个某个列表中的单词:

print(wv.doesnt_match(['fire', 'water', 'land', 'sea', 'air', 'car']))
car

 

你可能感兴趣的:(gensim,深度学习,神经网络,深度学习,自然语言处理,python,机器学习)