5

我正在寻找一种方法来获取英语维基百科上的所有电影,以及它们的创建日期。对我来说,电影是一个附有 IMDB ID 的页面。所以,这是我到目前为止的查询:

SELECT DISTINCT ?item_label ?imdb_id  (year(?dateCreation) as ?AnneeCreation) WHERE {
      ?item wdt:P345 $imdb_id.
      filter STRSTARTS(?imdb_id,"tt")
  OPTIONAL{
    ?item wdt:P571 ?dateCreation.           
  }

      SERVICE wikibase:label { bd:serviceParam wikibase:language "en".}  
      ?article schema:about ?item ; schema:isPartOf <https://en.wikipedia.org/> ; schema:name ?item_label
    }

问题是大多数页面都没有 P571 属性,所以我想知道是否有更好的方法来获取创建日期?也许由于修订历史或其他原因,我找不到这样的选择。

任何帮助将不胜感激!

4

1 回答 1

2

因此,正如评论所指出的,Wikidata 属性(以及一些罕见的例子,如特色文章标志)描述了基本概念,而不是 Wikipedia 页面元数据。正如@AKSW 指出的那样,与维基百科 API 交谈的能力有限,但我的理解是,这对于大量文章来说效果不佳(注意示例代码中有 LIMIT 50)

然而,一切都没有丢失!我使用了一些横向思维,为最近在Wikipedia 上的 Gender and Deletion 上的大量文章制定了一种大规模执行此操作的方法。

第一步:找出你的维基数据查询。带有 tt 前缀的 IMDB 标签可能适用于电影以外的事物(例如电视剧集、体育广播),因此另一种方法可能是进行 P31/P279 类型/类搜索以查找所有“电影或电影子类”的事物. 您还需要添加一个明确表示“并且只有英文 Wikipedia 中的文章”的过滤器,我看到您已经完成了。请注意,这为您提供了 WP 文章的名称,而不是 Wikidata 项目的“标签”,这是不同的,因此您可以删除(耗时的)标签服务条款。你最终会得到类似https://w.wiki/FH4(这仍然使用 tt- 前缀方法并获得 180k 结果)或https://w.wiki/FH8(P31/P279 过滤器加上 tt- 前缀, 136k 结果)

运行此查询,将结果 TSV 保存在某处,然后继续执行第 2 步。我们将在此处使用的工具是PetScan,它旨在链接来自 Wikipedia 类别、Wikipedia 元数据、Wikidata 查询等的数据。

将 SPARQL 查询输入选项卡 4(“其他来源”)并在此选项卡底部说“使用 wiki:enwiki”。这将迫使它输出与此查询链接的维基百科文章的数据。

现在点击“做”,稍等片刻,(我测试它花了大约 100 秒)并检查结果。你会看到我们得到了标题(WP 文章)、页面 ID、命名空间(希望总是“(文章)”、以字节为单位的大小和最后接触的日期。这些都不是创建日期......

...除了其中一种是。PageID 是按顺序分配的,因此它们本质上是创建时间的时间戳。这里有一些关于边缘情况的细微差别 - 例如,如果我在 2010 年创建了一个名为“Example (film)”的重定向,并在 2015 年手动编辑该重定向以成为一篇名为“Example (film)”的真实文章,它将显示为创建于 2010 年。对于删除和重新创建的页面,或者具有复杂页面移动历史的页面,也可能会出现奇怪的结果(不过,直接的页面移动应该保留 ID)。但是,一般来说,对于 95% 的项目,pageID 将反映它在维基上首次创建的时间。例如,431900000 于2014 年 7 月 1 日上午 11 点 14 分创建;531900000 于2017 年 2 月 14 日下午 6 点 29 分创建;等等。

回到 PetScan - 让我们拉下所有这些项目。在 PetScan 中,转到最后一个选项卡并选择 TSV。重新运行搜索并保存结果文件。

现在,我们有一个带有 Wikidata ID、IMDB ID 和 WP 页面标题的 TSV(以及您想从 WD 查询中恢复的任何其他内容);我们还有另一个带有 WP 页面标题和页面 ID 的内容。您可以使用 WP 页面标题将它们链接在一起,让您从“Wikidata 中的结果”转到“页面 ID”。清理它们并按照您的喜好链接它们 - 我是在 bash 中完成的,您可能想要使用更明智的东西,例如 python。

现在您可以将 PageID 转换为创建日期。对于我所做的工作,我只对六个月的垃圾箱感兴趣,所以我只是计算出每年 1 月 1 日和 7 月 1 日创建的任意 pageID,并计算它们之间的 ID。您可以做同样的事情,或者使用 API 来查找各个 pageID 并返回创建时间戳——这完全取决于您想要获得的内容。

这一切都比仅仅使用查询服务要复杂一些,而且它“可能”会为一两篇历史复杂的文章提供虚假的结果,但它基本上会让你做你最初要求的事情。

于 2020-01-11T10:38:04.997 回答