如何将聚类算法应用于Tweepy提取的Twitter数据集,实现按小时划分推文/转推活动聚类
嗨,看来你已经成功用Tweepy拿到了Twitter数据集,想要按小时区间来聚类统计推文活动对吧?其实这个需求有两种实现思路——一种是直接按时间规则分组(因为你的聚类规则非常明确,固定小时区间,这种方式简单又高效,完全匹配你的需求),另一种是用聚类算法来实现(适合你上手学习聚类的原理)。下面一步步给你拆解:
第一步:数据预处理(用Pandas)
首先得把原始的日期时间字符串转换成程序能识别的datetime格式,这样才能提取小时信息。假设你的数据已经存在Pandas的DataFrame里,先做这一步:
import pandas as pd # 模拟你的数据集(实际中可以用read_csv等方法读取你的数据) tweets_df = pd.DataFrame([ {"推文内容": "NSW Demons - Watch Melbourne v Sydney tonight", "tweet ID": 1387339243786182657, "日期时间": "2021-05-08 05:55:30"}, {"推文内容": "Brown in and Harmes returns, Melb v Rich match", "tweet ID": 1387332484715581440, "日期时间": "2021-05-08 05:40:45"}, {"推文内容": "Kick-off is at 7:10 PM from the Docklands.", "tweet ID": 1385474911448096770, "日期时间": "2021-05-08 05:35:21"}, {"推文内容": "RT @melbournefc: Kicking with Choco.", "tweet ID": 1385474643541127168, "日期时间": "2021-05-08 05:30:15"} ]) # 将日期时间列转为datetime类型 tweets_df["日期时间"] = pd.to_datetime(tweets_df["日期时间"])
方式一:基于规则的“聚类”(最适合你的需求)
你的需求是把每个小时区间的推文归为一个聚类,比如1点-2点是聚类1,2点-3点是聚类2……这种固定规则的场景,完全不需要复杂的聚类算法,直接用Pandas提取小时并映射成聚类标签就可以:
# 提取每条推文的小时数(0代表0点-1点,1代表1点-2点……23代表23点-0点) tweets_df["小时"] = tweets_df["日期时间"].dt.hour # 生成聚类标签:按你的要求,1点-2点对应聚类1,所以给小时数+1(0点-1点对应聚类1,以此类推) # 如果你想让0点-1点对应聚类0,直接用tweets_df["小时"]即可 tweets_df["聚类标签"] = tweets_df["小时"] + 1 # 按聚类标签统计推文数量 cluster_activity = tweets_df.groupby("聚类标签").agg({"tweet ID": "count"}).rename(columns={"tweet ID": "推文数量"}) print(cluster_activity)
这种方式的优势是:逻辑清晰、运行速度快,完全贴合你预先定义的聚类规则,不需要担心聚类算法的随机性。
方式二:用聚类算法实现(适合学习聚类原理)
如果想真正上手聚类算法(比如K-Means),也可以实现这个需求。核心思路是把时间特征转换成数值,然后用K-Means分成24个聚类(对应24小时):
from sklearn.cluster import KMeans import numpy as np # 把小时数转换成K-Means需要的二维数组格式 X = tweets_df["小时"].values.reshape(-1, 1) # 初始化K-Means,设置24个聚类,固定random_state保证结果可复现 kmeans = KMeans(n_clusters=24, random_state=42) tweets_df["聚类标签"] = kmeans.fit_predict(X) # 注意:K-Means的聚类标签是随机分配的,需要把标签和实际小时区间对应起来 # 先获取每个聚类的中心值(接近对应的小时数) cluster_centers = kmeans.cluster_centers_.flatten() # 按中心值排序,得到聚类标签的对应顺序 sorted_cluster_indices = np.argsort(cluster_centers) # 创建映射:原来的随机标签 -> 按小时排序后的标签(比如0对应0点-1点,1对应1点-2点) cluster_mapping = {old_label: new_label + 1 for new_label, old_label in enumerate(sorted_cluster_indices)} tweets_df["聚类标签"] = tweets_df["聚类标签"].map(cluster_mapping) # 统计每个聚类的推文数量 cluster_activity = tweets_df.groupby("聚类标签").agg({"tweet ID": "count"}).rename(columns={"tweet ID": "推文数量"}) print(cluster_activity)
这种方式能让你直观理解聚类算法的工作流程,但因为你的需求是固定规则的小时划分,其实方式一更实用。
可选:可视化聚类结果
如果想把每小时的推文活动模式可视化,可以用Matplotlib画柱状图:
import matplotlib.pyplot as plt plt.figure(figsize=(12, 6)) cluster_activity.plot(kind="bar", ax=plt.gca(), color="#1DA1F2") plt.title("Twitter推文/转推小时活动统计") plt.xlabel("聚类标签(对应小时区间)") plt.ylabel("推文数量") plt.xticks(rotation=0) plt.grid(axis="y", linestyle="--", alpha=0.7) plt.show()
注意事项
- 确保日期时间格式正确:如果你的原始数据日期时间格式和示例不同,记得在
pd.to_datetime里用format参数指定,比如pd.to_datetime(tweets_df["日期时间"], format="%Y-%m-%d %H:%M:%S") - 统一时区:如果数据包含不同时区的推文,先转换成统一时区(比如UTC或当地时间),避免聚类结果出错。
内容的提问来源于stack exchange,提问作者Chirag atha
相关产品推荐
相关产品推荐

