Python 將json格式檔案轉存為RDF格式檔案
阿新 • • 發佈:2019-02-16
一、什麼是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'"| |\>|}|{')
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()
測試資料與程式:點選下載