你对政治事件感兴趣吗? 你想玩转世界上最大的数据库之一吗? 如果你的回答是“是”,请往下阅读,相信你会对本文内容感兴趣!
本文承诺,接下来会使用 PHP 来操作 GDELT。
我会用一个简单例子来说明如何通过 BigQuery 和 PHP 来操作 GDELT,以及如何在网页上可视化结果等。
GDELT
GDelt(“全球事件,语言和音调数据库”)是世界上最大的政治事件开放数据库。 它由 Kalev Leetaru(个人网站)根据 Philip A. Schrodt 和其他人在2011年的工作开发而来。数据可以通过 zip 文件下载,并且自2014年以来,可以在 Google 的 BigQuery 网络界面查询,并通过其 API 和 GDELT 分析提供服务。
GDELT 项目:
以超过100种语言来监测来自每个国家的几乎每个角落的广播,印刷和网络新闻,并且识别每分每秒推动全球社会的人,地点,组织,计数,主题,来源,情绪,报价,图像和事件,为整个世界创建一个免费开放的计算平台。
在线测验
所有 GDELT 数据都由 BigQuery 提供。这个“大数据”数据库有一个 Web 接口,允许你查看表结构、预览数据,并支持使用自动提示功能进行查询的方式。
为在线体验 GDELT 数据集,你需要注册一个 Google 帐户,然后转至 BigQuery 信息中心。
如果你还没有 Google Cloud 项目,系统会提示您创建,因为此项目将是你的工作环境所必须的。
您可以通过“组合查询”创建自己的查询。 比如:
SELECT EventCode, Actor1Name, Actor2Name, SOURCEURL, SqlDate
FROM [gdelt-bq:gdeltv2.events]
WHERE Year = 2016
LIMIT 20
GDELT 工具和 APIs
GDELT 允许你从其网站快速创建可视化数据。转到分析页面,创建选择,随后可视化数据的链接将会以邮件形式发送给你。
GDELT 近期开放了两个 API,你可从单个 URL 中创建自定义数据反馈。这些 F 反馈可以直接进入 CartoDB,并用于创建实时可视化数据。
-
GKG GeoJSON 创建知识图的反馈(tutorial 教程)
-
全文搜索API 是基于过去24小时的新闻报道的反馈
你可以查询 GDELT 并使用工具创建可视化数据。应用示例参考:由 Kenneth Davis 制作的为难民献爱心的方案,他从 GDELT 全局知识图 API 获取数据,并使用 CartoDB 可视化;由 CuriousGnu 制作的大家是如何看待希拉里·克林顿和唐纳德·特朗普,他通过将查询结果下载为 CSV 文件,之后将其导入 CartoDB 中。
概念: CAMEO 的本体论
为了使用 GDELT,你需要知道至少一些基本概念。 这些概念是由 Philip A. Schrodt 创建的,最终形成 CAMEO 本体论(用于冲突和中介事件观察)。
-
事件(Event)是两个团体间的政治互动。其事件代码描述了事件类型,例如,1411:“因领导变动而示威游行或集会”。
-
行动发起者(Actor )是参与事件的二者之一。Actor 可能是在一个国家范围内,也可能超出国家范围,如国际组织、运动或公司。Actor 编码包含一个或多个三字母缩写序列。例如,每个三元组指定一个 actor。 NGO=非政府组织,NGOHLHRCR(NGO HLH RCR)=非政府组织/卫生/红十字会。
-
事件的音调(Tone)是一个取值范围在 -100(负无穷)和 +100(正无穷)之间的分数。 最常见的值位于 -5 和 5 之间。
-
事件的戈德斯坦得分(Goldstein scale)是一个取值范围在 -10 和 +10 之间的分数值,其表征该类事件将对国家的稳定性可能产生的影响的大小。
包含所有 event 动词和 actor 类型码的完整 CAMEO Codebook 在此处查看。
创建 BigQuery 账号
在应用程式中使用BigQuery 存取 GDELT,必须用到 Google 的 Cloud Platform。
首先,你必须创建一个 Google 账户。然后,进入你的控制台,如果你还没有项目,系统会要求你创建一个。
检查控制台。点击左上角的汉堡菜单(带有三条水平线的图标),即可访问平台的所有部分。
使用项目,需前往 API 库并启用 BigQuery API。
接下来,你需要为项目创建服务帐户,并为此帐户指定 BigQuery User 以运行查询,稍后你可在 IAM 选项卡上更改权限。在“member”处,请选择你的服务帐户 ID。
服务帐户允许你创建一个密钥,这个密钥是 JSON 文件,下载并保存在安全的位置。在 PHP 代码中你会用到它。
最后,您需要为您项目设置结算帐户。虽然在1太字节内,GDELT 提供免费访问,谷歌也不会收取任何费用,但这是创建的必要步骤。
Google 帐户提供3个月的免费试用。如果你开始正式使用申请,需要提供银行卡或银行账户信息。
使用 PHP 访问数据
之前你可能是通过 Google APIs PHP 客户端访问 BigQuery,但现在的首选是适用于 PHP 的 Google Cloud 客户端库。
我们可以用 Composer 安装:
composer require google/cloud
代码很简单,使用从 Google Cloud 控制台下载的项目密钥替换项目路径。
use Google\Cloud\BigQuery\BigQueryClient;
// setup Composer autoloading
require_once __DIR__ . '/vendor/autoload.php';
$sql = "SELECT theme, COUNT(*) as count
FROM (
select SPLIT(V2Themes,';') theme
from [gdelt-bq:gdeltv2.gkg]
where DATE>20150302000000 and DATE < 20150304000000 and AllNames like '%Netanyahu%' and TranslationInfo like '%srclc:heb%'
)
group by theme
ORDER BY 2 DESC
LIMIT 300
";
$bigQuery = new BigQueryClient([
'keyFilePath' => __DIR__ . '/path/to/your/google/cloud/account/key.json',
]);
// Run a query and inspect the results.
$queryResults = $bigQuery->runQuery($sql);
foreach ($queryResults->rows() as $row) {
print_r($row);
}
浏览数据集(Datasets)
我们还可以查询元数据。先从列出项目的数据集开始(数据集是表的集合):
$bigQuery = new BigQueryClient([
'keyFilePath' => '/path/to/your/google/cloud/account/key.json',
'projectId' => 'gdelt-bq'
]);
/** @var Dataset[] $datasets */
$datasets = $bigQuery->datasets();
$names = array();
foreach ($datasets as $dataset) {
$names[] = $dataset->id();
}
print_r($names);
注意,在查询元数据之前,客户端配置时必须提供项目 ID(gdelt-bq)
这是代码的查询结果:
Array
(
[0] => extra
[1] => full
[2] => gdeltv2
[3] => gdeltv2_ngrams
[4] => hathitrustbooks
[5] => internetarchivebooks
[6] => sample_views
)
历史
政治事件数据已存在好几年,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 项目网站的这个页面上有相关数据集的概述。
数据集像这样被分组:
-
GDELT 2 的数据集: gdeltv2 和 gdeltv2_ngrams
-
Hathi Trust Book 数据集: hathitrustbooks
-
互联网档案(Internet Archive)数据集: internetarchivebooks,此链接展示了从互联网档案的书本数据上查询的例子。
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 实际分析数据量: 3541.117 Gibibytes
BigQuery 已为我的查询处理了 3541Gibibytes 数据!除以 1024,它转换为 3,45812207TB。去除第一个免费 TB,再转换为欧元(当时的利率= 0.892),我最终需要付费 10.96 欧,而我计算出上面提到的单个 GDELT 示例查询(带有子查询的查询)的成本是 2.20 美元。
希望你没有被这个结果吓到。你也可以创建不占存储空间的实用查询:先缓存结果,然后手工处理查询。为了响应查询,在结果行旁边,BigQuery 提供了“totalBytesProcessed”的信息。 从这里,我们可以以美元为标准计算其成本:
$results = $bigQuery->runQuery($sql);
$info = $results->info();
$tb = ($info['totalBytesProcessed'] / Constants::BYTES_PER_TEBIBYTE); // 1099511627776
$cost = $tb * Constants::DOLLARS_PER_TEBIBYTE; // 5
在 BigQuery 中查询
BigQuery 每次加载一整列数据,仅读取一个记录。 例如,我运行:
SELECT Actor1Name
FROM [gdelt-bq:gdeltv2.events]
WHERE GLOBALEVENTID = 526870433
在关系数据库中,这是一个快速的查询,它使用 GLOBALEVENTID 上的索引来查找和返回单个记录。在 BigQuery 中,它会加载全部的 3.02GB 的数据列,并需要几秒钟才能完成,因为BigQuery 不使用索引。每当它需要一个列时,它会读取整列数据。当列非常大时,它会将查询分担到多个机器上,这些机器通过并行运行完成查询。BigQuery 未针对小型表进行优化,但它可以在几秒钟内完成对 PB 级数据的查询。
如需深入了解 BigQuery 架构,请阅读本文或者参考这本关于 Google BigQuery 分析的书籍。
本文标题:使用 GDELT 2 和 PHP 来分析世界!
本文地址:https://www.oschina.net/translate/using-gdelt-2-with-php-to-analyze-the-world
参与翻译:Tocy, snake_007, 芝麻糖人, 无若, 榆木可期