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

使用Gensim LSI模型为何得到不同长度的向量?

关于LSI向量长度不一致的原因与解决办法

这个问题我之前处理过,本质是Gensim的LSI模型返回的是稀疏向量格式,而非固定长度的稠密向量,才会出现这种维度偶尔少1的情况。

为什么会出现长度不一致?

Gensim的LsiModel处理文本后返回的vec_lsi是一个二元组列表,格式类似[(topic_id, weight), ...],它只会存储权重非零的主题维度。如果某段文本的LSI投影刚好在某一个主题上的权重为0,那这个维度就不会被包含在返回结果里,原本300个主题就变成了299个非零项,所以你看到的长度是299。

解决办法:转换为固定长度的稠密向量

要得到统一300维的向量,只需要把稀疏向量转换成稠密格式就行,Gensim自带了工具函数可以快速实现:

修改你生成向量的代码部分,用gensim.matutils.sparse2full把稀疏向量转成稠密数组:

from gensim import matutils

vectors = []
for n in lemmatized[:100]:
    vec_bow = dictionary.doc2bow(n)
    vec_lsi = lsi[vec_bow]
    # 转换为固定300维的稠密向量
    dense_vec = matutils.sparse2full(vec_lsi, num_terms=lsi.num_topics)
    vectors.append(dense_vec)
    print(len(dense_vec))  # 现在应该全是300了

如果你不想用Gensim的工具函数,也可以手动初始化一个全0数组,然后把非零项填充进去:

vectors = []
num_topics = 300
for n in lemmatized[:100]:
    vec_bow = dictionary.doc2bow(n)
    vec_lsi = lsi[vec_bow]
    dense_vec = [0.0] * num_topics
    for topic_id, weight in vec_lsi:
        dense_vec[topic_id] = weight
    vectors.append(dense_vec)
    print(len(dense_vec))

这样处理后,所有向量的长度都会严格等于你设置的num_topics=300,后续聚类操作就不会有维度不匹配的问题了。

内容的提问来源于stack exchange,提问作者Ignacio Francisco Fuentes San

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:38:20