2018年07月25日

言語処理100本ノックでPython入門 #60(後編) - RedisでKVSの構築

  

今日は、言語処理100本ノック 2015の第7章・問題60を解きます。


■ 問題
60. KVSの構築
Key-Value-Store (KVS) を用い,アーティスト名(name)から活動場所(area)を検索するためのデータベースを構築せよ.

■ 入力ファイル

前回、RedisのインストールとPython用Redisモジュールをインストールしたので、コードを書く準備は整いました。
入力ファイルは、以下のようなJSONファイルです。先頭数行分だけを載せます。
{"name": "WIK▲N", "tags": [{"count": 1, "value": "sillyname"}], "sort_name": "WIK▲N", "ended": true, "gid": "8972b1c1-6482-4750-b51f-596d2edea8b1", "id": 805192}
{"name": "Gustav Ruppke", "sort_name": "Gustav Ruppke", "ended": true, "gid": "b4f76788-7e6f-41b7-ac7b-dfb67f66282e", "type": "Person", "id": 578352}
{"name": "Pete Moutso", "sort_name": "Moutso, Pete", "ended": true, "gid": "49add228-eac5-4de8-836c-d75cde7369c3", "type": "Person", "id": 371203}
{"ended": true, "gid": "c112a400-af49-4665-8bba-741531d962a1", "sort_name": "Zachary", "id": 273232, "name": "Zachary"}
{"name": "The High Level Ranters", "sort_name": "High Level Ranters, The", "ended": true, "gid": "c42eed94-e233-44e2-82b8-3ed6dd9bf318", "type": "Group", "id": 153193}
{"begin": {"year": 1956}, "end": {"year": 1993}, "name": "The Silhouettes", "area": "United States", "sort_name": "Silhouettes, The", "ended": true, "gid": "ca3f3ee1-c4a7-4bac-a16a-0b888a396c6b", "type": "Group", "id": 101060, "aliases": [{"name": "Silhouettes", "sort_name": "Silhouettes"}, {"name": "The Sihouettes", "sort_name": "The Sihouettes"}]}
{"ended": true, "gid": "7b4a548e-a01a-49b7-82e7-b49efeb9732c", "sort_name": "Leavitt, Aric", "id": 145773, "name": "Aric Leavitt"}
ここから、"name"と"area"の値を抜き出して、Redisデータベースに登録するという課題です。


■ dbを使う準備

ローカルで動作させているので、以下のようなコードを書いて、Redisに接続します。
import redis
...
r = redis.StrictRedis(host='localhost', port=6379, db=0)
protはデフォルトで6379のようです。Redisを起動した際のメッセージに表示されていました。

db=0 でデータベースの番号を指定するようです。番号指定なんですね。 ちょっと驚きです。名前指定って無いのかしら?


■ dbを初期化

何回もこのコードを実行することを考慮して、以下のコードで、現在選択されているDBのすべてのキーを削除します。
 r.flushdb()

■ dbに値を登録

このプログラムでは、enumKvメソッドを定義して、Key-Valueのペアを列挙しています。 この結果を、setメソッドでDBに登録します。

for k, v in enumKv(): r.set(k, v) 

■ dbの接続を閉じる

やり方がわかりませんでした。もしかして必要無いのかもしれません。


■ 出来上がったPythonのコード

import json
import redis

def enumKv():
    with open('artist.json', 'r', encoding='utf8') as fin:
        for line in fin:
            jsd = json.loads(line)
            if 'area' in jsd:
                yield jsd['name'], jsd['area']

def register():
    r = redis.StrictRedis(host='localhost', port=6379, db=0)
    r.flushdb()
    for k, v in enumKv():
        r.set(k, v)
    r.save()

def main():
    register()

if __name__ == '__main__':
    main()

■ 結果

このプログラムを動かしたら、Macのファンがすごい音をさせて回り始めました。
なかなか終わらないので、席を外して他のことをやって戻ったら、プログラムは終わってました。
すみません、時間は計測してなかったのですが、席を外していたのは10分程度だったように思います。

正しく登録できたかは、次の問題61で確認します。