Python下的Word2Vec的使用需要安装gensim,安装教程: gensim官网安装教程
本人水平有限,还是建议看官方教程: gensim官网使用教程
使用日志:
import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
Transformation interface(转换接口)
前一篇教程,我们创建了用向量流表示文档的语料,接下来,我们来使用这个语料做一些更深入的事情。
import os
from gensim import corpora, models, similarities
'''加载之前生成的字典和语料'''
if (os.path.exists("/tmp/deerwester.dict")):
dictionary = corpora.Dictionary.load('/tmp/deerwester.dict')
corpus = corpora.MmCorpus('/tmp/deerwester.mm')
print("Used files generated from first tutorial")
else:
print("Please run first tutorial to generate data set")
如果这里输出的是“Please run first tutorial to generate data set”,请参照第一篇教程 手把手教你学Word2Vec系列一之Corpora and Vector Spaces获得生成的文件。
这一节我们要做的就是将上篇教程得到的向量转换为另一种向量。
创建transformation并转换为新的向量
'''第一步: 初始化一个model, 这里使用的是tf-idf模型'''
tfidf = models.TfidfModel(corpus)
'''假设, doc_bow 是一个新文档的向量表示'''
doc_bow = [(0, 1), (1, 1)]
'''第二步: 使用这个model来将 doc_bow 转换为另外一个向量'''
print(tfidf[doc_bow])
'''将整个语料都转换为新的向量'''
corpus_tfidf = tfidf[corpus]
for doc in corpus_tfidf:
print(doc)
# Transformations 也是可以被串行话的,即可以在一个转换的基础上再进行一次转换。下列例子就是在tf-idf转换上再次转换为LSI
'''初始化一个LSI transformation, 设置topic数为2'''
lsi = models.LsiModel(corpus_tfidf, id2word=dictionary, num_topics=2)
'''在原始语料基础上再包装一层转换: bow->tfidf->fold-in-lsi'''
corpus_lsi = lsi[corpus_tfidf]
'''上述利用LSI将tf-idf语料转换为一个2维向量, 通过下列写入日志的方式可以查看这个二维向量'''
lsi.print_topics(2)
'''这里会执行bow->tfidf transformation和tfidf->lsi transformations'''
for doc in corpus_lsi:
print(doc)
'''将lsi模型持久化到文件'''
lsi.save('model.lsi')
lsi = models.LsiModel.load('model.lsi')
这里需要注意的是,model[corpus]仅仅是在老的语料文档流中包装了一层,结果是在文档迭代中计算出来的,在调用corpus_transformed = model[corpus]方法时不能将整个语料转换,因为这违背了gensim内存独立的特性,如果你要转换多次,并且每次转换都很耗时,建议将结果语料存入磁盘,参考serialize the resulting corpus to disk first,然后再进行下一步转换。
可用的其它转换(transformations)
下面列出一些比较常见的transformation,至于每个模型的原理、目的等详细内容,请自行百度。
'''可用的其他转换'''
# Term Frequency * Inverse Document Frequency, Tf-Idf
model = models.TfidfModel(corpus, normalize=True)
# Latent Semantic Indexing, LSI (or sometimes LSA)
model = models.LsiModel(tfidf_corpus, id2word=dictionary, num_topics=300)
# Random Projections, RP
model = models.RpModel(tfidf_corpus, num_topics=500)
# Latent Dirichlet Allocation, LDA
model = models.LdaModel(corpus, id2word=dictionary, num_topics=100)
# Hierarchical Dirichlet Process, HDP
model = models.HdpModel(corpus, id2word=dictionary)