查看原文
其他

【开源情报】Twitter 上的地理围栏搜索:详细说明南亚 Covid 危机的案例研究

Twitter 可以成为开源研究的宝贵信息来源,无论是在个人用户层面,还是在了解更广泛的趋势方面。在最近的 Bellingcat故事中,调查技术团队查看了 Twitter 数据中的模式,以显示印度冠状病毒危机升级的严重程度和速度。


虽然 Twitter 是社交媒体分析的常见数据源,因为它默认公开发布且研究人员易于访问,但一个限制是地理位置数据的相对稀缺性。今天,很少有推文包含精确的地理数据,必须由用户手动添加。但是,Twitter 提供了另一种查找推文位置的方法:地理编码搜索。


通过使用许多地理编码查询的结果,Bellingcat 能够绘制出在印度及其南亚邻国寻求紧急援助的推文地理分布的近似地图,其中许多国家正在经历自己的冠状病毒危机。还映射了这些使用关键字“氧气”的推文的百分比,这可能与医疗氧气短缺有关。

本故事的其余部分详细介绍了用于收集此数据的方法,以及可改编用于其他项目的源代码。在收集这些数据的过程中,我们注意到了 Twitter 搜索结果中的几个特点,并在下面进行了记录。因此,对这些数据的细粒度解释存在一些警告。地理位置不准确,旧推文的数量已经估计。估计数据不应直接与非估计数据进行比较。此外,正如我们在四月份的故事中所指出的,鉴于该地区使用的社交媒体平台和语言种类繁多,英语 Twitter 帖子本质上是一个有限且有偏差的样本。但首先,了解如何通过位置找到和收集 Twitter 帖子很重要。 


地理参考推文

一些推文包含可使用 Twitter API 检索的精确纬度和经度信息。虽然 API 密钥是使用 Twitter API 所必需的,但通过Twitter 开发人员门户申请即可轻松获得。但是,这仅包括用户明确选择添加到推文中的地理数据,并且此功能的受欢迎程度已经减弱。地理编码搜索允许 Twitter 用户从特定纬度和经度的指定距离内查找推文,并将查找不包含明确的经纬度信息的推文。


例如,查询“geocode:13.08,80.27,100km”(如下图所示)返回 Twitter 认为来自印度钦奈 100 公里范围内的推文,由坐标 13.08º N, 80.27º E 指定. 有关 Twitter 高级搜索运营商的完整列表,请参阅Igor Brigadir 维护的此文档。

地理编码查询的示例搜索结果

通过使用分布在一个区域的许多地理编码查询,可以通过推文的数量和推文内容的分布来近似特定主题或情况的地理分布图。例如,下图显示了 2021 年 4 月 25 日包含“帮助”或“紧急”一词的推文在印度和南亚邻近地区的分布情况。每个圆圈都以地理标记查询的位置为中心。

一张地图,显示带有地理标记的帖子,其中包含印度和邻国的“帮助”或“紧急”字样。

每个点的颜色显示这些帖子中包含关键字“氧气”的百分比。


该地图是通过使用 TWINT 和 Python 计算数百个经地理编码的 Twitter 搜索的搜索结果而创建的。使用 TWINT(一种获取 Twitter 数据的有用工具)可以快速获取数千甚至数百万条推文。TWINT 使用 Twitter 高级搜索 Web 界面,并自动将推文转换成易于分析的格式,如 CSV。有关安装说明和更多示例,请参阅TWINT Github 存储库。


由于 TWINT 不使用官方 Twitter API,它不需要 API 密钥或有速率限制,这使得自动运行多个位置的查询变得容易。这种方法也用于在本文开头创建可视化,下面进一步总结。Jupyter notebook 中也提供了源代码,这是一个用于编写 Python 脚本的交互式环境。


不过,首先要注意的是,这些数据的准确度取决于 Twitter 自己对每条推文位置的估计。此外,Twitter 的地理编码搜索功能如何确定与每条推文关联的位置并不完全透明。Bellingcat 的调查技术团队的实验和观察发现,这些数据似乎来自两个地方:带有 Twitter“地点”标签的推文和用户选择添加到其 Twitter 个人资料的位置。虽然其他地理信息来源(如用户的 IP 地址或浏览器跟踪数据)可能会被 Twitter 捕获并用于定向广告等目的,但这些信息似乎并未用于地理参考搜索。


重要的是,用户个人资料位置信息仅用于对最近一周(大约 7 到 8 天)的推文进行地理配准。这样做的结果是,最近的推文数量似乎比一周多前的要大得多。虽然最近的推文包含明确添加 Twitter “地点”标签的推文和不带地点标签的推文,但较旧的推文仅包含带有“地点”标签的推文。

虽然 TWINT 数据与 Twitter 高级搜索 Web 界面中手动显示的数据相同,但官方 Twitter API 略有不同。Bellingcat 将这些相互比较,以测试 Twitter 数据的变化。有几种不同的 Twitter API。我们使用了免费的标准 Twitter API (v1.1)和付费的高级 Twitter API。Twitter Premium Search API 返回两种类型的数据:与查询匹配的单个推文,来自“搜索端点”,以及在某个时间间隔内与查询匹配的推文数量,来自“计数端点”。


对于简单的 Twitter 搜索(即没有地理编码查询的搜索),TWINT 和 Twitter API 找到的推文数量非常匹配。但是,Twitter Premium Search API 计数端点返回的推文数量似乎比 TWINT 搜索略多。这在 Twitter 文档中被指定为预期行为,因为 API 可能会计算由于隐私设置或删除而不可见的推文。

