使用gensim的word2vec做的一点小实验……
1.首先对文本进行word2vec
网上语料库很多,可以随便找一找
import gensim,logging
import gensim, logging
import os
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
class MySentences(object):
def __init__(self, dirname):
self.dirname = dirname
def __iter__(self):
for fname in os.listdir(self.dirname):
for line in open(os.path.join(self.dirname,fname),encoding='gbk'): #我要读取的都是中文,使用gkb好一些
yield line.split()
sentences =MySentences('E:\\test\\')#读取目录里所有文件
model = gensim.models.Word2Vec(sentences,size=100, min_count=1,window =2,sg=1,hs=1,iter=20)
size=100:向量维数100维
min_count=1:最小词频为1
window =2:窗口大小为2
sg=1:使用skip-gram方法
hs=1:使用softmax function
iter=20:迭代20次(我记得默认是5次)
2.保存生成的模型,以便使用
两种方式:
第一种:可以更加快速加载的模型
model.save("E:\\word2vec1.model")
第二种:可以用文本查看的模型,但是加载慢(不进行可视化展示了)
modelX.wv.save_word2vec_format("E:\\word2vec1.vector")
modelX.wv.save_word2vec_format("E:\\word2vec1.bin")
3.加载模型
X = model.load("E:\\word2vec1.model")
4.搞一些相似度之类的东西
对我来说,是我想要的东西,相似度可以
X.wv.most_similar(u'综合商场')
#输出
[('体育户外', 0.6556961536407471),
('母婴儿童', 0.6473106145858765),
('电影院', 0.5801295638084412),
('数码家电', 0.5358222126960754),
('综合体育场馆', 0.5341006517410278),
('培训', 0.5147511959075928),
('钟表店', 0.5030048489570618),
('小商品市场', 0.49604037404060364),
('服饰鞋包', 0.47768259048461914),
('花鸟鱼虫', 0.4769262373447418)]
5.t-SNE压缩向量可视化
#t-SNE
from matplotlib.font_manager import *
import matplotlib.pyplot as plt
modelX = gensim.models.Word2Vec.load("E:\\word2vec1.model")#我重新加载一下
X = modelX[modelX.wv.vocab]
X_tsne = TSNE(n_components=2).fit_transform(X)#n_components=2,压缩成2维
list = []#我想图片显示文字,所以把文字存在了列表里,可能有更好的办法,但是我目前没找到,也不知道去哪里找一下
words = modelX.wv.vocab
for word in words:
print(word)
list.append(word)
plt.figure(figsize=(30, 15)) #图片大小
myfont = FontProperties(fname='E:\\文泉驿正黑.ttf')#文字样式,不用的话,我显示的都是方块……
plt.scatter(X_tsne[:,0],X_tsne[:,1])
for i in range(len(X_tsne)):
x=X_tsne[i][0]
y=X_tsne[i][1]
plt.text(x , y,list[i],fontproperties=myfont,size = 16)
plt.show()
效果一般,但是东西是出来了(毕竟我想要的是这个过程。调参啥的之后再研究)
结束实验~~~