Gensim Tutorials(一)

前言

最近一直在看文本方面的东西,虽然好理解,但是总感觉缺了点什么,意外中发现了一个不错的开源工具包gensim,它是基于python的文本挖掘工具,主要是topic model的实现,粗看了一下,感觉非常方便,所以就想学习一下这个工具,本文档主要是对Tutorials中的代码进行了注释,以备以后使用。

From Strings to Vectors

#文档内容,每一行就是一篇文档
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]
#collections是内建模块,defaultdict是封装之后的dict,区别在于defaultdict在key不存在时并不报错
from collections import defaultdict

frequency = defaultdict(int)    #表示所有的value都是int类型
for text in texts:
    for token in text:
        frequency[token] += 1
#过滤掉次数<=1的单词
texts = [[word for word in text if frequency[word] > 1] for text in texts]
#pprint是pythonn内建模块,提供了打印各种数据结构的方法
from pprint import pprint
pprint(texts)
'''
Dictionary是dict的一个实现,是word与word_ids的映射
主要方法   doc2bow  将文档转化为词袋模型,即list (word_ids,word_frequency)<---二元组,不设置allow_update,就不会更新原有的list
token2id,{word1:word_ids1, word2:word_ids2,……},这里的ids就是下面矩阵的列
'''
dictionary = corpora.Dictionary(texts)
dictionary.save("deerwester.dict")
print(dictionary)
print(dictionary.token2id)

new_doc = "Human computer interaction"
new_vec = dictionary.doc2bow(new_doc.lower().split())
print(new_vec)

corpus = [dictionary.doc2bow(text) for text in texts]
'''
MmCorpus是一种语料格式,每一个列表表示一篇文档,(word_id,word_frequency)
%%MatrixMarket matrix coordinate real general
m n frequency        
m:行(即第m篇文档)   n:词的ids,  frequency:出现次数
表示第m篇文章dic中ids为n的词出现了frequency次
'''
corpora.MmCorpus.serialize('deerwester.mm',corpus)
print(corpus)

Corpus Streaming – One Document at a Time

'''
定义了一个类来读取语料mycorpus.txt,使用yield保证每次只读一行进入内存
'''
class MyCorpus(object):
    def __iter__(self):
        for line in open('mycorpus.txt'):
            yield dictionary.doc2bow(line.lower().split())

corpus_memory_friendly = MyCorpus()
print(corpus_memory_friendly)
#每次循环时,执行一次MyCorpus的__iter__函数
for vector in corpus_memory_friendly:
    print(vector)
#同样可以起到分批读进内存的效果
dictionary = corpora.Dictionary(line.lower().split() for line in open('mycorpus.txt'))
#得到所有停用词的ids
stop_ids = [dictionary.token2id[stopword] for stopword in stoplist if stopword in dictionary.token2id]
#dictionary.dfs-->{(tokenId,docFreq),……}  tokenId对应的词在几篇文档中出现过
once_ids = [tokenid for tokenid, docfreq in dictionary.dfs.iteritems() if docfreq == 1]
#过滤掉stop_ids与once_ids集合所对应的所有mapping
dictionary.filter_tokens(stop_ids+once_ids)
#重新分配所有单词的ids,减小矩阵稀疏
dictionary.compactify()
print(dictionary)

Corpus Formats

#创建一个python原生列表,表征两个文档
corpus = [[(1,1)],[(2,2)],[(2,3),(5,2),(9,2)],[(8,3)]]
#Matrix Market格式,具体见上
corpora.MmCorpus.serialize('corpus.mm', corpus)
'''
SVM^light数据格式
#-1 1:0.43 3:0.12 9284:0.2    #abcdef  
#-1为分类标识,可取(+1、-1、0),m:n表示第m个特征的值为0.43,#abcdef表示额外的信息
'''
corpora.SvmLightCorpus.serialize('corpus.svmlight', corpus)
'''
Blei的LDA主题模型c语言版本格式
N fieldId1:fieldValue1 fieldId2:fieldValue2 ... fieldIdN:fieldValueN
N代表个数,id:value
其存在一个单词表,每个单词一行,行号就是单词的id
'''
corpora.BleiCorpus.serialize('corpus.lda-c', corpus)
'''
[M]      文档个数
[document1]
[document2]
...
[documentM]  
[documenti] = [wordi1] [wordi2] ... [wordiNi]
真正的词袋子,不统计个数,每一行相当于单词集
'''
corpora.LowCorpus.serialize('corpus.low', corpus)
#加载格式文件到stream中
corpus = corpora.MmCorpus("corpus.mm")
print(list(corpus))
for doc in corpus:
    print(doc)

Compatibility with NumPy and SciPy

import numpy as np
numpy_matrix = np.mat([[1,5],[3,4]])
corpus = gensim.matutils.Dense2Corpus(numpy_matrix)
print("----------------numpy mat 2 gensim corpus --------------------")
print(list(corpus))
#num_terms是特征的维数,即转化成matrix的行
numpy_matrix = gensim.matutils.corpus2dense(corpus, num_terms=2)
print("----------------gensim corpus 2 numpy mat--------------------")
print(numpy_matrix)

from scipy.sparse import coo_matrix
scipy_matrix = coo_matrix([[1,2,0],[2,2,1],[3,4,3]])
corpus = gensim.matutils.Sparse2Corpus(scipy_matrix)
print("----------------scipy mat 2 gensim corpus--------------------")
print(list(corpus))
scipy_matrix = gensim.matutils.corpus2csc(corpus)
print("----------------gensim corpus 2 scipy mat--------------------")
print(scipy_matrix)

后续

Tutorials后面还有几篇,继续进行注释,注释结束后会对gensim整个工具包的使用得心应手。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在MATLAB中,没有直接集成Gensim库。Gensim是一个用于主题建模和文本处理的Python库。然而,你可以使用MATLAB的Python接口来调用Gensim库。 首先,确保你已经安装了Python以及Gensim库。然后,使用MATLAB的Python接口来调用Gensim库的功能。下面是一个示例代码: ```matlab % 调用Gensim库 py.importlib.import_module('gensim'); % 创建一个简单的文档集合 documents = {'This is the first document.', 'This document is the second document.', 'And this is the third one.', 'Is this the first document?'}; % 对文档进行预处理 processed_docs = py.gensim.utils.simple_preprocess(documents); % 创建词袋模型 dictionary = py.gensim.corpora.Dictionary(processed_docs); corpus = py.list(); for i = 1:numel(processed_docs) corpus.append(dictionary.doc2bow(processed_docs{i})); end % 训练LDA模型 lda_model = py.gensim.models.LdaModel(corpus, 'num_topics', 3, 'id2word', dictionary, 'passes', 10); % 打印主题词 topics = lda_model.print_topics(-1); for i = 1:numel(topics) disp(topics{i}); end ``` 上述示例代码演示了如何使用MATLAB的Python接口调用Gensim库来进行主题建模。首先,我们导入了Gensim库并创建了一个简单的文档集合。然后,我们对文档进行预处理,并创建了词袋模型。最后,我们使用LDA模型进行训练,并打印出每个主题的关键词。 请注意,这只是一个简单的示例,你可以根据你的需求和数据进行适当的修改。同时,确保已经正确配置了MATLAB的Python接口以及安装了Gensim库。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值