Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有效地将LDA模型值提取到分布矩阵中_Python_Matrix_Gensim_Lda - Fatal编程技术网

Python 有效地将LDA模型值提取到分布矩阵中

Python 有效地将LDA模型值提取到分布矩阵中,python,matrix,gensim,lda,Python,Matrix,Gensim,Lda,我正在使用gensim创建文档主题模型分发。我有一个型号lda dictionary = corpora.Dictionary(data) corpus = [dictionary.doc2bow(doc) for doc in data] num_cores = multiprocessing.cpu_count() num_topics = 150 lda = LdaMulticore(corpus=corpus, num_topics=num_topics, id2word=diction

我正在使用gensim创建文档主题模型分发。我有一个型号
lda

dictionary = corpora.Dictionary(data)
corpus = [dictionary.doc2bow(doc) for doc in data]
num_cores = multiprocessing.cpu_count()
num_topics = 150
lda = LdaMulticore(corpus=corpus, num_topics=num_topics, id2word=dictionary, workers=num_cores, alpha=1e-4, eta=5e-1,
              minimum_probability=0.0)
我想提取一个大小为N*M的分布矩阵,其中N是语料库中文档的数量,M是主题的数量。因此,每一行代表一个文档,每一列代表一个主题。这些分布已在
lda
模型变量中可用,例如

lda
>>> [[(0,0.01),(1,0.23),(2,1e-7)],
    [(0,0.91),(1,0.067),(2,0.38)]]
如果我们有2个文档和3个主题(0,1,2),上面的例子就是一个简单的例子。因此,
lda
是一个元组列表,其中每个列表都是一个文档,元组中的第一个元素是主题id,第二个元素是对该文档的主题贡献

到目前为止我做了什么

# approach 1
distributions = np.array( [[tup[1] for tup in lst] for lst in lda[corpus]] )
# approach 2 (about 3X slower than approach 1)
distributions = np.array(lda[corpus])[:,:,1]
问题是,对于一个包含300k文档和150个主题的数据集,使用方法1创建
分发版
矩阵需要10分钟以上的时间

最后,我想创建这个矩阵,将其输入到计算文档相似性的函数中(将矩阵的第一行/文档与所有其他行/文档进行比较)。如果有一种方法可以直接将学习的
lda
模型值输入函数,那将非常好,因为这样可以节省创建冗余矩阵的时间。如果没有,是否有更有效的方法来创建
分布
矩阵

作为参考,将
分布
矩阵输入的文档比较函数

from sklearn.preprocessing import normalize
from scipy.stats import entropy
def jsd(mat):
    mat = normalize(mat, axis=1, norm='l1')
    p = mat[0,None].T # just comparing first row to all other rows
    q = mat[0:].T
    m = 0.5*(p + q)
    return 0.5*(entropy(p,m) + entropy(q,m))