如何将BERTopic主题建模结果转换为指定格式的DataFrame?
生成两种格式的主题关键词DataFrame
假设你已经获取了主题与对应关键词的映射数据(比如从BERTopic/KeyBERT返回结果转换而来),以下是用Pandas实现两种格式DataFrame的代码:
1. 长格式DataFrame(类别+实体列)
这种格式将每个关键词与所属主题一一对应,适合后续统计或关联分析:
import pandas as pd # 示例主题-关键词映射(替换为你的实际数据) topic_keywords = { "人工智能应用": ["机器学习", "深度学习", "自然语言处理"], "数据分析工具": ["Python", "Pandas", "SQL"], "云计算技术": ["AWS", "阿里云", "容器化"] } # 构建长格式数据列表 long_format_data = [] for topic_name, keywords in topic_keywords.items(): for keyword in keywords: long_format_data.append({ "类别(主题名)": topic_name, "实体(主题关键词)": keyword }) # 生成DataFrame long_df = pd.DataFrame(long_format_data) print(long_df)
输出示例:
类别(主题名) 实体(主题关键词) 0 人工智能应用 机器学习 1 人工智能应用 深度学习 2 人工智能应用 自然语言处理 3 数据分析工具 Python 4 数据分析工具 Pandas 5 数据分析工具 SQL 6 云计算技术 AWS 7 云计算技术 阿里云 8 云计算技术 容器化
2. 宽格式DataFrame(主题为列,关键词为行)
这种格式将每个主题作为列,每行对应同一位置的关键词(关键词数量不足时自动补NaN):
# 计算所有主题的关键词最大长度,用于对齐行 max_keyword_count = max(len(kw_list) for kw_list in topic_keywords.values()) # 构建宽格式数据字典 wide_format_data = {} for topic_name, keywords in topic_keywords.items(): # 补全空值到最大长度,保证列长度一致 wide_format_data[topic_name] = keywords + [None] * (max_keyword_count - len(keywords)) # 生成DataFrame,行索引设为关键词位置 wide_df = pd.DataFrame( wide_format_data, index=[f"关键词{i+1}" for i in range(max_keyword_count)] ) print(wide_df)
输出示例:
人工智能应用 数据分析工具 云计算技术 关键词1 机器学习 Python AWS 关键词2 深度学习 Pandas 阿里云 关键词3 自然语言处理 SQL 容器化
适配BERTopic/KeyBERT原始输出
如果你的数据直接来自BERTopic,可先将模型输出转换为主题-关键词字典:
# 假设topic_model是训练好的BERTopic模型 topics = topic_model.get_topics() # 提取每个主题的前N个关键词(此处取前5个),排除噪声主题(topic_id=-1) topic_keywords = { f"主题{topic_id}": [word for word, _ in keywords[:5]] for topic_id, keywords in topics.items() if topic_id != -1 }
内容的提问来源于stack exchange,提问作者xavi
相关产品推荐
相关产品推荐

