Edited at

素人の言語処理100本ノック:67

More than 1 year has passed since last update.

言語処理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. 複数のドキュメントの取得


特定の(指定した)別名を持つアーティストを検索せよ.



出来上がったコード:


main.py

# 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 非移植日本語訳)です。