我正在尝试使用 gensim 主题模型回收 scikit-learn 矢量化器对象。原因很简单:首先,我已经有大量的矢量化数据;其次,我更喜欢 scikit-learn 矢量化器的界面和灵活性;第三,尽管使用 gensim 进行主题建模非常快,但Dictionary()
根据我的经验,计算它的字典 ( ) 相对较慢。
之前已经提出过类似的问题,尤其是这里和这里,桥接解决方案是 gensim 的Sparse2Corpus()
函数,它将 Scipy 稀疏矩阵转换为 gensim 语料库对象。
但是,这种转换没有利用vocabulary_
sklearn 向量化器的属性,它保存了单词和特征 id 之间的映射。这种映射对于打印每个主题的判别词是必要的(id2word
在 gensim 主题模型中,描述为“从词 id(整数)到词(字符串)的映射”)。
我知道 gensim 的Dictionary
对象比 scikit 的vect.vocabulary_
(一个简单的 Python )更复杂(计算速度也更慢dict
)......
在 gensim 模型中使用vect.vocabulary_
的任何想法?id2word
一些示例代码:
# our data
documents = [u'Human machine interface for lab abc computer applications',
u'A survey of user opinion of computer system response time',
u'The EPS user interface management system',
u'System and human system engineering testing of EPS',
u'Relation of user perceived response time to error measurement',
u'The generation of random binary unordered trees',
u'The intersection graph of paths in trees',
u'Graph minors IV Widths of trees and well quasi ordering',
u'Graph minors A survey']
from sklearn.feature_extraction.text import CountVectorizer
# compute vector space with sklearn
vect = CountVectorizer(min_df=1, ngram_range=(1, 1), max_features=25000)
corpus_vect = vect.fit_transform(documents)
# each doc is a scipy sparse matrix
print vect.vocabulary_
#{u'and': 1, u'minors': 20, u'generation': 9, u'testing': 32, u'iv': 15, u'engineering': 5, u'computer': 4, u'relation': 28, u'human': 11, u'measurement': 19, u'unordered': 37, u'binary': 3, u'abc': 0, u'for': 8, u'ordering': 23, u'graph': 10, u'system': 31, u'machine': 17, u'to': 35, u'quasi': 26, u'time': 34, u'random': 27, u'paths': 24, u'of': 21, u'trees': 36, u'applications': 2, u'management': 18, u'lab': 16, u'interface': 13, u'intersection': 14, u'response': 29, u'perceived': 25, u'in': 12, u'widths': 40, u'well': 39, u'eps': 6, u'survey': 30, u'error': 7, u'opinion': 22, u'the': 33, u'user': 38}
import gensim
# transform sparse matrix into gensim corpus
corpus_vect_gensim = gensim.matutils.Sparse2Corpus(corpus_vect, documents_columns=False)
lsi = gensim.models.LsiModel(corpus_vect_gensim, num_topics=4)
# I instead would like something like this line below
# lsi = gensim.models.LsiModel(corpus_vect_gensim, id2word=vect.vocabulary_, num_topics=2)
print lsi.print_topics(2)
#['0.622*"21" + 0.359*"31" + 0.256*"38" + 0.206*"29" + 0.206*"34" + 0.197*"36" + 0.170*"33" + 0.168*"1" + 0.158*"10" + 0.147*"4"', '0.399*"36" + 0.364*"10" + -0.295*"31" + 0.245*"20" + -0.226*"38" + 0.194*"26" + 0.194*"15" + 0.194*"39" + 0.194*"23" + 0.194*"40"']