word2vec
基本概念的话可以参考:
Word2vec的数学理解.pdf
Word2vec实战.pdf
练习的话可以参考gensim官网,不想看官网的当然也有简化版Word2vec Tutorial,翻译版Word2vec Tutorial,
还有自己手敲版word2vec(个人不太建议看看原理就行)。
代码是参考官网以及自己的理解:
# -*- coding:utf-8 -*-
import os
import gensim
import logging
logging.basicConfig(level=logging.INFO,format = '%(asctime)s:%(levelname)s:%(message)s')
# sentences = [['first','sentence'],['second','sentence']]
# model = gensim.models.Word2Vec(sentences,min_count=1)
'''如果我们需要输入遍布磁盘上的多个文件中的每一行句子,那么我们可以逐行处理输入文件,而不是一下子将所有的内容
全部加载到内存列表中'''
class Mysentences(object):
def __init__(self,dirname):
self.dirname = dirname
def __iter__(self):
for filename in os.listdir(self.dirname):
for line in open (os.path.join(self.dirname,filename)):
# yield类似一个return 一样的关键字,只是这个函数返回的是一个生成器,当执行for循环时,返回
# yield 后的值作为第一次循环的返回值,然后再继续,这样不是一次性执行语句
yield line.split()
sentences = Mysentences('/Prmlcode/word2vec_test/data')#a memory-friendly Iterator
# 这就是构建word2vec model;比如转码,删除内容这些都不必要在该模型中出现应该在Mysentences这个迭代器中实现
'''Word2vec()最小词频,并行计算,和神经网络层的大小'''
model = gensim.models.Word2Vec(sentences,min_count=10,workers=5,size=200)
'''model save and load'''
model.save('/tmp/mymodel')#保存模型下一步加载就不用每次用的时候从新训练
new_model = gensim.models.Word2Vec.load('/tmp/mymodel')
'''也可以加载并继续训练'''
more_sentences = Mysentences('/some/more_directory')
new_model.train(more_sentences)
对迭代器的理解:
# -*- coding:utf-8-*-
import numpy as np
import itertools
houses =[1,2,3,4]
race = itertools.permutations(houses)
print list(race)
'''创建一个list,放入内存'''
mylist = [x*x for x in range(4)]
for i in mylist:
print i
for i in mylist:
print i
print '----------------'
'''产生一个生成器,实时生产数据,未放入内存中'''
mygenerator = (x*x for x in range(4))
for i in mygenerator:
print i
print '------no number----'
for i in mygenerator:
print i
'''================yield关键字=================================='''
def creatgenerator():
mylist1 = range(3)
for i in mylist1:
yield i
mygenerator = creatgenerator() #当你调用这个歌函数的时候并不立即执行,只是返回一个generator 生成器object
print mygenerator
print "------creatgenerator-----"
for i in mygenerator:
print i