データサイエンス全般

半構造化データ(XML/JSON)

半構造化データとは

半構造化データ(Semi-structured Data)とは、名前の通り構造化データと非構造化データの中間的な性質を持つデータです。

構造化データと非構造化データ
構造化データとは 構造化データ(Structured Data)とは、次のような表形式で初めから与えられているデータのことをいいます。本例は、Rにプリセットされているirisデータセットより。 Sepal.Length、Sepa...

そのままではRDBで扱うことができないため、一般的には半構造化データは非構造化データの一種とみなされます。

ある程度の構造を有しているため、適切に情報を補うことができれば、半構造化データを構造化データに変換することも可能です。

半構造化データの代表的なものとして、XMLファイル(拡張子「.xml」)およびXML型式のデータ、またJSONファイル(拡張子「.json」)およびJSON型式のデータがあります。[1]他に半構造化データの例として、ORC、Parquet、Avroなどがあります。

XML(Extensible Markup Language)は、HTMLをベースとしたデータ記述言語です。Webデザインをしている方であれば、データ構造を直感的に理解することができるかもしれません。

JSON(JavaScript Object Notation)は、JavaScriptをベースとしたデータ記述言語です。JSONはXMLより処理速度で勝ることが多く、XMLより優先して使われる場面が増えてきています。

XML/JSONの例

まず下表の通り、Irisデータセットの1、2行目を抽出したものについて、XMLとJSONでどのように記述されるかを見ていきます。

Sepal.Length Sepal.Width Petal.Length Petal.Width Species
5.1 3.5 1.4 0.2 setosa
4.9 3 1.4 0.2 setosa
Irisデータセット
Irisデータセットとは Irisデータセットは、データサイエンスの世界でもっとも有名なデータセットのひとつです。 統計学に多大な功績を残したロナルド・エイルマー・フィッシャー(Ronald Aylmer Fisher)が論文で...

XMLです。

<?xml version="1.0" encoding="utf-8"?>
<root>
	<iris>
		<Sepal.Length>5.1</Sepal.Length>
		<Sepal.Width>3.5</Sepal.Width>
		<Petal.Length>1.4</Petal.Length>
		<Petal.Width>0.2</Petal.Width>
		<Species>setosa</Species>	
	</iris>
	<iris>
		<Sepal.Length>4.9</Sepal.Length>
		<Sepal.Width>3</Sepal.Width>
		<Petal.Length>1.4</Petal.Length>
		<Petal.Width>0.2</Petal.Width>
		<Species>setosa</Species>
	</iris>
</root>

<root>という要素の中に<iris>という要素が入っており、さらにその中に<Sepal.Length><Sepal.Width><Petal.Length><Petal.Width><Species>という5つの要素が入っているという、入れ子(ネスト)構造になっています。

要素の名前が列名に、その内容が値に対応しています。

続いて、JSONです。

[
    {
    	"Sepal.Length":5.1,
    	"Sepal.Width":3.5,
    	"Petal.Length":1.4,
    	"Petal.Width":0.2,
    	"Species":"setosa"
    },
    {
    	"Sepal.Length":4.9,
    	"Sepal.Width":3,
    	"Petal.Length":1.4,
    	"Petal.Width":0.2,
    	"Species":"setosa"
    }
]

{}で囲われた部分が、オブジェクトと呼ばれる単位です。Pythonの辞書(dict)型のように、key:value形式で記述されています。

keyが列名に、valueが値に対応しています。

ここで、SepalとPetalを上位の階層とし、それぞれの中にLengthとWidthが入っているという、さらに複雑な入れ子構造を作ることを考えます。

これは、下表のように列名を2行で記述することに対応しているといえます。

Sepal Petal Species
Length Width Length Width
5.1 3.5 1.4 0.2 setosa
4.9 3 1.4 0.2 setosa

XMLです。

<?xml version="1.0" encoding="utf-8"?>
<root>
	<iris>
		<Sepal>
			<Length>5.1</Length>
			<Width>3.5</Width>
		</Sepal>
		<Petal>
			<Length>1.4</Length>
			<Width>0.2</Width>
		</Petal>
		<Species>setosa</Species>
	</iris>
	<iris>
		<Sepal>
			<Length>4.9</Length>
			<Width>3</Width>
		</Sepal>
		<Petal>
			<Length>1.4</Length>
			<Width>0.2</Width>
		</Petal>
		<Species>setosa</Species>
	</iris>
</root>

例えば<Sepal.Length>は、<Sepal>と<Length>という2つの要素に分かれ、上位下位の関係になっていることがわかります。

続いて、JSONです。

[
    {
    	"Sepal":{
    		"Length":5.1,
    		"Width":3.5
    		},
    	"Petal":{
    		"Length":1.4,
    		"Width":0.2
    		},
    	"Species":"setosa"
    },
    {
    	"Sepal":{
    		"Length":4.9,
    		"Width":3
    		},
    	"Petal":{
    		"Length":1.4,
    		"Width":0.2
    		},
    	"Species":"setosa"
    }
]

オブジェクトに階層関係が加わっています。

非構造化データでは、特定の行だけ柔軟にラベルを追加することも可能です。ここでは、1行目だけにColorというラベルを追加し、その値をblueとします。

これは、下表のようにColorという列を追加し、1行目にのみ値が存在する場合に対応しています。

Sepal Petal Species Color
Length Width Length Width
5.1 3.5 1.4 0.2 setosa blue
4.9 3 1.4 0.2 setosa

XMLです。

<?xml version="1.0" encoding="utf-8"?>
<root>
	<iris>
		<Sepal>
			<Length>5.1</Length>
			<Width>3.5</Width>
		</Sepal>
		<Petal>
			<Length>1.4</Length>
			<Width>0.2</Width>
		</Petal>
		<Species>setosa</Species>
		<Color>blue</Color>
	</iris>
	<iris>
		<Sepal>
			<Length>4.9</Length>
			<Width>3</Width>
		</Sepal>
		<Petal>
			<Length>1.4</Length>
			<Width>0.2</Width>
		</Petal>
		<Species>setosa</Species>
	</iris>
</root>

<Color>blue</Color>が追加された部分です。

続いて、JSONです。

[
    {
    	"Sepal":{
    		"Length":5.1,
    		"Width":3.5
    		},
    	"Petal":{
    		"Length":1.4,
    		"Width":0.2
    		},
    	"Species":"setosa",
       	"Color":"blue"
    },
    {
    	"Sepal":{
    		"Length":4.9,
    		"Width":3
    		},
    	"Petal":{
    		"Length":1.4,
    		"Width":0.2
    		},
    	"Species":"setosa"
    }
]

“Color”:”blue”が追加された部分です。[2]<iris Color=”blue”>のように、<iris>という要素の属性として記述する方法もあります。Species等も同様です。

もし構造化データに変換する場合、Colorという名前の列について、2行目を単純に欠損とするか、1行目の値で補完するかを決める必要があります。

ここでご紹介したものは、あくまで構造化データの延長線上で、そこまで複雑なものではありません。複雑になればなるほど、構造化データへの変換は、人の判断を必要とする場面が増えてきます。

データの種類(良いデータの条件)
データの種類 様々な観点から、データを種類分けすることができます。 ここでは、構造化データと非構造化データ、時系列データと非時系列データ、実験データと観察データ、ビッグデータとスモールデータについて投稿した記事をまとめています。...

脚注

脚注
1 他に半構造化データの例として、ORC、Parquet、Avroなどがあります。
2 <iris Color=”blue”>のように、<iris>という要素の属性として記述する方法もあります。Species等も同様です。
タイトルとURLをコピーしました