1. 程式人生 > >Python 將json格式檔案轉存為RDF格式檔案

Python 將json格式檔案轉存為RDF格式檔案

一、什麼是json格式
JSON(JavaScript Object Notation, JS 物件標記) 是一種輕量級的資料交換格式。它基於 ECMAScript 規範的一個子集,採用完全獨立於程式語言的文字格式來儲存和表示資料。簡潔和清晰的層次結構使得 JSON 成為理想的資料交換語言。 易於人閱讀和編寫,同時也易於機器解析和生成,並有效地提升網路傳輸效率。
舉例:

{
        "infoBox": {
                "籍貫:": "臺灣", 
                "性別:": "男", 
                "經紀公司:": "傑威爾音樂有限公司"
, "出生年月:": "1979年1月18日", "主要成就:": "兩屆臺灣金曲獎最佳國語男歌手獲得十五座金曲獎(獲獎最多)連續7年獲得IFPI香港唱片銷量大獎十大銷量國語唱片", "出生地:": "臺灣新北", "畢業院校:": "淡江中學", "英文名:": "Jay Chou", "民族:": "漢族", "血型:": "O", "職業:
": "歌手、音樂人、製作人、導演、商人", "星座:": "魔羯座", "國籍:": "中國", "代表作品:": "龍捲風、簡單愛、七里香、夜曲、青花瓷、稻香、頭文字D、不能說的祕密、逆戰、青蜂俠、天台", "中文名:": "周杰倫", "別名:": "周董" }
, "openType:": ["藝人"], "infoName:": "周杰倫" }

二、什麼是RDF格式


資源描述框架 (RDF) 是描述網路中資源的 W3C 標準。
RDF 是一個框架,用來描述網路資源,諸如網頁的標題、作者、修改日期、內容以及版權資訊等。
具體可參考W3Cschool RDF 教程
舉例:

<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
   xmlns:ns1="http://baike.com/resource/"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
>
  <rdf:Description rdf:about="http://baike.com/resource/周杰倫">
    <ns1:代表作品 rdf:resource="http://baike.com/resource/不能說的祕密"/>
  </rdf:Description>
</rdf:RDF>

三、讀json檔案

# -*- coding: utf-8 -*-
import json
f = open('data.json', 'r')
for line in f:
    print line

結果:
這裡寫圖片描述

四、存RDF檔案
這裡使用的是Python的一個庫:RDFlib
安裝使用參考:RDFLib/rdflib · GitHub

# -*- coding: utf-8 -*-
import rdflib
g = rdflib.Graph()
s = rdflib.URIRef('http://baike.com/resource/周杰倫')
p = rdflib.URIRef('http://baike.com/resource/代表作品')
o = rdflib.URIRef('http://baike.com/resource/不能說的祕密')

g.add((s, p, o))
g.serialize('hello.rdf')  # 預設以'xml'格式儲存

結果:
這裡寫圖片描述

五、json轉RDF
最後這裡是將上一篇《利用scrapy框架爬取互動百科的詞條–存成json》存的json檔案儲存為RDF檔案作為知識庫儲存起來

# -*- coding: utf-8 -*-
import json
import re
import rdflib
f = open('data.json', 'r')
g1 = rdflib.Graph()
cnt = 0
for line in f:
    #txt = eval("{" + line + "}")
    txt = eval(line)
    cnt = cnt + 1
    print cnt
    try:
        s = rdflib.URIRef('http://baike.com/resource/' + txt['infoName'])
        p = rdflib.URIRef('http://baike.com/resource/開放分類')
        opentype = re.split(r',', txt['openType'])
        for i in range(len(opentype) - 1):
            o = rdflib.URIRef('http://baike.com/resource/' + opentype[i])
            g1.add((s, p, o))
        o = rdflib.URIRef('http://baike.com/resource/' +
                          opentype[len(opentype) - 1])
        g1.add((s, p, o))

        # g1.serialize('da.rdf')
        if len(txt['infoBox']) != 0:
            box = re.split(r',', txt['infoBox'])
            for num in range(len(box) - 1):
                lastbox = re.split(r':', box[num])
                print len(lastbox)
                if len(lastbox) == 2:
                    print lastbox[0]
                    print lastbox[1]
                    try:
                        rtxt = re.compile(
                            r'"| | |    |:|:|、|。|\(|\)|(|)|℃|}|{')
                        lastKey = rtxt.sub('', lastbox[0])
                        p = rdflib.URIRef(
                            'http://baike.com/resource/' + lastKey)
                        rtxt = re.compile(r'"| |\&gt|}|{')
                        lastTest = rtxt.sub('', lastbox[1])
                        lastTestChild = re.split(
                            r'、|,|;|;|,|\|', lastTest)
                        for i in range(len(lastTestChild) - 1):
                            o = rdflib.URIRef(
                                'http://baike.com/resource/' + lastTestChild[i])
                            g1.add((s, p, o))
                        o = rdflib.URIRef(
                            'http://baike.com/resource/' + lastTestChild[len(lastTestChild) - 1])
                        g1.add((s, p, o))

                        # g1.serialize('da.rdf')
                    except:
                        pass

    except Exception as e:
        pass
g1.serialize('data.rdf')
# print box[num]

f.close()

測試資料與程式:點選下載