word2vec的安装,应用帖子好多,那如果想在训练的结果,也就是得到的向量上做点儿文章,该如何呢

下面来说说word2vec(python的gensim包)训练得到的模型,以及得到的向量是什么样子的

因为python训练得到的结果是二进制的,说白了就是乱码,现在既然想得到整个结果,该怎么弄呢。

其实好多事情直接看源码就能得到。之前试图找api或者小伙伴的帖子,想看看model的结构是什么样子的,未遂,只好直接自己一点儿点儿看源码。

首先我们假设,已经训练好了一个模型,现在只需要load就行了

model = gensim.models.Word2Vec.load('/mymodel_wds_wiki_all')


首先,获得一个词的词向量可以直接通过这样的方式获得

print len(model['中国'])
print type(model['中国'])
print (model['中国'])


得到的结果如下,可见类型是numpy.ndarray,维度是默认的一百维

100

<type 'numpy.ndarray'>

[-1.36747932  1.64107883  2.22578478 -2.02663827  3.4452529   1.86765969 ……]


下面直接看model的代码


self.vocab = {}  # mapping from a word (string) to a Vocab object
self.index2word = []  # map from a word's matrix index (int) to word (string)
self.sg = int(sg)
self.cum_table = None  # for negative sampling
self.vector_size = int(size)
self.layer1_size = int(size)
if size % 4 != 0:
    logger.warning("consider setting layer size to a multiple of 4 for greater performance")
self.alpha = float(alpha)
self.window = int(window)
self.max_vocab_size = max_vocab_size
self.seed = seed
self.random = random.RandomState(seed)
self.min_count = min_count
self.sample = sample
self.workers = int(workers)
self.min_alpha = float(min_alpha)
self.hs = hs
self.negative = negative
self.cbow_mean = int(cbow_mean)
self.hashfxn = hashfxn
self.iter = iter
self.null_word = null_word
self.train_count = 0
self.total_train_time = 0
self.sorted_vocab = sorted_vocab
self.batch_words = batch_words


这里面可以看到,词都存在了vocab = {} 这个字典里

那我们来访问一下试试

for k,v in model.vocab.items():
    print k,v

得到如下结果

义演 Vocab(count:106, index:70231, sample_int:4294967296L)
佳酿 Vocab(count:16, index:224970, sample_int:4294967296L)
群落生境 Vocab(count:28, index:166480, sample_int:4294967296L)
黑变病 Vocab(count:336, index:32138, sample_int:4294967296L)
行房 Vocab(count:34, index:144120, sample_int:4294967296L)
集美 Vocab(count:258, index:38457, sample_int:4294967296L)
视锐度 Vocab(count:32, index:152414, sample_int:4294967296L)
设军 Vocab(count:10, index:308955, sample_int:4294967296L)
呼格 Vocab(count:110, index:68738, sample_int:4294967296L)

这个index应该就是在model里面的一个坐标
count表示在整个语料中,这个词出现的次数

如果改成这句话,得到的结果是一样的

print k,model.vocab[k]


这样,通过遍历整个vocab,就能得到全部的表示成

【词 向量】 x n

的结果了

 

可以使用下面的代码

def generateTrainedModel(filename,num):
    output = open(filename, 'w')
    count = 0
    content = str(num) + ' 200\n'
    for k,v in model.vocab.items():
        # print k,type(model[k].tolist())
        l = (model[k].tolist())
        content += str(k) + ' '
        for i in l:
            content += str(i) + ' '
        for i in l[:-1]:
            content += str(i) + ' '
        content += str(l[-1])
        content += '\n'
    # content.encode('utf-8')
    output.write(content[:-2])
    output.close()

 

那这个结果保存成文件之后怎么加载呢?
可以通过这个语句,直接binary指定是不是二进制文件,来确定

model.save_word2vec_format('C:\Users\nnn\Desktop\Word2Vec\\test.txt', binary=False)


这样一来,就可以改造word2vec的训练结果了