Gensim 库的使用之 Word2Vec 模型案例演示
要见识一下 Word2Vec 模型可以做什么,那么最好的方法就是直接下载一个预训练模型,然后尝试用一下看看效果。
我们在这里获取一个在 Google News 数据集上训练完成的 Word2Vec 模型,覆盖了大约 300 万的词汇和短语。
这样一个模型需要几个小时来进行训练,但是既然 Google 已经将其公开,那直接花几分钟下载下来就能用了。
!!!注意:该模型大小约 2GB,而且需要科学的方法才能下载!实在无法解决网络问题的朋友,可以用我提供的本站连接下载,然后解压到对应位置!!!
~~由于文件太大,分了10个部分~~
word2vec-google-news-300.zip.001
word2vec-google-news-300.zip.002
word2vec-google-news-300.zip.003
word2vec-google-news-300.zip.004
word2vec-google-news-300.zip.005
word2vec-google-news-300.zip.006
word2vec-google-news-300.zip.007
word2vec-google-news-300.zip.008
word2vec-google-news-300.zip.009
word2vec-google-news-300.zip.010
不想在本地运行的朋友,也可以选择在线尝试该模型的效果:
http://radimrehurek.com/2014/02/word2vec-tutorial/#app
不过,如果不是科学的连接方式,不确保可以登陆该网页~~
该模型是利用了整个 Google News 大约 1000 亿个词的语料训练而成!
import gensim.downloader as api
wv = api.load('word2vec-google-news-300')
下载后的预训练文件会存储在:
./gensim-data/word2vec-google-news-300/word2vec-google-news-300.gz
for i, word in enumerate(wv.vocab):
if i == 10:
break
print(word)
运行结果:
</s>
in
for
that
is
on
##
The
with
said
print(len(wv.vocab))
运行结果:
3000000
vec_king = wv['king']
print(vec_king.shape)
运行结果:
(300,)
这里我们获得了一个 300 维的 ‘king’ 这个单词的词向量,包含了这个词的语意表示
Word2Vec 模型限制了非常用词出现在词表中,这个是出于模型使用的考虑,如果这个限制你觉得非常在意,可以尝试使用 FastText model 进行替代。
比如我们选个很怪的单词 ‘cameroon’ 查询一下:
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', 'space'),
]
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' 'space' 0.08
比如我们想要获得和 car,minivan 最相似的 5 个词:
print(wv.most_similar(positive=['car', 'minivan'], topn=5))
运行结果:
[('SUV', 0.8532191514968872), ('vehicle', 0.8175784349441528), ('pickup_truck', 0.7763689160346985), ('Jeep', 0.7567334175109863), ('Ford_Explorer', 0.7565719485282898)]
比如 ‘fire’, ‘water’, ‘land’, ‘sea’, ‘air’, ‘car’ 这 6 个词,通过相似度计算,我们可以知道 car 不是同一类的词:
print(wv.doesnt_match(['fire', 'water', 'land', 'sea', 'air', 'car']))
运行结果:
car