半構造化データとは
半構造化データ(Semi-structured Data)とは、名前の通り構造化データと非構造化データの中間的な性質を持つデータです。
そのままでは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 |
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行目の値で補完するかを決める必要があります。
ここでご紹介したものは、あくまで構造化データの延長線上で、そこまで複雑なものではありません。複雑になればなるほど、構造化データへの変換は、人の判断を必要とする場面が増えてきます。