「7つのデータベース 7つの世界」の学習のために、Freebase.comの映画データやISBNデータに相当するものを作ります。

書籍の注釈のURLにアクセスしても404エラーなんだよね
7つのデータベース 7つの世界
- PotgreSQL
- Riak
- HBase
- MongoDB
- CouchDB
- Neo4j
- Redis
データのダウンロード
このページの http://freebase-easy.cs.uni-freiburg.de/dump/freebase-easy-14-04-14.zip をダウンロードします。2.5GBあります。

筆者は、寝る前にダウンロード開始したらしいわ
freebase-easy-14-04-14.zip の中の、facts.txt を取り出します。そのまま保存すると15GBあるので、すぐにgzipで圧縮します。
$ unzip -p freebase-easy-14-04-14.zip freebase-easy-14-04-14/facts.txt | gzip --stdout >facts.txt.gz
Code language: Bash (bash)
actors_movies.tsv
書籍 p224 注釈の http://download.freebase.com/datadumps/latest/browse/film/performance.tsv に相当する、俳優名、映画タイトルのtsvファイルを作ります。
facts.txtを "Film performance" でgrepします。
$ zcat facts.txt.gz | grep -i "Film performance" >tmp1.tsv
Code language: Bash (bash)
1列目が俳優名、3列目が映画タイトルなので、列を並び替えます。
$ cat tmp1.tsv | awk -F"\t" '{print ".\t.\t" $1 "\t" $3 "\t."}' >actors_movies.tsv
$ wc actors_movies.tsv
1175955 10193168 50168407
Code language: JavaScript (javascript)
できあがった actors_movies.tsv.gz
isbn.tsv
書籍 p261 注釈の http://download.freebase.com/datadumps/latest/browse/book/isbn.tsv に相当する、ISBN、本タイトルのtsvファイルを作ります。
facts.txtを "isbn-13" でgrepします。
$ zcat facts.txt.gz | grep -i isbn-13 >tmp2.tsv
Code language: Bash (bash)
1列目がISBN、3列目が本のタイトルなので、列を並び替えます。ISBNのダブルクォーテーション囲みを削除します。
$ cat tmp2.tsv | awk -F"\t" '{print $3 "\t.\t.\t" $1 "\t."}' | sed 's/^"//g' | sed 's/"\t./\t./g' >isbn.tsv
$ wc isbn.tsv
697239 8018083 48432705
Code language: JavaScript (javascript)
できあがった isbn.tsv.gz
group_membership.tsv
書籍 p270 注釈の http://download.freebase.com/datadumps/latest/browse/music/group_membership.tsv に相当するtsvファイルを作ります。
facts.txtを"\tis-a\tMusical Group" でgrepします。音楽バンドのgroupを抽出します。
$ zcat facts.txt.gz | grep $'\tis-a\tMusical Group' | grep -v -e '^m/' >musical_group.tsv
wc musical_group.tsv
Code language: Bash (bash)
facts.txtを"\tMember of\t" でgrepします。memberとgroupを抽出します。
$ zcat facts.txt.gz | grep $'\tis-a\tMusical Group' | grep -v -e '^m/' >musical_group.tsv
wc musical_group.tsv
Code language: Bash (bash)
facts.txtを"\tis-a\tSinger"、"\tInstrumented Play\t"でgrepします。memberとroleを抽出します。。
$ zcat facts.txt.gz | grep -e $'\tis-a\tSinger' -e $'\tInstrumented Play\t' | grep -v -e '^m/' >role.tsv
wc role.tsv
Code language: Bash (bash)
自前のrubyスクリプトで、group_membership.tsvにまとめます。
$ ruby member_of_musical_group.rb musical_group.tsv member_of.tsv >member_of_musical_group.tsv
$ ruby member_roles.rb role.tsv >member_roles.tsv
$ ruby group_membership.rb member_roles.tsv member_of_musical_group.tsv >group_membership.tsv
Code language: Bash (bash)
# ruby member_of_musical_group.rb musical_group.tsv member_of.tsv >member_of_musical_group.tsv
musical_group_map = {}
File.open(ARGV[0]).each do |line|
group, _ = line.split("\t")
next if group.empty?
if !musical_group_map.has_key?(group)
musical_group_map[group] = true
end
end
#puts musical_group_map
File.open(ARGV[1]).each do |line|
member, _, group = line.split("\t")
next if member.empty? || group.empty?
if musical_group_map.has_key?(group)
puts line
end
end
Code language: Ruby (ruby)
# ruby member_roles.rb role.tsv >member_roles.tsv
member_roles = {}
File.open(ARGV[0]).each do |line|
member, _, role, = line.split("\t")
next if member.empty?
if !member_roles.has_key?(member)
member_roles[member] = []
end
member_roles[member].push role
end
member_roles.keys.each do |member|
roles = member_roles[member].join ","
puts "#{member}\t#{roles}\t."
end
Code language: Ruby (ruby)
# ruby group_membership.rb member_roles.tsv member_of_musical_group.tsv >group_membership.tsv
member_roles = {}
File.open(ARGV[0]).each do |line|
member, roles, _ = line.split("\t")
next if member.empty?
member_roles[member] = roles
end
#puts member_roles
File.open(ARGV[1]).each do |line|
member, _, group, _ = line.split("\t")
next if member.empty? || group.empty?
roles = member_roles[member] || ""
puts ".\t#{member}\t#{group}\t#{roles}\t."
end
Code language: Ruby (ruby)
できあがった group_membership.tsv.gz