赞
踩
import gensim
gensim.__version__
'4.0.1'
建议看这篇文章:https://zhuanlan.zhihu.com/p/26306795/
简单点说,word2vec就是将一个单词映射成一个高维向量,例如google训练的word2vec模型将man
这个单词映射成一个300维的向量。
这么做的好处有:
word2vec是一个需要训练的模型,官方提供了训练好的模型供人们玩。
下载这个文件,然后将其放在当前目录下
链接:https://pan.baidu.com/s/1Y5no1IDg6qtCwolOQVV_8A
提取码:at9e
加载模型:
wv = gensim.models.KeyedVectors.load_word2vec_format("GoogleNews-vectors-negative300.bin.gz", binary=True) # wv = word2vec
如果上面这句报错,请参考这篇文章:https://stackoverflow.com/questions/57507832/unable-to-allocate-array-with-shape-and-data-type
wv就是加载好的模型,可以很方便的使用模型获取单词的向量:
vec_king = wv['king']
vec_king.shape
(300,)
可以看出,king这个单词是一个300维度的向量
如果传递了一个不在词库中的单词,则会报错
try:
vec_cameroon = wv['huluanxiede']
except KeyError:
print("The word 'cameroon' does not appear in this model")
The word 'cameroon' does not appear in this model
计算两个单词的相似度:
wv.similarity('man', 'woman') # 两个单词相似度很高
0.76640123
wv.similarity('woman', 'hello') # 两个单词没什么关系,相似度很低
0.105804786
查询单词的最相似的5个单词:
wv.most_similar(positive=['man'], topn=5)
[('woman', 0.7664012908935547),
('boy', 0.6824870705604553),
('teenager', 0.6586930751800537),
('teenage_girl', 0.6147903203964233),
('girl', 0.5921714305877686)]
定义一些动物和颜色的单词:
animals = ['dog', 'cat', 'panda', 'elephant', 'tiger', 'lion', 'monkey', 'koala']
colors = ['black', 'blue', 'green', 'purple', 'yellow', 'red', 'pink', 'orange']
cars = ['bicycle', 'bus', 'bike', 'motor', 'plane', 'ship', 'car']
将上述单词转为300维的向量:
animals_vec = wv[animals]
colors_vec = wv[colors]
cars_vec = wv[cars]
使用sklearn的PCA库,对数据进行降维:
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
pca.fit(animals_vec)
animals_vec = pca.transform(animals_vec)
pca.fit(colors_vec)
colors_vec = pca.transform(colors_vec)
pca.fit(cars_vec)
cars_vec = pca.transform(cars_vec)
将上述点绘制成图像:
import matplotlib.pyplot as plt
plt.scatter(animals_vec[:, 0], animals_vec[:, 1], marker='o')
plt.scatter(colors_vec[:, 0], colors_vec[:, 1], marker='x')
plt.scatter(cars_vec[:, 0], cars_vec[:, 1], marker='+')
plt.show()
从上图可以看出,比较相似的单词距离较近(虽然降维后不太明显)。
sentences = [
['I', 'like', 'dog'],
['I', 'like', 'cat'],
['I', 'go', 'to', 'school', 'by', 'bus'],
['I', 'go', 'to', 'work', 'by', 'subway'],
] # 分好词的句子
"""
vector_size: 要将单词转化为多少维的向量
min_count: 当语料库中某个单词出现的次数小于min_count时,忽略该单词
window: 训练时,会考虑该单词的上下文。window表示考虑几个单词。一般情况下,该值越大,训练耗时越长,效果越好。
"""
model = gensim.models.Word2Vec(sentences=sentences, vector_size=10, min_count=1, window=2)
model.wv['dog'] # 获取dog单词的词向量
array([-0.08619688, 0.03665738, 0.05189884, 0.05741937, 0.07466917,
-0.06167676, 0.01105614, 0.06047282, -0.02840052, -0.06173522],
dtype=float32)
print("dog和cat的相似度:", wv.similarity('dog', 'cat'))
print("bus和subway的相似度:", wv.similarity('bus', 'subway'))
print("dog和bus的相似度:", wv.similarity('dog', 'bus'))
dog和cat的相似度: 0.7609457
bus和subway的相似度: 0.4529537
dog和bus的相似度: 0.16011381
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。