将 ppmi 矩阵传递给 LsiModel 时除以 0 错误

division by 0 error when passing my ppmi matrix to LsiModels

提问人:la_lo_ca 提问时间:8/7/2023 更新时间:8/7/2023 访问量:25

问:

我使用 gensim 的 pmi_scorer 和一个巨大的语料库构建了一个 ppmi 矩阵。每一行都作为单个文档读入和处理。为了避免内存过载,我使用 dtype=int16 创建所有矩阵。

我使用 sparse2corpus 将我的 ppmi 矩阵输入到 LsiModel 中。当我使用 LsiModel 运行 svd 时,出现以下错误。

lsimodel.py:102:RuntimeWarning:除法
rel_spectrum遇到无效值 = np.abs(1.0 - np.cumsum(s / np.sum(s)))

错误消息出现在较大的模型上,但不会出现在(系数 1000)较小的模型上,所以我认为这与语料库大小无关。

我的代码如下。首先,我通过计算共现矩阵来创建一个共现矩阵,然后将其转换为稀疏矩阵。 然后,我使用 gensim (p)pmi 评分器计算稀疏共生矩阵的 PPMI 分数:

    ppmi_matrix = sp.lil_matrix(cooc_matrix.shape, dtype=np.int16)
    for i, j, v in zip(cooc_matrix.row, cooc_matrix.col, cooc_matrix.data):
        worda_count = vocab_df.iloc[i, 0]
        wordb_count = vocab_df.iloc[j, 0]
        ppmi_score = ppmi_scorer(worda_count, wordb_count, v, len_vocab, min_count, corpus_word_count)
        ppmi_matrix[i, j] = ppmi_score
        ppmi_matrix[j, i] = ppmi_score

    del cooc_matrix
    # Convert the sparse matrix to a Gensim-compatible corpus
    corpus_sparse = Sparse2Corpus(ppmi_matrix)
    
    del ppmi_matrix

    # FINAL STEP: SVD
    id2word = dict(enumerate(vocab_df.index.tolist()))
    model = LsiModel(corpus_sparse, id2word=id2word, num_topics=vector_size)
    
    del corpus_sparse

尝试使用其他软件包/方法执行 svd 是否有意义? 如果数据集太小,似乎 LsiModel 有时会引发此错误(但我得到了较大语料库而不是较小语料库的错误)。也许有人遇到过类似的问题,并找到了解决这个问题的方法?

蟒蛇 gensim svd

评论


答: 暂无答案