使用tmtoolkit计算语料库主题一致性时遭遇TypeError: 'FakedGensimDict'对象不可迭代问题求助
解决
TypeError: argument of type 'FakedGensimDict' is not iterable错误:LDA主题一致性计算代码修正 我来帮你修正这段代码,这个错误主要是因为tmtoolkit的metric_coherence_gensim函数在处理scikit-learn格式的文档-词矩阵(DTM)时出现了格式不兼容的问题,另外代码里还有几个小细节需要调整:
错误分析
FakedGensimDict是tmtoolkit内部用来模拟gensim字典结构的类,当函数试图迭代这个对象时出错,大概率是因为传入的dtm参数格式不符合预期——你传入的是scikit-learn的稀疏矩阵,而该函数在处理非gensim格式的DTM时出现了适配问题。同时,你的代码还有几个潜在问题:
- 缺少
LatentDirichletAllocation的导入语句 - LDA的
components_是主题-词的权重矩阵,需要归一化为概率分布(每行和为1)才能被一致性函数正确识别 - 重复调用
cv.fit_transform(norm_corpus)会重新拟合CountVectorizer,可能导致词汇表和之前的cv_matrix不一致
修正后的完整代码
import tmtoolkit import numpy as np from sklearn.decomposition import LatentDirichletAllocation # 补充缺失的导入 from tmtoolkit.topicmod.evaluate import metric_coherence_gensim def topic_model_coherence_generator(topic_num_start=2, topic_num_end=6, norm_corpus='', cv_matrix='', cv=''): norm_corpus_tokens = [doc.split() for doc in norm_corpus] models = [] coherence_scores = [] for i in range(topic_num_start, topic_num_end + 1): # 修正range,确保包含topic_num_end print(f"Training LDA with {i} topics...") cur_lda = LatentDirichletAllocation(n_components=i, max_iter=10000, random_state=0) cur_lda.fit(cv_matrix) # 只fit,不需要返回转换后的矩阵,节省内存 # 将LDA components归一化为概率分布(每行和为1) topic_word_probs = cur_lda.components_ / cur_lda.components_.sum(axis=1, keepdims=True) cur_coherence_score = metric_coherence_gensim( measure='c_v', top_n=5, topic_word_distrib=topic_word_probs, # 去掉dtm参数,改用texts和vocab来计算c_v指标 vocab=np.array(cv.get_feature_names()), texts=norm_corpus_tokens) models.append(cur_lda) coherence_scores.append(np.mean(cur_coherence_score)) return models, coherence_scores %%time ts = 2 te = 10 models, coherence_scores = topic_model_coherence_generator( ts, te, norm_corpus=norm_corpus, cv=cv, cv_matrix=cv_matrix)
关键修改点说明
- 补充缺失的导入:添加上
from sklearn.decomposition import LatentDirichletAllocation,否则代码会找不到该类。 - 归一化主题-词分布:将
cur_lda.components_转换为概率分布,因为metric_coherence_gensim期望输入的是每个主题下词的概率,而不是原始权重。 - 移除
dtm参数:对于c_v一致性指标,只需要vocab和texts参数即可完成计算,这样可以避免scikit-learn DTM和gensim格式不兼容的问题。 - 修正循环范围:原代码的
range(topic_num_start, topic_num_end)会排除topic_num_end,改为range(topic_num_start, topic_num_end + 1)可以确保训练到指定的最大主题数。 - 优化LDA拟合:只调用
cur_lda.fit(cv_matrix)而不是fit_transform,因为我们不需要文档-主题矩阵,节省内存开销。
这样修改后,代码应该可以正常运行并计算每个主题数的一致性得分了。
内容的提问来源于stack exchange,提问作者mohammad abufadda
相关产品推荐
相关产品推荐

