https://rare-technologies.com/word2vec-tutorial/ 原教程地址
1.准备好输入
gensim word2Vec输入是句子序列 每个句子是一个词的列表(一些utf8编码的字符串)
# import modules & set up logging
import gensim, logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
sentences = [['first', 'sentence'], ['second', 'sentence']]
# train word2vec on the two sentences
model = gensim.models.Word2Vec(sentences, min_count=1)
2. 迭代器
输入很大时 可以用迭代器 不用一次全部读入内存 只需要每次输入产生一个句子
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)):
yield line.split()
sentences = MySentences('/some/directory') # a memory-friendly iterator
model = gensim.models.Word2Vec(sentences)
调用Word2Vec(sentences, iter=1) 将运行iter+1遍 默认iter=5 ,第一遍收集单词及其频率以构建内部字典树结构。 第二次和随后的传递训练神经模型。 这两个(或者,iter + 1)传递也可以手动启动,以防您的输入流不可重复(您只能承担一次传递),并且您可以通过其他方式初始化词汇表:
model = gensim.models.Word2Vec(iter=1) # an empty model, no training yet
model.build_vocab(some_sentences) # can be a non-repeatable, 1-pass generator
model.train(other_sentences) # can be a non-repeatable, 1-pass generator
3.训练
少于mincount的词会被忽略
model = Word2Vec(sentences, min_count=10) # default value is 5
NN层的大小
model = Word2Vec(sentences, size=200) # default value is 100
大size需要更多的数据
并行处理
model = Word2Vec(sentences, workers=4) # default = 1 worker = no parallelization
4.内存占用
在其核心,word2vec模型参数存储为矩阵(NumPy数组)。 每个数组都是#vocabulary(由min_count参数控制)乘以浮点数的#size(size参数)(单精度,也就是4个字节)。
三个这样的矩阵保存在RAM中(正在进行工作以将该数量减少到两个,甚至一个)。 因此,如果您的输入包含100,000个唯一单词,并且您要求图层大小= 200,则模型将需要大约。 100,000 * 200 * 4 * 3字节= ~229MB。
存储词汇树需要一些额外的内存(100,000个单词需要几兆字节),但除非你的单词非常冗长,否则内存占用将由上面的三个矩阵控制。
5.评估
Gensim完全支持相同的评估集
model.accuracy('/tmp/questions-words.txt')
2014-02-01 22:14:28,387 : INFO : family: 88.9% (304/342)
2014-02-01 22:29:24,006 : INFO : gram1-adjective-to-adverb: 32.4% (263/812)
2014-02-01 22:36:26,528 : INFO : gram2-opposite: 50.3% (191/380)
2014-02-01 23:00:52,406 : INFO : gram3-comparative: 91.7% (1222/1332)
2014-02-01 23:13:48,243 : INFO : gram4-superlative: 87.9% (617/702)
2014-02-01 23:29:52,268 : INFO : gram5-present-participle: 79.4% (691/870)
2014-02-01 23:57:04,965 : INFO : gram7-past-tense: 67.1% (995/1482)
2014-02-02 00:15:18,525 : INFO : gram8-plural: 89.6% (889/992)
2014-02-02 00:28:18,140 : INFO : gram9-plural-verbs: 68.7% (482/702)
2014-02-02 00:28:18,140 : INFO : total: 74.3% (5654/7614)
6.存储
model.save('/tmp/mymodel')
new_model = gensim.models.Word2Vec.load('/tmp/mymodel')
加载模型 用更多的句子训练
model = gensim.models.Word2Vec.load('/tmp/mymodel')
model.train(more_sentences)
7.使用模型
model.most_similar(positive=['woman', 'king'], negative=['man'], topn=1)
[('queen', 0.50882536)]
model.doesnt_match("breakfast cereal dinner lunch";.split())
'cereal'
model.similarity('woman', 'man')
0.73723527
model['computer'] # raw NumPy vector of a word
array([-0.00449447, -0.00310097, 0.02421786, ...], dtype=float32)
model.wv.vocab 词汇表字典