长按图片识别二维码报名参与码云用户见面交流会
你对政治事件感兴趣吗? 你想玩转世界上最大的数据库之一吗? 如果你的回答是“是”,请往下阅读,相信你会对本文内容感兴趣!
本文承诺,接下来会使用 PHP 来操作 GDELT。
我会用一个简单例子来说明如何通过 BigQuery 和 PHP 来操作 GDELT,以及如何在网页上可视化结果等。
GDelt(“全球事件,语言和音调数据库”)是世界上最大的政治事件开放数据库。 它由 Kalev Leetaru(个人网站)根据 Philip A. Schrodt 和其他人在2011年的工作开发而来。数据可以通过 zip 文件下载,并且自2014年以来,可以在 Google 的 BigQuery 网络界面查询,并通过其 API 和 GDELT 分析提供服务。
GDELT 项目:
以超过100种语言来监测来自每个国家的几乎每个角落的广播,印刷和网络新闻,并且识别每分每秒推动全球社会的人,地点,组织,计数,主题,来源,情绪,报价,图像和事件,为整个世界创建一个免费开放的计算平台。
所有 GDELT 数据都由 BigQuery 提供。这个“大数据”数据库有一个 Web 接口,允许你查看表结构、预览数据,并支持使用自动提示功能进行查询的方式。
为在线体验 GDELT 数据集,你需要注册一个 Google 帐户,然后转至 BigQuery 信息中心。
如果你还没有 Google Cloud 项目,系统会提示您创建,因为此项目将是你的工作环境所必须的。
您可以通过“组合查询”创建自己的查询。 比如:
GDELT 允许你从其网站快速创建可视化数据。转到分析页面,创建选择,随后可视化数据的链接将会以邮件形式发送给你。
GDELT 近期开放了两个 API,你可从单个 URL 中创建自定义数据反馈。这些 F 反馈可以直接进入 CartoDB,并用于创建实时可视化数据。
你可以查询 GDELT 并使用工具创建可视化数据。应用示例参考:由 Kenneth Davis 制作的为难民献爱心的方案,他从GDELT 全局知识图 API 获取数据,并使用 CartoDB 可视化;由 CuriousGnu 制作的大家是如何看待希拉里·克林顿和唐纳德·特朗普,他通过将查询结果下载为 CSV 文件,之后将其导入 CartoDB 中。
为了使用 GDELT,你需要知道至少一些基本概念。 这些概念是由 Philip A. Schrodt 创建的,最终形成 CAMEO 本体论(用于冲突和中介事件观察)。
行动发起者(Actor )是参与事件的二者之一。Actor 可能是在一个国家范围内,也可能超出国家范围,如国际组织、运动或公司。Actor 编码包含一个或多个三字母缩写序列。例如,每个三元组指定一个 actor。 NGO=非政府组织,NGOHLHRCR(NGO HLH RCR)=非政府组织/卫生/红十字会。
事件的音调(Tone)是一个取值范围在 -100(负无穷)和 +100(正无穷)之间的分数。 最常见的值位于 -5 和 5 之间。
事件的戈德斯坦得分(Goldstein scale)是一个取值范围在 -10 和 +10 之间的分数值,其表征该类事件将对国家的稳定性可能产生的影响的大小。
包含所有 event 动词和 actor 类型码的完整 CAMEO Codebook 在此处查看。
在应用程式中使用BigQuery 存取 GDELT,必须用到 Google 的 Cloud Platform。
首先,你必须创建一个 Google 账户。然后,进入你的控制台,如果你还没有项目,系统会要求你创建一个。
检查控制台。点击左上角的汉堡菜单(带有三条水平线的图标),即可访问平台的所有部分。
使用项目,需前往 API 库并启用 BigQuery API。
接下来,你需要为项目创建服务帐户,并为此帐户指定 BigQuery User 以运行查询,稍后你可在 IAM 选项卡上更改权限。在“member”处,请选择你的服务帐户 ID。
服务帐户允许你创建一个密钥,这个密钥是 JSON 文件,下载并保存在安全的位置。在 PHP 代码中你会用到它。
最后,您需要为您项目设置结算帐户。虽然在1太字节内,GDELT 提供免费访问,谷歌也不会收取任何费用,但这是创建的必要步骤。
Google 帐户提供3个月的免费试用。如果你开始正式使用申请,需要提供银行卡或银行账户信息。
之前你可能是通过 Google APIs PHP 客户端访问 BigQuery,但现在的首选是适用于 PHP 的 Google Cloud 客户端库。
我们可以用 Composer 安装:
代码很简单,使用从 Google Cloud 控制台下载的项目密钥替换项目路径。
我们还可以查询元数据。先从列出项目的数据集开始(数据集是表的集合):
注意,在查询元数据之前,客户端配置时必须提供项目 ID(gdelt-bq)
这是代码的查询结果:
政治事件数据已存在好几年,2010 年综合危机预警系统(ICEWS)的出现是此数据的重要里程碑。
Philip A. Schrodt 写的 Automated Production of High-Volume, Near-Real-Time Political Event Data(自动产生大容量近实时性的政治事件数据),以一种十分幽默的方式对全球事件数据进行了回顾与评论。
新闻可以持续从大量资源中获取(如,非洲新闻,法新社,美联社,BBC监测处,基督教科学箴言报,美国合众国际新闻社,华盛顿邮报的新闻)。而数据则是从各种新闻资源收集而来。我们之前是用人工处理这个过程,现在我们可以用自然语言处理(NLP)技术来完成。
GDELT 1 采用 TABARI 的 C++ 库来解析新闻,并经编码后的数据存入数据库。TABARI 于1979年诞生,它使用一个基于模式的浅层解析器来解析文章,并可以进行命名实体识别。
这里有一个对 GDELT 早期的介绍,描述了新闻资源以及相关编程技术,作者是 LeetaruSc 和 Shrodt。
2015 年 2 月 GDELT 推出了 2.0 版。其中 TABARI 被 PETRARCH 库(语言为 Python)取代。GDELT 2.0 使用了斯坦福的 CoreNLP 解析器对文章进行翻译。(你可以从 Philip A. Schrodt’s slides 了解其改变原因。)GDELT 还通过全球知识图对事件数据进行了扩展。
2015 年 9 月,Internet Archive(互联网档案馆)和 Hathi Trust 数字图书馆的数据被合并进了 GDELT BigQuery 数据库。
在 GDELT 项目网站的这个页面上有相关数据集的概述。
数据集像这样被分组:
GDELT 数据集(1 或 2)表和字段的文档请在 GDELT 项目网站上的文档部分查看 。
文档的表和互联网档案字段,还有 HathiTrust Book 文档可在 互联网档案 和 HathiTrust 的页面 上找到。
超过 1TB 的部分,谷歌按照 5 美元/TB 收费。
每月处理在数据在1 Terabyte 范围内是免费的,我认为 1TB/月完全够用,因此我输入了自己的银行帐户信息,并设置了几个简单的查询。
一个星期后进入了下一个月,我收到来自 Google Cloud 的消息:
“我们很快将会自动从您的银行账户中计费”
我被要求支付 10.96 欧元!这到底是怎么回事? 这时我仔细看了下定价策略。
Google Cloud 的定价页面解释得很清楚。在查询 GDELT 的 Context 时,用户不需要为加载、复制和导出数据付费,也不需要支付元数据操作的费用(例如,列出现有表),但需支付查询费用。 准确来说:
查询定价是指执行 SQL 命令和用户定义函数的价格。BigQuery 通过使用统一标准为查询计费:实际处理的字节数。
它与查询的大小和结果集的大小无关,而与 BigQuery 实际处理的数据大小有关。看看我的结算信息列表,我意识到 Google 向我收费是因为:
BigQuery 已为我的查询处理了 3541Gibibytes 数据!除以 1024,它转换为 3,45812207TB。去除第一个免费 TB,再转换为欧元(当时的利率= 0.892),我最终需要付费 10.96 欧,而我计算出上面提到的单个 GDELT 示例查询(带有子查询的查询)的成本是 2.20 美元。
希望你没有被这个结果吓到。你也可以创建不占存储空间的实用查询:先缓存结果,然后手工处理查询。为了响应查询,在结果行旁边,BigQuery 提供了“totalBytesProcessed”的信息。 从这里,我们可以以美元为标准计算其成本:
BigQuery 每次加载一整列数据,仅读取一个记录。 例如,我运行:
在关系数据库中,这是一个快速的查询,它使用 GLOBALEVENTID 上的索引来查找和返回单个记录。在 BigQuery 中,它会加载全部的 3.02GB 的数据列,并需要几秒钟才能完成,因为BigQuery 不使用索引。每当它需要一个列时,它会读取整列数据。当列非常大时,它会将查询分担到多个机器上,这些机器通过并行运行完成查询。BigQuery 未针对小型表进行优化,但它可以在几秒钟内完成对 PB 级数据的查询。
如需深入了解 BigQuery 架构,请阅读本文或者参考这本关于 Google BigQuery 分析的书籍。
当我写这篇文章时,我想到了 GDELT 的脚本方法可能带来的附加价值。事实上,我认为我们完全可以控制查询和可视化!举个简单例子,我决定创建一个过去两天已经报道的所有战斗的图表。
GDELT 帮助你创建没有 API 的漂亮的可视化图形。但是,网站向我们展示了他们使用了什么工具。 然后,我们可以使用相同的工具自己创建图形。
我选择了热图,因为它很好地表达了我的意图。 在“输出”部分,它使用了 heatmap.js 在 Google 地图上生成叠加层。 我将 heatmap.jsin 中的代码复制到我的项目中,并根据我的需要进行了调整。
使用 Google 地图需要使用 API 密钥。 你可以在这里得到一个。
我在 Github 上放置了 GDELT 战斗热图示例的代码。
该查询选择在现在和两天前添加的所有“战争”事件(190系列事件代码)的地理坐标,并且通过地理坐标对它们进行分组。 它只需要原事件,然后过滤出相关的信息。 我还添加了 SOURCEURL 到我的选项。 我可以用它在地图上创建可点击标记,以更深的缩放级别显示,这样您就可以访问事件的源文章。
我发现许多事件仍然不是真正与我的想法有关,所以要做到这一点,我不得不调整我的查询。 此外,许多文章报道相同的事件,我只选择其中一个,让其在地图上显示。
至于成本,此示例查询只需要处理几个 GB 即可。 因为缓存的限制,它每天最多执行一次。 这样,它会保持在 1TB 的范围内!
使用 GDELT 提供的数据需注意:
GDELT 涵盖的内容十分丰富。在这篇文章中,我仅介绍其基本概念,项目和工具,另附带了相关的示例。对 GDELT 领域感兴趣的朋友,希望这篇文章能对你有所帮助。
文章所有代码示例可以在相应的 Github 库中找到。
文中涉及到较多的链接和代码,请点击“阅读原文”获取。