目录
动态主题模型
下载 BERTopic
数据处理
基本主题模型
随时间推移的主题
注意参数
docs
timestamps
global_tuning
evolution_tuning
nr_bins
随时间推移可视化主题
我们将使用动态主题建模和BERTopic来可视化特朗普推文中的主题如何随着时间的推移而演变。这些主题将被可视化和彻底探索。
动态主题模型
动态主题模型可用于分析文档集合的主题随时间推移的演变。
下载 BERTopic
%%capture
!pip install bertopic
数据处理
import re
import pandas as pd
from datetime import datetime# Load data
trump = pd.read_csv('https://drive.google.com/uc?export=download&id=1xRKHaP-QwACMydlDnyFPEaFdtskJuBa6')# Filter
trump.text = trump.apply(lambda row: re.sub(r"http\S+", "", row.text).lower(), 1)
trump.text = trump.apply(lambda row: " ".join(filter(lambda x:x[0]!="@", row.text.split())), 1)
trump.text = trump.apply(lambda row: " ".join(re.sub("[^a-zA-Z]+", " ", row.text).split()), 1)
trump = trump.loc[(trump.isRetweet == "f") & (trump.text != ""), :]
timestamps = trump.date.to_list()
tweets = trump.text.to_list()
tweets[0]
#republicans and democrats have both created our economic problems#
基本主题模型
要使用BERTopic执行动态主题建模,我们首先需要使用所有推文创建一个基本的主题模型。时间方面将被忽略,因为我们目前只对这些推文中的主题感兴趣。
from bertopic import BERTopic
topic_model = BERTopic(min_topic_size=35, verbose=True)
topics, _ = topic_model.fit_transform(tweets)
然后,我们可以提取最常见的主题:
freq = topic_model.get_topic_info(); freq.head(10)
-1 表示所有异常值,通常应忽略。接下来,让我们看一下生成的一个常见主题:
topic_model.get_topic(4)
我们可以可视化使用主题间距离图创建的基本主题。这使我们能够在随着时间的推移继续创建主题之前直观地判断基本主题是否足够。
fig = topic_model.visualize_topics(); fig
随时间推移的主题
在开始动态主题建模步骤之前,您对之前创建的主题感到满意非常重要。我们将使用这些特定主题作为动态主题建模的基础。
因此,此步骤将主要向您展示以前定义的主题如何随着时间的推移而演变。
注意参数
docs
这些是我们正在使用的推文
timestamps
每条推文/文档的时间戳
global_tuning
是否将主题在时间 t 处的主题表示与其全局主题表示形式求平均值
evolution_tuning
是否将主题在时间 t 处的主题表示与该主题在时间 t-1 的主题表示进行平均
nr_bins
要将时间戳放入的箱数。在数千个不同的时间戳中提取主题在计算上效率低下。因此,建议将此值保持在 20 以下。
topics_over_time = topic_model.topics_over_time(docs=tweets, timestamps=timestamps, global_tuning=True, evolution_tuning=True, nr_bins=20)
随时间推移可视化主题
创建topics_over_time后,我们将不得不可视化这些主题,因为随着时间维度的增加,访问它们变得更加困难。
为此,我们将根据主题的频率可视化主题随时间推移的分布。这样做可以让我们看到主题如何随着时间的推移而演变。确保将鼠标悬停在任何点上,以查看时间 t 处的主题表示形式与全局主题表示形式有何不同。
topic_model.visualize_topics_over_time(topics_over_time, top_n_topics=20)