You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算LDA生成的主题向量间的相似度?(Python实现)

简便计算LDA主题向量相似度的Python方案

嘿,既然你已经在用gensim和Python 3.6,完全不用手动写余弦相似度的实现——gensim本身就提供了现成的工具来搞定LDA主题向量的相似度计算,非常省心。下面分两种贴合你场景的方案来讲解:

场景1:你的LDA模型是用gensim直接训练的

如果你的5个主题是从gensim.models.LdaModel训练出来的模型里提取的,那事情就简单到离谱:

  • gensim的LDA模型自带主题向量的获取方法,还内置了余弦相似度计算工具。你只需要先拿到所有主题的权重矩阵,再调用现成方法计算即可。
  • 示例代码:
from gensim.models import LdaModel
from gensim.matutils import cossim

# 假设你已经训练好的LDA模型是lda_model
topic_matrix = lda_model.get_topics()  # 形状为(主题数, 词表大小),每一行是一个主题的权重向量

# 计算任意两个主题的相似度,比如主题0和主题1
similarity_score = cossim(topic_matrix[0], topic_matrix[1])
print(f"主题0与主题1的相似度:{similarity_score}")

# 生成所有主题两两之间的相似度矩阵
num_topics = 5
similarity_matrix = [[0.0 for _ in range(num_topics)] for _ in range(num_topics)]
for i in range(num_topics):
    for j in range(num_topics):
        similarity_matrix[i][j] = cossim(topic_matrix[i], topic_matrix[j])

# 打印结果
print("主题两两相似度矩阵:")
for row in similarity_matrix:
    print(row)

场景2:你已经手动提取了(词语,权重)形式的主题集合

如果你的主题是已经整理好的{(word, weight)}集合,只需要先把它们转换成gensim兼容的稀疏向量格式,再用同样的工具计算就行:

  • 第一步要先构建全局词表,给每个词分配唯一索引,保证所有主题向量的维度一致;第二步把每个主题转换成(索引,权重)的稀疏向量,之后就可以计算相似度了。
  • 示例代码:
from gensim.matutils import cossim
from collections import defaultdict

# 假设你的五个主题存储在topics列表里
topics = [topic_A, topic_B, topic_C, topic_D, topic_E]

# 构建全局词表,给每个词分配唯一索引
word_to_idx = defaultdict(int)
current_idx = 0
for topic in topics:
    for word, _ in topic:
        if word not in word_to_idx:
            word_to_idx[word] = current_idx
            current_idx += 1

# 将每个主题转换为gensim支持的稀疏向量格式
topic_vectors = []
for topic in topics:
    vec = [(word_to_idx[word], weight) for word, weight in topic]
    topic_vectors.append(vec)

# 计算主题0和主题1的相似度
similarity = cossim(topic_vectors[0], topic_vectors[1])
print(f"主题0与主题1的相似度:{similarity}")

# 生成两两相似度矩阵
num_topics = len(topic_vectors)
sim_matrix = [[0.0]*num_topics for _ in range(num_topics)]
for i in range(num_topics):
    for j in range(num_topics):
        sim_matrix[i][j] = cossim(topic_vectors[i], topic_vectors[j])

print("主题两两相似度矩阵:")
for row in sim_matrix:
    print(row)

备选方案:用scikit-learn计算

如果你也愿意尝试其他库,scikit-learn的cosine_similarity也很方便,只需要把主题向量转换成稠密数组即可:

from sklearn.metrics.pairwise import cosine_similarity
import numpy as np

# 承接上面的word_to_idx和topic_vectors,转换成稠密数组
dense_vectors = []
for vec in topic_vectors:
    dense = np.zeros(len(word_to_idx))
    for idx, weight in vec:
        dense[idx] = weight
    dense_vectors.append(dense.reshape(1, -1))

# 计算所有主题的两两相似度
sim_matrix = cosine_similarity(np.vstack(dense_vectors))
print("scikit-learn计算的相似度矩阵:")
print(sim_matrix)

总的来说,用gensim自带的工具是最贴合你现有技术栈的选择,不用自己手动实现余弦相似度的细节,避免出错。

内容的提问来源于stack exchange,提问作者amiref

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:21:13