gensim学习之语料库和向量空间

微信公众号:数据挖掘与分析学习

1.字符串转为向量

1.1导入所需库

import logging

logging.basicConfig(format='%(asctime)s:%(levelname)s:%(message)s',level=logging.INFO)

 

from gensim import corpora

 

from collections import defaultdict

 

1.2.语料准备和处理

这里只使用一些语句的集合来作为语料

#文档集合使用string的list表示,每个string代表一个文档.整个就是一个小的训练语料

documents=["Human machine interface for lab abc computer applications",

              "A survey of user opinion of computer system response time",

              "The EPS user interface management system",

              "System and human system engineering testing of EPS",

              "Relation of user perceived response time to error measurement",

              "The generation of random binary unordered trees",

             "The intersection graph of paths in trees",

              "Graph minors IV Widths of trees and well quasi ordering",

              "Graph minors A survey"]

 

去除停用词和仅出现一次的单词

stoplist=set('for a of the and to in'.split())#停用词

#去除停用词

texts=[[word for word in document.lower().split() if word not in stoplist] for document in documents]

print(texts)

 

#去除只出现一次的词

from collections import defaultdict

frenquency=defaultdict(int)

for text in texts:

    for token in text:

        frenquency[token]+=1

texts=[[token for token in text if frenquency[token]>1] for text in texts]#只保留出现次数大于1的词

from pprint import pprint

pprint(texts)

输出如下:

 

处理文件的方式可能各有不同,在这里,我们只根据空格来拆分语句,然后将单词转为小写。处理文档的方式依赖于应用程序和语言。文档由从中提取的特征表示,而不是由其表面字符串表示:如何使用这些特征取决你的应用。下面描述一种常见通用的方法:词袋。

1.3.向量化

要将文档转换为向量,我们使用一个名为bag-of-words的文档表示方法。在这种表示中,每个文档由一个向量表示。

dictionary=corpora.Dictionary(texts)

在这里,我们使用gensim.corpora.dictionary.Dictionary类为语料库中出现的所有单词分配了一个唯一的整数id。 这会扫描文本,收集字数和相关统计数据。 最后,我们看到在处理过的语料库中有12个不同的单词,这意味着每个文档将由12个数字表示(即,通过12-D向量)。 要查看单词及其ID之间的映射:

print(dictionary.token2id)

new_doc="Human computer interation Human computer"

new_vec=dictionary.doc2bow(new_doc.lower().split())

print(new_vec)

函数doc2bow()只计算每个不同单词的出现次数,将单词转换为整数单词id并将结果作为稀疏向量返回。 因此,稀疏向量[(0,1),(1,1)]读取:在文档“Human computer interaction”中,单词computer(id 0)和human(id 1)出现一次; 其他十个字典单词(隐含地)出现零次。

corpus=[dictionary.doc2bow(text) for text in texts]

corpora.MmCorpus.serialize('/tmp/deerwester.mm',corpus)#存到磁盘,留作后用

pprint(corpus)

 

2.语料库流--一次处理一个文档

请注意,上面的语料库完全驻留在内存中,作为普通的Python列表。 在这个简单的例子中,它并不重要,但为了使事情清楚,让我们假设语料库中有数百万个文档。 将所有这些语料存储在RAM中是行不通的。 相反,我们假设文档存储在磁盘上的文件中,每行表示一个文档。 Gensim只要求语料库必须能够一次返回一个文档向量:

class MyCorpus(object):

    def __iter__(self):

        for line in open('/tmp/mycorpus.txt'):

            #每行表示一个文档

            yield dictionary.doc2bow(line.lower().split())

假设每个文档在单个文件中占据一行并不重要; 您可以模仿__iter__函数以满足你自己的输入格式。 行走目录,解析XML,访问网络......只需解析输入以在每个文档中检索一个干净的标记列表,然后通过字典将标记转换为它们的ID,并在__iter__中生成稀疏向量。

corpus_memory_friendly=MyCorpus() #不把语料加载进内存

print(corpus_memory_friendly)

输出:<__main__.MyCorpus object at 0x00000121D2AE7EF0>

语料库现在是一个对象。 我们没有定义任何打印方式,因此print只输出内存中对象的地址。 不是很有用。 要查看构成向量,让我们遍历语料库并打印每个文档向量(一次一个):

for vector in corpus_memory_friendly:

    print(vector)

尽管输出与普通Python列表的输出相同,但语料库现在更加内存友好,因为一次最多只有一个向量驻留在RAM中。 您的语料库现在可以随意扩展。

 

 

3.语料库格式:序列化

存在几种用于将Vector Space语料库(〜矢量序列)序列化到磁盘的文件格式。 Gensim通过前面提到的流式语料库接口实现它们:文件以懒惰的方式从(分别存储到)磁盘读取,一次一个文档,而不是一次将整个语料库读入主存储器。

Matrix Market格式是一种比较值得注意的文件格式。 要以Matrix Market格式保存语料库:

#创建一个两个文档的语料库

corpus=[[(1,0.5)],[]]

corpora.MmCorpus.serialize('/tmp/corpus.mm',corpus)

 

其他格式包括Joachim的SVMlight格式,Blei的LDA-C格式和GibbsLDA ++格式。

corpora.SvmLightCorpus.serialize('/tmp/corpus.svmlight',corpus)

corpora.BleiCorpus.serialize('/tmp/corpus.lda-c',corpus)

corpora.LowCorpus.serialize('/tmp/corpus.low',corpus)

 

相反,要从Matrix Market文件加载语料库迭代器:

corpus=corpora.MmCorpus('/tmp/corpus.mm')

print(corpus)

语料库对象是流,因此通常您将无法直接打印它们

 

相反,要查看语料库的内容:

#打印语料库的一个方法是将它全都加载到内存

print(list(corpus))

 

另一种打印语料库的方法是使用流接口,一次打印一个文档

for doc in corpus:

    print(doc)

第二种方式显然对内存更友好,但是出于测试和开发目的,没有什么比调用列表(语料库)的简单性更好。

 

要以Blei的LDA-C格式保存相同的Matrix Market文档流,

corpora.BleiCorpus.serialize('/tmp/corpus.lda-c', corpus)

 

通过这种方式,gensim还可以用作内存高效的I / O格式转换工具:只需使用一种格式加载文档流,然后立即以另一种格式保存。

 

4.与Numpy和Scipy的兼容性

Gensim还包含有效的实用程序函数来帮助转换为/ numpy矩阵:

import gensim

import numpy as np

numpy_matrix=np.random.randint(10,size=[5,2])

corpus=gensim.matutils.Dense2Corpus(numpy_matrix)

print(corpus.dense)

numpy_matrix=gensim.matutils.corpus2dense(corpus,num_terms=5)

print(numpy_matrix)

和scipy.sparse矩阵转换:

import scipy.sparse as sparse

scipy_sparse_matrix=sparse.random(5,2,density=1)

# print(scipy_sparse_matrix)

corpus=gensim.matutils.Sparse2Corpus(scipy_sparse_matrix)

print(corpus.sparse)

scipy_csc_matrix=gensim.matutils.corpus2csc(corpus)

print(scipy_csc_matrix.shape)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值