使用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
相关产品推荐
相关产品推荐

