言語処理100本ノック 2015の挑戦記録です。環境はUbuntu 16.04 LTS + Python 3.5.2 :: Anaconda 4.1.1 (64-bit)です。過去のノックの一覧はこちらからどうぞ。
第7章: データベース
artist.json.gzは,オープンな音楽データベースMusicBrainzの中で,アーティストに関するものをJSON形式に変換し,gzip形式で圧縮したファイルである.このファイルには,1アーティストに関する情報が1行にJSON形式で格納されている.JSON形式の概要は以下の通りである.
フィールド 型 内容 例 id ユニーク識別子 整数 20660 gid グローバル識別子 文字列 "ecf9f3a3-35e9-4c58-acaa-e707fba45060" name アーティスト名 文字列 "Oasis" sort_name アーティスト名(辞書順整列用) 文字列 "Oasis" area 活動場所 文字列 "United Kingdom" aliases 別名 辞書オブジェクトのリスト aliases[].name 別名 文字列 "オアシス" aliases[].sort_name 別名(整列用) 文字列 "オアシス" begin 活動開始日 辞書 begin.year 活動開始年 整数 1991 begin.month 活動開始月 整数 begin.date 活動開始日 整数 end 活動終了日 辞書 end.year 活動終了年 整数 2009 end.month 活動終了月 整数 8 end.date 活動終了日 整数 28 tags タグ 辞書オブジェクトのリスト tags[].count タグ付けされた回数 整数 1 tags[].value タグ内容 文字列 "rock" rating レーティング 辞書オブジェクト rating.count レーティングの投票数 整数 13 rating.value レーティングの値(平均値) 整数 86 artist.json.gzのデータをKey-Value-Store (KVS) およびドキュメント志向型データベースに格納・検索することを考える.KVSとしては,LevelDB,Redis,KyotoCabinet等を用いよ.ドキュメント志向型データベースとして,MongoDBを採用したが,CouchDBやRethinkDB等を用いてもよい.
###67. 複数のドキュメントの取得
特定の(指定した)別名を持つアーティストを検索せよ.
####出来上がったコード:
# coding: utf-8
import json
from pymongo import MongoClient
from bson.objectid import ObjectId
def support_ObjectId(obj):
'''json.dumps()でObjectIdを処理するための関数
ObjectIdはjsonエンコードできない型なので、文字列型に変換する
戻り値:
ObjectIdから変換した文字列
'''
if isinstance(obj, ObjectId):
return str(obj) # 文字列として扱う
raise TypeError(repr(obj) + " is not JSON serializable")
# MongoDBのデータベースtestdbにコレクションartistにアクセス
client = MongoClient()
db = client.testdb
collection = db.artist
# 条件入力
clue = input('アーティストの別名を入力してください--> ')
# 検索
for i, doc in enumerate(collection.find({'aliases.name': clue}), start=1):
# 整形して表示
print('{}件目の内容:\n{}'.format(i,
json.dumps(
doc, indent='\t', ensure_ascii=False,
sort_keys=True, default=support_ObjectId
)
))
####実行結果:
アーティストの別名を入力してください--> スマップ
1件目の内容:
{
"_id": "5879fd911d41c85827314a38",
"aliases": [
{
"name": "スマップ",
"sort_name": "スマップ"
}
],
"area": "Japan",
"begin": {
"month": 4,
"year": 1988
},
"ended": true,
"gid": "6ab7953b-8480-41fe-a9fe-5e220d8e9429",
"id": 265728,
"name": "SMAP",
"sort_name": "SMAP",
"tags": [
{
"count": 1,
"value": "likedis auto"
}
],
"type": "Group"
}
###複数のドキュメントの取得
プログラムはほとんど問題65のままです。条件を入力できるようにして、検索対象をアーティスト名(name)から別名(aliases.name)に変えました。
今回の問題名は「複数の」ドキュメントの取得なのですが、実行例としてうまく複数のドキュメントをヒットさせる条件が見つかりませんでした(^^;
68本目のノックは以上です。誤りなどありましたら、ご指摘いただけますと幸いです。
実行結果には、100本ノックで用いるコーパス・データで配布されているデータの一部が含まれます。この第7章で用いているデータのライセンスはクリエイティブ・コモンズ 表示 - 非営利 - 継承 3.0 非移植(日本語訳)です。