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

8 篇文章 0 订阅
2 篇文章 0 订阅

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值