对于经过地理编码的 Twitter 搜索,TWINT 返回最近一周的更多推文,但超出此时间范围的数量非常匹配。此外,Twitter Premium Search API 的搜索端点返回的所有推文都标有 Twitter 位置。这表明 Twitter 高级搜索 API 的地理编码搜索选项不使用 Twitter 个人资料位置信息,即使是最近的推文,与 Twitter 高级搜索不同。

应该可以只分析带有 Twitter 位置标记的推文,但不幸的是,TWINT 抓取这些数据的能力目前已被破坏。这意味着无法直接将旧卷与新卷进行比较。数据可视化 Jupyter notebook 中演示了粗略的乘法校正,但这应该被理解为非常近似。


这里还需要注意的是,Twitter Premium API 计数端点似乎将 1 到 5 条推文之间的任何值四舍五入为 5。零似乎被保留为零。

虽然最近一周的这种行为与高级搜索 API 搜索端点返回的推文匹配,但它与标准 Twitter API 的搜索端点不匹配。相反,通过此端点的推文计数接近 TWINT 返回的那些。但是,有些似乎丢失了。

使用多种不同方法获取推文数据的相同地理编码搜索的每小时推文数。

标准 Twitter API 搜索与 TWINT 返回的结果更加匹配。


对 TWINT 而非标准 API 捕获的推文进行粗略检查并没有发现任何明显的原因,它们被排除在外。在这种情况下,TWINT 不仅更易于使用,而且似乎可以检索更完整的数据集。


Jupyter notebook 中提供了详细说明这些观察结果的代码和数据。

Jupyter Notebook 的屏幕截图显示了如何获取和分析数据。

这个开源笔记本允许独立复制 Bellingcat 的观察结果。

构建推文和词频图

为了使用 Twitter 地理编码搜索功能来构建推文频率图,需要一个中心点的六边形网格。六边形包装是覆盖整个区域的最佳方式,相邻圆之间的重叠量最小。

虽然存在许多 用于生成六边形拼贴的,但在该项目中使用了 Uber 的H3库。它有一些不错的特性,包括球形瓷砖和大致相同大小的瓷砖。H3 Python 库包含用于查找在特定多边形内具有中心的所有图块的方法。在此示例中,使用了印度及其南亚邻国的粗略轮廓。

位于特定兴趣区域内的 H3 图块的地图(在本例中,印度及其邻国,由粗绿线表示。)


然而,由于 Twitter 只允许通过高级搜索进行循环查询,这些六边形必须转换为重叠的圆圈。使用每个瓦片的面积,也可以通过 H3 方便地获得,计算一个半径,用于近似覆盖它的圆。每个图块半径和中心都用于为每个单元格创建自定义搜索查询。例如,“ (紧急或帮助)AND 地理编码:22.089682313298564,81.20150766588854,69.85968148546738km”。因为每个圆圈都包含整个六边形单元格,所以在单元格边缘附近会有一些搜索查询重叠。这会导致地理准确性的小幅损失,但是,与 Twitter 开始时位置准确性的固有限制相比,这要小得多。


接下来,使用 TWINT 下载每个单元格搜索查询的搜索结果,并使用 Python 数据分析库“ pandas ”将这些推文按天分组并计算数量。由于某些单元格的人口比其他单元格多得多,因此通过计算基线/正常推文量(简单地说是整个时间范围内的平均值)对每个单元格进行归一化。


这个 Jupyter 笔记本包含源代码,它更详细地展示了如何完成,以及如何将数据导出为 CSV 文件,以用于进一步的可视化。

Jupyter 笔记本的屏幕截图显示了如何使用这种重复地理编码查询技术来构建可视化数据。

如前所述,Twitter 高级搜索处理最近一周的推文的方式有所不同。结果在每天发布的推文数量的时间序列中人为跳跃。没有直接的方法来弥补这一点。虽然使用官方 Twitter 搜索 API 进行搜索会返回更一致的数据(尽管推文数量较少),但它们不支持大于 40 公里的地理半径。

作为近似补偿,Bellingcat 使用不同时间点的搜索量差异来估计一周后推文“丢失”的比例。这实质上是对在其个人资料描述中具有有效位置的用户与使用位置标签的用户相比的百分比的估计。这种修正乘法因子产生的交易量估计值更接近最近一周的范围。然而,这个因素的方差非常大,因为它在很大程度上取决于特定地理区域内用户的发帖模式。这种乘法校正最多应该被认为是非常近似的估计。因此,“估计”数字不能直接与最近的数字进行比较。

然而(在某种程度上,每个样本都是随机的),推文内容的趋势,例如包含特定关键字的推文百分比,仍然可以在这个时间边界内进行比较。这使得我们可以检查关于氧气相关需求的推文如何从德里传播到印度,因为其他城市被围困,以及来自其他地方和国家的 Twitter 用户放大了德里的请求。来自邻国的推文较少提及氧气。

颜色表示包含氧气相关关键词的紧急推文比例。左图:2021 年 4 月 19 日的数据,显示勒克瑙和坎普尔附近的热点,以及德里日益严重的危机。中:4月26日,德里危机加剧。印度许多其他地区也看到与氧气相关的推文急剧增加,这可能是当地危机的结果,也可能是德里局势加剧的结果。右图:到 2021 年 5 月 4 日,有关德里氧气危机的推文有所减少。但是,一些热点,例如印多尔周围,仍然可见。单击或点按可放大图像。

尽管 Twitter API 施加了限制,但可以从推文中提取地理信息。虽然这些数据带有许多关于准确性和样本偏差的警告,但它仍然是通过社交媒体跟踪全球事件的有趣资源。

Bellingcat调查技术团队开发工具,开源的调查和探索技术为重点的研究技术。它由 Johanna Wild、Aiganysh Aidarbekova 和 Logan Williams 组成。

文章来源:Bellingcat

点击↓👇↓阅读原文↓👇↓可访问原文网页。


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

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