如何在R的stm包中输出准确的主题占比数据?
获取主题占比并生成表格的解决方案
针对BERTopic的实现示例
如果你用BERTopic做主题建模,可直接通过模型内置属性提取主题占比和高频词:
import pandas as pd from bertopic import BERTopic # 假设已训练好的模型为topic_model topic_model = BERTopic.load("your_trained_model") # 获取各主题的文档数量 topic_sizes = topic_model.get_topic_sizes() topic_df = pd.DataFrame(topic_sizes.items(), columns=["主题标签", "文档数量"]) # 计算主题占比百分比 total_docs = topic_df["文档数量"].sum() topic_df["主题占比(%)"] = round((topic_df["文档数量"] / total_docs) * 100, 2) # 获取每个主题的高频词(取前5个为例) topic_info = topic_model.get_topic_info() topic_info["高频词"] = topic_info["Representation"].apply(lambda x: ", ".join(x[:5])) # 合并并整理最终表格 final_table = pd.merge(topic_df, topic_info[["Topic", "高频词"]], left_on="主题标签", right_on="Topic") final_table = final_table[["主题标签", "主题占比(%)", "高频词"]] # 输出表格 print(final_table) # 保存为CSV文件 final_table.to_csv("主题汇总表.csv", index=False, encoding="utf-8-sig")
针对Gensim LDA的实现示例
如果用Gensim的LDA模型,需从文档-主题分布中统计占比:
import pandas as pd from gensim.models import LdaModel # 假设已训练好的LDA模型为lda_model,训练语料为corpus lda_model = LdaModel.load("your_lda_model") corpus = ... # 你的训练语料 # 统计每个文档的主导主题 dominant_topics = [] for doc in corpus: # 取概率最高的主题作为文档的主导主题 topic_probs = sorted(doc, key=lambda x: -x[1]) dominant_topics.append(topic_probs[0][0]) # 计算各主题的文档数量与占比 topic_counts = pd.Series(dominant_topics).value_counts().sort_index() topic_df = pd.DataFrame({ "主题标签": topic_counts.index, "文档数量": topic_counts.values }) total_docs = len(corpus) topic_df["主题占比(%)"] = round((topic_df["文档数量"] / total_docs) * 100, 2) # 获取每个主题的高频词(取前5个为例) topic_terms = [] for topic_id in range(lda_model.num_topics): terms = lda_model.show_topic(topic_id, topn=5) topic_terms.append(", ".join([term for term, prob in terms])) topic_df["高频词"] = topic_terms # 输出表格 print(topic_df) # 保存为CSV文件 topic_df.to_csv("主题汇总表.csv", index=False, encoding="utf-8-sig")
关键说明
- 主题占比的核心逻辑是统计每个主题对应的文档数量,再除以总文档数得到百分比;
- 高频词可通过调整
topn参数,按需获取不同数量的关键词; - 若使用其他建模工具,只需提取主题与文档的映射关系,即可用类似逻辑计算占比。
内容的提问来源于stack exchange,提问作者Hank Zuo
相关产品推荐
相关产品推荐

