查看原文
其他

BERTopic | 使用推特数据构建动态主题模型

大邓 大邓和他的Python
2024-09-09


在本文中将使用 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


精选文章

管理世界 | 使用文本分析词构建并测量短视主义

管理世界 | 使用 经营讨论与分析 测量 企业数字化指标

支持开票 | Python实证指标构建与文本分析

转载 | 社会计算驱动的社会科学研究方法

推荐 | 社科(经管)文本分析快速指南

视频分享 | 文本分析在经管研究中的应用

转载 | 金融学文本大数据挖掘方法与研究进展

FinBERT | 金融文本BERT模型,可情感分析、识别ESG和FLS类型

JM2022综述 | 黄金领域: 为营销研究(新洞察)采集网络数据

可视化 | 绘制《三体》人物关系网络图

资料 | 量化历史学与经济学研究

长期征稿 | 欢迎各位前来投稿

17G数据集 | 深交所企业社会责任报告

70G数据集 | 上市公司定期报告数据集

27G数据集 | 使用Python对27G招股说明书进行文本分析

数据集 | 90w条中国上市公司高管数据

可视化 | 绘制《三体》人物关系网络图

Maigret库 | 查询某用户名在各平台网站的使用情况

MS | 使用网络算法识别创新的颠覆性与否

认知的测量 | 向量距离vs语义投影

Asent库 | 英文文本数据情感分析

PNAS | 文本网络分析&文化桥梁Python代码实现

PNAS | 使用语义距离测量一个人的创新力(发散思维)得分

tomotopy | 速度最快的LDA主题模型

Wow~70G上市公司定期报告数据集

100min视频 | Python文本分析与会计

安装python包出现报错:Microsoft Visual 14.0 or greater is required. 怎么办?

如何正确读入文本数据不乱码(解决文本乱码问题)

Faker库 | 生成实验数据

继续滑动看下一个
大邓和他的Python
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存