您的位置:首页 > 其它

GENSIM 使用笔记1 --- 语料和向量空间

2016-12-25 15:35 309 查看
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))


Reference

http://radimrehurek.com/gensim/tut1.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息