GENSIM 使用笔记1 — 语料和向量空间
GENSIM 使用笔记2 — 主题模型和相似性查询
1 本篇说明
本篇博客来源于GENSIM官方向导文档的第一章,主要供自己后续的翻阅,并通过分享带给诸位网友一个小小的参照。
从字符串到向量
在这一小节当中,将会讲述如何通过gensim,将一段文本以向量的形式表示。
首先我们看一下我们的基本文档形式:
documents = [
'拍照反光一直是摄影爱好者较为苦恼的问题',
'尤其是手机这种快速拍照设备的成像效果总是难以令人满意',
'特别是抓拍的珍贵照片',
'遇上反光照片基本作废',
'而索尼最近研发的集成偏振片传感器',
'似乎可以有效的解决拍照反光的问题'
]
和原始教程不一样,这里我不完全参考他的文档,并且换用了中文作为示例,这一点更加贴合我们实际的使用。
在这里,我们简单的表示了下,将每篇文档(这里只是一句话,请根据实际情况替换)表示为了一个字符串,最后用一个list表示所有的文档,也就是我们的语料库了。
随后,我们需要将他进行分词,在这里我是用了jieba中文分词,如果有其他的大家可以自行替换,如果有什么特殊的功能(如停用词等)也可以自行参照修改。
texts = [jieba.lcut(document) for document in documents ]
此时,需要进行了词典的构建,如果需要查看具体的对照信息,也可以print下。具体的方式如下:
#构造字典 并 保存和加载
dictionary = corpora.Dictionary(texts)
dictionary.save('mydict.dic')
print 'Tokens:Id'
print dictionary.token2id
new_dictionary = corpora.Dictionary.load('mydict.dic')
print(new_dictionary)
那么现在我可以引入一些新的文本,并且通过他生成对应的向量(注意这里保证你的词,已经出现过在之前的语料库之中了,否则多出的这些词是不会统计的)
#构造新的文本并且获得他的向量
new_document = "索尼可以有效解决拍照的问题"
new_vector = dictionary.doc2bow(jieba.lcut(new_document))
print 'the vector of "%s": (tokenid,frequency)' % new_document
print new_vector
使用doc2bow这个功能,只会简单的做一些类似于wordcount的东西,并且返回的是一些元组,就是(词的id,频次)的一个数组,这里需要特别注意下。
最后,我们通过之前的字典和预料,生成一个符合我们格式的语料库
#生成语料库
corpus = [ dictionary.doc2bow(text) for text in texts]
当我们训练好了一个词典以后,一般希望将其记录到磁盘当中,方便后续使用,而不是每次都单独训练,gensim提供了多种序列化方式,在这里我只选择其中一种进行说明:
#序列化
corpora.MmCorpus.serialize('corpus.mm', corpus)
#重新加载预料
new_corpus = corpora.MmCorpus('corpus.mm')
print(len(new_corpus))
如上,就将语料库序列化和反序列化了
其他
原教程,还有一大块是关于如何对接numpy 以及如何节约内存的,这里就不多说了,有需要的自行研究
完整代码
#coding:utf-8
import gensim
import jieba
from gensim import corpora
documents = [
'拍照反光一直是摄影爱好者较为苦恼的问题',
'尤其是手机这种快速拍照设备的成像效果总是难以令人满意',
'特别是抓拍的珍贵照片',
'遇上反光照片基本作废',
'而索尼最近研发的集成偏振片传感器',
'似乎可以有效的解决拍照反光的问题'
]
texts = [jieba.lcut(document) for document in documents]
#构造字典 并 保存和加载
dictionary = corpora.Dictionary(texts)
dictionary.save('mydict.dic')
print 'Tokens:Id'
print dictionary.token2id
new_dictionary = corpora.Dictionary.load('mydict.dic')
print(new_dictionary)
#构造新的文本并且获得他的向量
new_document = "索尼可以有效解决拍照的问题,佳能就不可以"
new_vector = dictionary.doc2bow(jieba.lcut(new_document))
print 'the vector of "%s": (tokenid,frequency)' % new_document
print new_vector
#生成语料库
corpus = [ dictionary.doc2bow(text) for text in texts]
#序列化
corpora.MmCorpus.serialize('corpus.mm', corpus)
#重新加载预料
new_corpus = corpora.MmCorpus('corpus.mm')
print(len(new_corpus))