Freebase.comのperformance.tsvやisbn.tsv、group_membership.tsvを作るには

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

書籍の注釈のURLにアクセスしても404エラーなんだよね

7つのデータベース 7つの世界

  • PotgreSQL
  • Riak
  • HBase
  • MongoDB
  • CouchDB
  • Neo4j
  • Redis

データのダウンロード

Freebase Easy - Dataset Download

このページの 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

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

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

できあがった 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

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

できあがった 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

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

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

自前の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
# 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
# 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
# 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

できあがった group_membership.tsv.gz

タイトルとURLをコピーしました