其他
BERTopic | 使用推特数据构建动态主题模型
在本文中将使用 BERTopic 库,对美国前总统 Trump 推特数据集,构建 动态主题模型DTM(Dynamic Topic Modeling),可视化文档数据集中不同主题随时间的演变(变迁)。文末有代码数据可供下载。
安装
为保证代码可复现,保证你我电脑中 bertopic 版本一致,先查看大邓电脑的 bertopic版本
import bertopic
#本文bertopic版本
bertopic.__version__
Run
'0.12.0'
#推荐指定版本安装;
#!pip3 install bertopic==0.12.0
#不指定版本安装
!pip3 install bertopic
导入数据
这里准备了twitter账号 @realDonalTrump 中 2021年的推特数据, 点击下载 trump_twitter_2021.csv。
我们只分析原推特,不分析每条推特的回复。 因为要分析推特随时间的主题变化,需要准备 推特 及对应的 推文时间
import re
import pandas as pd
from datetime import datetime
# 导入数据
trump_df = pd.read_csv('trump_twitter_2021.csv')
trump_df.head()
Run
预处理
使用正则表达式 清除推文中的 http 链接 剔除 @ 符 使用正则表达式 剔除 非英文字符
import re
#预处理函数clean_text
def clean_text(text):
text = re.sub("http\S+", "", text).lower()
text = " ".join([w for w in text.split() if w[0]!='@'])
text = re.sub("[^a-zA-Z]+", " ", text).lower()
return text
test_text = 'hello @Apple, https://apple.com 李John'
#验证函数有效性
clean_text(text=test_text)
Run
'hello john'
对text字段使用预处理函数 clean_text 只保留原推文 准备推特 tweets 和时间戳 timestamps
#清洗字段text
trump_df['text'] = trump_df['text'].apply(clean_text)
#只保留特朗普原推文(剔除特朗普的Retweet)
#推文内容不能为”“
trump_df = trump_df.loc[(trump_df['isRetweet'] == "f") & (trump_df['text'] != ""), :]
#准备tweets及对应的timestamps
tweets = trump_df['text'].to_list()
timestamps = trump_df['date'].to_list()
tweets[0]
Run
'republicans and democrats have both created our economic problems '
初始化BERTopic
在模型初始化阶段,使用所有推文数据, 会忽略时间维度。该步骤会把所有时间段中出现的主题都提前训练识别出来。
from bertopic import BERTopic
#大邓这里,运行了不到1小时
#特朗普比较活跃,什么内容都会参与,所以这里设置一个话题数下限为35,话题数上限不设置
topic_model = BERTopic(min_topic_size=35, verbose=True)
topics, _ = topic_model.fit_transform(tweets)
Run
Downloading: 0%| | 0.00/1.18k [00:00<?, ?B/s]
Downloading: 0%| | 0.00/190 [00:00<?, ?B/s]
Downloading: 0%| | 0.00/10.6k [00:00<?, ?B/s]
Downloading: 0%| | 0.00/612 [00:00<?, ?B/s]
Downloading: 0%| | 0.00/116 [00:00<?, ?B/s]
Downloading: 0%| | 0.00/39.3k [00:00<?, ?B/s]
Downloading: 0%| | 0.00/349 [00:00<?, ?B/s]
Downloading: 0%| | 0.00/90.9M [00:00<?, ?B/s]
Downloading: 0%| | 0.00/53.0 [00:00<?, ?B/s]
Downloading: 0%| | 0.00/112 [00:00<?, ?B/s]
Downloading: 0%| | 0.00/466k [00:00<?, ?B/s]
Downloading: 0%| | 0.00/350 [00:00<?, ?B/s]
Downloading: 0%| | 0.00/13.2k [00:00<?, ?B/s]
Downloading: 0%| | 0.00/232k [00:00<?, ?B/s]
Batches: 0%| | 0/1418 [00:00<?, ?it/s]
2022-12-04 22:04:02,964 - BERTopic - Transformed documents to Embeddings
2022-12-04 22:05:13,606 - BERTopic - Reduced dimensionality
2022-12-04 22:05:17,814 - BERTopic - Clustered reduced embeddings
抽取出所有的话题
freq = topic_model.get_topic_info()
#话题总数
print(len(freq))
freq.head(10)
Run
169
-1 意识是所有的离群点(异类)推文,应该被忽略掉。接下来让我们看一下 Topic-4 的特征词及其权重
#topic-4的特征词及权重
topic_model.get_topic(4)
Run
[('china', 0.05289416225000891),
('tariffs', 0.024471004754487165),
('trade', 0.02437576425026641),
('chinese', 0.013643270667358017),
('us', 0.011206804363719649),
('farmers', 0.01113584970813823),
('our', 0.010197907480148342),
('deal', 0.010014612658730073),
('we', 0.009043537683534882),
('countries', 0.00901653033214627)]
在二维空间中使用 Intertopic Distance Map可视化所有主题。该图可以让我们继续创建 DTM 前,判断主题数设置的是否充分够用。
fig = topic_model.visualize_topics()
fig
Run
构建DTM
在 构建动态主题模型 前, 不同时间段中出现的主题需要预先都训练好。
docs 文档数据,对应于本文的 tweets timestamps 时间戳,对应于本文的 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
Run
可视化DTM
#模型中一共有169个主题,这里显示前Top10的主题的演变
topic_model.visualize_topics_over_time(topics_over_time, top_n_topics=10)
Run
代码下载
- 本文地址
https://hidadeng.github.io/blog/2022-12-03-dynamic_topic_model_with_bertopic/
- 代码下载地址
https://hidadeng.github.io/blog/2022-12-03-dynamic_topic_model_with_bertopic/code.zip
精选文章
FinBERT | 金融文本BERT模型,可情感分析、识别ESG和FLS类型
JM2022综述 | 黄金领域: 为营销研究(新洞察)采集网络数据
27G数据集 | 使用Python对27G招股说明书进行文本分析
PNAS | 使用语义距离测量一个人的创新力(发散思维)得分
安装python包出现报错:Microsoft Visual 14.0 or greater is required. 怎么办?