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
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 50168407Code 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.tsvCode 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.tsvCode 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.tsvCode 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
endCode 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

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