使用 MapReduce 解析 Freebase RDF 转储
Posted
技术标签:
【中文标题】使用 MapReduce 解析 Freebase RDF 转储【英文标题】:Parse Freebase RDF dump with MapReduce 【发布时间】:2013-09-16 04:55:13 【问题描述】:我从 Freebase 下载了 rdf 数据转储,我需要提取的是 Freebase 中每个实体的英文名称。
我是否必须使用 Hadoop 和 MapReduce 来执行此操作,如果需要,如何操作?还是有其他方法可以提取实体名称?
如果每个实体标题/名称都在 .txt 文件中的单独行中,那就太好了
【问题讨论】:
【参考方案1】:您可以使用 Hadoop,但对于如此简单的处理,您将花费更多时间来解压缩和拆分输入,而不是在并行搜索方面节省的时间。一个简单的zgrep
将在更短的时间内完成您的任务。
类似这样的事情:
zegrep $'name.*@en\t\\.$' freebase-public/rdf/freebase-rdf-2013-09-15-00-00.gz | cut -f 1,3 | gzip > freebase-names-20130915.txt.gz
将为您提供 Freebase MID 及其英文名称的压缩两列文件。您可能希望使 grep 更具体一点,以避免误报(并对其进行测试,我还没有做过)。此文件已压缩超过 20GB,因此需要一段时间,但比开始准备 Hadoop 作业的时间还要短。
如果您想进行额外的过滤,例如仅提取类型为 /common/topic 的实体,您可能会发现您需要迁移到 Python 等脚本语言,以便能够一次跨多行查看和评估.
【讨论】:
当我运行grep $'name.*@en\t\\.$' freebase-rdf | cut -f 1,3 | gzip > freebase-names-20130915.txt.gz
时,我得到的只是一个空文件 freebase-name-20130915.txt.gz,当我解压缩时,我得到一个 .cpgz 文件,里面是 .txt.gz文件,它会永远持续下去。
成为 /common/topic 的类型是什么意思?我认为类型是实体分类的类别,例如 /people/person ?【参考方案2】:
不,我认为您不需要使用 Hadoop 和 MapReduce 来执行此操作。您可以轻松创建 Web 服务来提取 RDF 并发送到文件。以下 [1] 博客文章解释了如何使用 WSo2 数据服务服务器提取 RDF 数据。同样,您可以使用 WSO2 DSS 数据联合 [2] 功能提取 RDF 数据并将其发送到 excel 数据表
[1] - http://sparkletechthoughts.blogspot.com/2011/09/extracting-rdf-data-using-wso2-data.html
[2] - http://prabathabey.blogspot.com/2011/08/data-federation-with-wso2-data-service.html
【讨论】:
压缩后的数据为 20GB+,未压缩的数据为 250GB。创建一个数百 GB 的数据库来运行一个简单的查询似乎效率不高。【参考方案3】:还有一个用于 Google Compute Engine 的 screencast,它也向您展示了如何执行此操作。
【讨论】:
我还没有看完,我一直想看。这不是只得到 Freebase 中最流行的主题吗?如何获取所有主题? 另外,我避免使用 Map / Reduce 的原因是因为我最近阅读了一篇文章,指出“您拥有的数据可能不足以用于 Map / Reduce,应该有更简单的方法处理它。” RDF 数据转储包含 Freebase 中的所有 40M+ 主题。我也看到了关于 HN 的那篇文章。如果您不想走 Hadoop 路线,Tom 的回答提供了一个很好的解决方案。 啊,好的。谢谢你的解释。我一直在玩汤姆的 grep 命令及其变体,但我得到的只是空的压缩目录。这是我尝试过的 grep 命令:grep $'name.*@en\t\\.$' freebase-rdf | cut -f 1,3 | gzip > freebase-names-20130915.txt.gz
知道为什么会创建一个包含空 .cpgz 的空 .txt.gz 吗?它们(空目录)无限地相互包含。以上是关于使用 MapReduce 解析 Freebase RDF 转储的主要内容,如果未能解决你的问题,请参考以下文章