Gensim库的使⽤——Word2vec模型(⼀)模型的简单介绍与明锐pro价格
加载预训练的模型进⾏测试
Word2vec模型
介绍⼀下Word2vec模型以及在Lee Evaluation语料库上进⾏使⽤
import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s',level=logging.INFO)
Word2vec是⼀种基于神经⽹络的⽽且被⼴泛使⽤的算法,也可以看成“深度学习”的⼀种算法,虽然它本⾝层次可能并不深。
Word2vec通过使⽤⼤量的没有注释过的⽂本,⾃动的学习单词之间的关系。这个算法的输出是向量,每⼀个单词对应⼀个具有显性的线性关系的向量,⽐如下⾯的例⼦
可以看到,“国王”的向量减去“男⼈”的向量加上“⼥⼈”的向量⼤约等于“⼥王”的向量
word2vec模型在⾃动⽂本标注、推荐系统和机器翻译等应⽤领域具有很⼤的应⽤价值
回顾:Bag-of-words模型
在开始介绍Word2vec模型之前,必须确保你对Bag-of-words已经有了了解,这⾥先对词袋(bag-of-words)模型进⾏回顾:
Bag-of-words模型是将每个⽂档转换成⼀个固定长度的整数向量的⽅法,⽐如说有以下的两个句⼦:
词袋模型可能给出的对应的两个向量为:
输出的向量每⼀个都有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,如果真的要下载国内的⽹络⽐较慢,要下挺久。
深圳限行时间2021春节
最常⽤的⼀个⽅法,是检索⼀下这个模型⾥⾯的词汇表,你可以这么做:
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 </s>
word #1/3000000 is in
word #2/3000000 is for
crv高速油耗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
k2三厢word #9/3000000 is said
另⼀个⽅法是获取这个模型得到的单词的向量:
vec_king = wv['king']
注意!模型不能够为没见过的词给出向量表⽰!
所以你可以这么做:
try:
vec_cameroon = wv['cameroon']
二手狮跑>极狐阿尔法s全新hi版
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个单词:
st_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