📑

Odeuropa Explorer の語彙階層構造を調査する

に公開

はじめに

Odeuropa Explorer は、ヨーロッパの嗅覚遺産をデジタル化した興味深いプロジェクトです。EU の Horizon 2020 研究プログラムの助成を受け、歴史的な匂いの体験を横断的に検索・探索できるプラットフォームを提供しています。

このプロジェクトでは、匂いに関連する情報を以下の3つの主要なカテゴリで分類しています:

  • Smell sources: 匂いを発する物体や物質
  • Fragrant Spaces: 匂いに関連する場所や空間
  • Gestures and Allegories: 匂いに関する身振りや寓意的表現

本記事では、これらの語彙がどのような階層構造を持っているのか、Odeuropa vocabularies リポジトリで公開されている SKOS(Simple Knowledge Organization System)形式のデータを調査した結果を報告します。

調査方法

SKOS階層の可視化スクリプト

語彙の階層構造を理解するために、Node.js で SKOS Turtle ファイルを解析するスクリプトを作成しました。

import $rdf from 'rdflib';
import fs from 'fs';

const SKOS = $rdf.Namespace('http://www.w3.org/2004/02/skos/core#');

async function visualizeHierarchy(ttlFile) {
  const store = $rdf.graph();
  const data = fs.readFileSync(ttlFile, 'utf8');
  $rdf.parse(data, store, 'http://example.org/', 'text/turtle');

  // Get all concepts
  const concepts = store.match(null,
    $rdf.sym('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'),
    SKOS('Concept'));

  // Build maps for broader/narrower relationships
  const broaderMap = new Map();
  const narrowerMap = new Map();
  const conceptLabels = new Map();

  for (const concept of concepts) {
    const subject = concept.subject;

    // Get prefLabel
    const labels = store.match(subject, SKOS('prefLabel'), null);
    if (labels.length > 0) {
      conceptLabels.set(subject.value, labels[0].object.value);
    }

    // Get broader concepts
    const broaders = store.match(subject, SKOS('broader'), null);
    if (broaders.length > 0) {
      const broader = broaders[0].object.value;
      broaderMap.set(subject.value, broader);

      if (!narrowerMap.has(broader)) {
        narrowerMap.set(broader, []);
      }
      narrowerMap.get(broader).push(subject.value);
    }
  }

  // Print hierarchy recursively
  function printHierarchy(conceptUri, indent = '', visited = new Set()) {
    if (visited.has(conceptUri)) return;
    visited.add(conceptUri);

    const label = conceptLabels.get(conceptUri);
    const children = narrowerMap.get(conceptUri) || [];

    console.log(`${indent}${label}`);

    children.forEach((child, index) => {
      const isLast = index === children.length - 1;
      const prefix = isLast ? '└── ' : '├── ';
      printHierarchy(child, indent + prefix, new Set(visited));
    });
  }

  // Find and display top-level concepts
  const topLevelConcepts = [];
  for (const concept of concepts) {
    if (!broaderMap.has(concept.subject.value)) {
      topLevelConcepts.push(concept.subject.value);
    }
  }

  topLevelConcepts.forEach(concept => printHierarchy(concept));
}

このスクリプトの主要な処理:

  1. RDFグラフの読み込み: rdflib を使用して Turtle 形式の語彙ファイルをパース
  2. 階層関係の抽出: skos:broaderskos:narrower の関係を Map オブジェクトで管理
  3. トップレベル概念の特定: skos:broader を持たない概念を検出
  4. 再帰的な階層表示: ツリー構造で視覚的に表現

実行方法

3つの語彙すべてに対してスクリプトを実行しました:

# Smell sources(匂いの発生源)
node visualize-hierarchy.js olfactory-objects.ttl > olfactory-objects-hierarchy.txt

# Fragrant Spaces(香りのある場所)
node visualize-hierarchy.js fragrant-spaces.ttl > hierarchy-fragrant-spaces-20251010-231358.txt

# Gestures and Allegories(身振りと寓意)
node visualize-hierarchy.js olfactory-gestures.ttl > olfactory-gestures-hierarchy.txt

調査結果

1. Smell sources(匂いの発生源)

総概念数: 685
トップレベル概念: 13
子要素を持つ概念: 77
最大階層深度: 4

階層の深さの分布:

  • Level 0(トップレベル): 13 概念
  • Level 1: 383 概念
  • Level 2: 202 概念
  • Level 3: 42 概念
  • Level 4: 45 概念

トップレベルのカテゴリ:

Abstract (抽象概念)
Artefact (人工物)
Being (生物)
Body (身体)
Element (元素)
Flora (植物)
Food (食品)
Fragrance / Cosmetic (香料・化粧品)
Fumes (煙・蒸気)
Matter (物質)
Nature (自然)
Product (製品)
Religion (宗教)

特徴的な深い階層構造の例:

<details>
<summary>Being (生物) の階層(クリックで展開)</summary>

Being (555)
├── Kadaver (23)
├── Onycha (397)
├── Person (539)
├── ├── Man (540)
├── └── Woman (541)
└── Tier (13)
    ├── (gestrandeter) Wal (5)
    ├── Äschen (428)
    ├── Biber (14)
    ├── Big cat (571)
    ├── Drachen (56)
    ├── Dünger (98)
    ├── Fell (76)
    ├── Fisch (68)
    ├── Hunde (55)
    ├── Moschushirsch (101)
    ├── Musk Rat (102)
    ├── Oiselet (387)
    ├── Pottwal (153)
    ├── Stinktier (146)
    ├── Wirbellos (464)
    │   ├── Crustacean (343)
    │   │   ├── Crab (489)
    │   │   └── Languste (469)
    │   ├── Fliegen (468)
    │   ├── Garnele (470)
    │   ├── Insekt (471)
    │   │   ├── Ant (490)
    │   │   ├── Cocoon (518)
    │   │   ├── Dragonfly (491)
    │   │   ├── Grasshopper (504)
    │   │   ├── Maggot (601)
    │   │   ├── Moth (525)
    │   │   └── Vetiver (398)
    │   ├── Muschel (465)
    │   ├── Raupe (467)
    │   ├── Schmetterling (466)
    │   ├── Snail (488)
    │   ├── Spider (526)
    │   └── Worm (542)
    ├── Wirbeltiere (459)
    │   ├── Amphibia (479)
    │   │   └── Frog (524)
    │   ├── Karkasse (460)
    │   ├── Mammal (480)
    │   │   ├── Antilopinae (580)
    │   │   ├── Armadillo (581)
    │   │   ├── Bear (514)
    │   │   ├── Boar (584)
    │   │   ├── Bullen (191)
    │   │   ├── Camel (508)
    │   │   ├── Deer (503)
    │   │   ├── Elephant (590)
    │   │   ├── Ferret (593)
    │   │   ├── Fox (594)
    │   │   ├── Guinea pig (510)
    │   │   ├── Hausesel (463)
    │   │   ├── Hauskatze (462)
    │   │   ├── Hedgehog (599)
    │   │   ├── Kühe (190)
    │   │   ├── Leopard (515)
    │   │   ├── Lion (502)
    │   │   ├── Monkey (499)
    │   │   ├── Mouse (509)
    │   │   ├── Pferde (189)
    │   │   ├── Rabbit (501)
    │   │   ├── Rat (500)
    │   │   ├── Schaf (193)
    │   │   ├── Schweine (188)
    │   │   ├── Squirrel (606)
    │   │   ├── Tiger (512)
    │   │   ├── Wolf (513)
    │   │   └── Ziegenbock (192)
    │   ├── Reptile (478)
    │   │   ├── Lizard (506)
    │   │   └── Snake (516)
    │   ├── Reptile/Amphibia (477)
    │   └── Vogel (461)
    │       ├── Enten (578)
    │       ├── Huhn (194)
    │       └── Tauben (195)
    └── Zibetkatze (45)

</details>

<details>
<summary>Flora (植物) の階層(クリックで展開)</summary>

Flora (560)
├── Acacia farnesiana (239)
├── Akeleien (91)
├── Algae (543)
├── Aloe (652)
├── Bäume (200)
│   ├── Akazie (221)
│   ├── Bark (625)
│   ├── Conifer (358)
│   │   └── Cedar (Virginia) (359)
│   │       └── Cedar (Lebanon) (360)
│   ├── Eiche (218)
│   ├── Eucalyptus (355)
│   ├── Holz (476)
│   │   ├── Lignum Aquilae (426)
│   │   ├── Oud (396)
│   │   └── Sandelholz (202)
│   ├── Kampfer (24)
│   ├── Linde (201)
│   ├── Lorbeer (232)
│   ├── Myrte (234)
│   ├── Nitre plant (402)
│   ├── Ulme (61)
│   └── Wacholderbeere (231)
├── Bergamot (668)
├── Berry (675)
├── Blossom (557)
│   └── Orange blossom (551)
├── Blumen (72)
│   ├── Agapanthus (579)
│   ├── Calla Lily (585)
│   ├── Chrysanthemum (586)
│   ├── Epidendrum (591)
│   ├── Galanthus (595)
│   ├── Gerbera (597)
│   ├── Hibiscus (600)
│   └── Marigold (684)
... (以下省略)

</details>

興味深い点:

  1. 最も深い階層構造: 最大深度4で、3つの語彙の中で最も複雑な階層を持っています
  2. 13のトップレベルカテゴリ: Abstract、Artefact、Being、Body、Element、Flora、Food、Fragrance/Cosmetic、Fumes、Matter、Nature、Product、Religion という体系的な分類
  3. 圧倒的な規模: 685概念は他の2つの語彙(138と36)を大きく上回ります
  4. 生物分類学的アプローチ: Being(生物)や Flora(植物)は、科学的分類に近い詳細な階層構造を持っています
  5. 文化と科学の融合: 宗教的概念から化学物質まで、幅広い知識ドメインをカバーしています
  6. 人工物の詳細分類: Artefact カテゴリには香水瓶、宝飾品、喫煙具など、匂いに関連する多様な人工物が含まれます

2. Fragrant Spaces(香りのある場所)

総概念数: 138
トップレベル概念: 91
子要素を持つ概念: 23
最大階層深度: 2

階層の深さの分布:

  • Level 0(トップレベル): 91 概念
  • Level 1: 44 概念
  • Level 2: 3 概念

全階層構造:

<details>
<summary>クリックして全138概念を表示</summary>

Anatomical theatre (83)

Arabia (109)

Arcadia (110)

Badehaus (58)

Bakery (105)

Ball (3)

Bauernhof (25)
└── Poultry farm (57)

Bleaching field (7)

Brauerei (6)

Brennerei (17)

Brothel (82)

Building (129)
└── House (69)
    ├── Apartment (118)
    └── Old House (86)

Burg (8)

Chimney (130)

Coal Wagon (113)

Countryside (122)
└── Field (128)
    └── Hayfield (30)

Dilligence (114)

Fabrik (23)
├── Cacao factory (10)
├── Chemical industry (13)
├── Factory-interior (24)
├── Pastry factory (55)
├── Sugar factory (65)
├── Tobacco factory (71)
└── Vinegar factory (90)

Factories and mills in landscape (22)

Field hospital (78)

Garten (27)
├── Botanical garden (84)
├── Fenced garden (81)
└── Tea garden (72)

Gewächshaus (29)
├── Limonaia (43)
└── Orangerie (44)

Graveyard (77)

Grocery (28)

Handicraft place (31)

Haystack (115)

Hell (101)

Hot-house (33)

Hotel (138)

Jagdszene (34)

Jail (137)

Kaffeehaus (36)

Kanal (11)

Kanalisation (98)

Keller (12)

Krankenhaus (32)
└── Hospital ward (74)

Küche (37)
├── Poor kitchen (39)
└── Rich kitchen (38)

Laboratory (136)
└── Alchemist's workshop (1)

Lake (132)

Lane (40)

Laundry place (9)

Library (95)

Lime Kiln (42)

Limkiln (99)

Markt (45)
├── Animal market (2)
├── Fischmarkt (26)
└── Markthalle (46)

Meadow (48)

Medical garden (87)

Misthaufen (18)

Mountain (49)

Museum (54)

Nursery (plants) (50)

Office (52)

Paradise (108)

Place (121)

Place of worship (53)
├── Chapel (131)
├── Kirche (35)
├── Monastery (134)
├── Mosque (89)
└── Synagogue (88)

Pleasure fair (79)

Pond (133)

Print shop (106)

Prison (56)

Pub (100)

Public Bath (59)

Restaurant (92)
└── Kantine (16)

Room (117)
├── Badezimmer (4)
├── Bedroom (111)
├── Living room (112)
├── Refectory (135)
├── Speisesaal (15)
└── Toilet (124)

Ropery (80)

Run factory (97)

Schlachtfeld (76)

School (104)

Sea (93)
└── Ocean (51)

Shop (107)
└── Toko (119)

Slaughter house (61)

Slum (62)

Soap works (85)

Stadt (14)
└── Neighbourhood (123)

Ställe (63)
└── Pensionsstall (116)

Station (120)

Strand (5)
└── Shore (125)

Street (64)
└── Dirt road (103)

Stud farm (60)

Swamps and polders (66)
├── Marshland (47)
├── Polder (96)
└── Swamp (67)

Tannery (68)

Teergrube (94)

Theatre (102)

Tobacco spinning workshop (91)

Town (126)

Tropic (127)

Village (73)

Wald (19)
└── Waldbrand (20)

Walkmühle (21)

Warehouse (41)

Wash house (75)

Wig shop (70)

</details>

特徴的な階層構造のハイライト:

Fabrik (工場)
├── Cacao factory (カカオ工場)
├── Chemical industry (化学工場)
├── Factory-interior (工場内部)
├── Pastry factory (菓子工場)
├── Sugar factory (砂糖工場)
├── Tobacco factory (タバコ工場)
└── Vinegar factory (酢工場)

Garten (庭園)
├── Botanical garden (植物園)
├── Fenced garden (囲い庭)
└── Tea garden (茶園)

Place of worship (礼拝所)
├── Chapel (礼拝堂)
├── Kirche (教会)
├── Monastery (修道院)
├── Mosque (モスク)
└── Synagogue (シナゴーグ)

Building (建物)
└── House (家)
    ├── Apartment (アパート)
    └── Old House (古い家)

興味深い点:

  1. 多言語性: ドイツ語(Fabrik, Garten, Wald)と英語が混在しており、ヨーロッパ多言語プロジェクトの特性が表れています
  2. 比較的フラットな構造: 最大深度が2と浅く、ほとんどの概念がトップレベルまたは1階層下にあります
  3. 場所の多様性: 工場、市場、宗教施設、自然環境など、匂いに関連する場所が網羅的にカバーされています
  4. 産業施設の詳細分類: 特に工場(Fabrik)は7つの専門的なサブカテゴリを持ち、産業革命期の匂いの重要性を示唆しています

3. Gestures and Allegories(身振りと寓意)

総概念数: 36
トップレベル概念: 34
子要素を持つ概念: 2
最大階層深度: 1

階層の深さの分布:

  • Level 0(トップレベル): 34 概念
  • Level 1: 2 概念

全階層構造:

<details>
<summary>クリックして全36概念を表示</summary>

Ash collecting (27)

Bleaching (7)

Burning (19)

Burnt offering (31)

Changing diaper (17)

Defecation (8)

Doctor sniffing cane (34)

Eating (15)

Embalming (10)

Examination of urine (12)

Fainting (20)

Flatulence (4)

Food tasting (16)

Fumigating (health) (33)

Garbage collecting (26)

Hand towards the nose (24)

Harvesting civet from civet cat (30)

Holding one's nose (2)

Holding one's nose closed (3)

Holding something to the nose (14)

Hunting (5)

Making toilet (25)

Per fumum (9)

Perfuming (29)

Rag picking (35)

Scent distributing (23)
└── Censing (21)

Smelling (1)
└── Piss smelling (22)

Smoking (18)

Street sweeping (13)

Urination (11)

Using scents (28)

Vomiting (6)

Washing (36)

Womb fumigation (32)

</details>

階層を持つ概念:

Scent distributing (香りの配布)
└── Censing (香を焚く)

Smelling (匂いを嗅ぐ)
└── Piss smelling (尿の匂いを嗅ぐ)

主要な概念(カテゴリ別):

  • 鼻に関する身振り: Holding one's nose(鼻をつまむ)、Hand towards the nose(鼻に手を当てる)
  • 衛生・清掃行為: Garbage collecting(ゴミ収集)、Street sweeping(道路清掃)、Washing(洗濯)
  • 医療行為: Examination of urine(尿検査)、Embalming(防腐処理)、Doctor sniffing cane(医師の嗅ぎ杖)
  • 宗教儀式: Burnt offering(燔祭)、Per fumum(薫煙による)
  • 日常行為: Eating(食事)、Smoking(喫煙)、Defecation(排泄)

興味深い点:

  1. ほぼフラットな構造: 36概念中34がトップレベルで、階層化の必要性が低い語彙セットです
  2. 身体行為中心: 多くが身体的なジェスチャーや行為に関連しています
  3. 医療と衛生: 尿検査や薫煙消毒など、歴史的な医療・衛生慣習が含まれています
  4. 文化的多様性: 宗教儀式から日常的な行為まで、幅広い文化的文脈をカバーしています

技術的考察

語彙間の比較

3つの語彙を比較すると、それぞれのドメインの特性が明確に表れています:

語彙 総概念数 トップレベル 最大深度 特徴
Smell sources 685 13 4 体系的な分類、深い階層
Fragrant Spaces 138 91 2 フラットな構造、場所の多様性
Gestures and Allegories 36 34 1 ほぼフラット、独立した行為

規模の違いの意味:

  • Smell sources が圧倒的に大きいのは、匂いの発生源が非常に多様であることを示しています
  • Fragrant Spaces は中規模で、場所という具体的な概念を扱っています
  • Gestures and Allegories は最小ですが、文化的に重要な行為を厳選しています

階層の深さの意味:

  • 深い階層(Smell sources): 自然分類(生物分類)や製品カテゴリなど、本質的に階層的な知識
  • 浅い階層(Fragrant Spaces、Gestures): 場所や行為は比較的独立した概念として存在

SKOS の設計原則との整合性

今回調査した3つの語彙は、SKOS の設計原則に忠実な構造を持っています:

  1. 適切な階層の深さ: 最大深度1〜4と、各ドメインの性質に応じた階層の深さを採用
  2. broader/narrower 関係の明確性: 各概念の上下関係が明確に定義されています
  3. トップレベル概念のバランス: Smell sources は13の体系的なカテゴリ、Fragrant Spaces は91の多様な場所、Gestures は34の独立した行為

データモデリングの特徴

3つの語彙の階層の深さの違いは、それぞれのドメインの性質を反映しています:

  • Smell sources(深度4): 自然分類や製品階層など、本質的に階層的な知識体系
    • 例: Being → Tier → Wirbeltiere → Mammal → Lion
    • 例: Flora → Bäume → Holz → Sandelholz
  • Fragrant Spaces(深度2): 場所の包含関係による浅い階層
    • 例: Building → House → Apartment
  • Gestures and Allegories(深度1): 独立した行為として存在、階層化の必要性が低い
    • 例: Smelling → Piss smelling(数少ない階層の1つ)

実装上の工夫

スクリプト実装で特に重要だった点:

  1. 循環参照のチェック: visited Set を使用して無限ループを防止
  2. ラベルの取得: skos:prefLabel がない場合の URI からのフォールバック
  3. ソート: アルファベット順でのソートにより、出力の一貫性を確保
  4. 統計情報: 深度分布や子要素数の集計により、語彙の特性を定量的に把握

まとめ

Odeuropa Explorer の3つの語彙(Smell sources、Fragrant Spaces、Gestures and Allegories)の構造調査を通じて、以下のことがわかりました:

  1. ドメインに応じた設計:

    • 匂いの発生源(685概念、深度4): 体系的な分類と深い階層
    • 香りのある場所(138概念、深度2): 適度な階層と多様性
    • 身振りと寓意(36概念、深度1): フラットな構造と独立性
  2. 文化的・歴史的豊かさ: ヨーロッパの嗅覚文化遺産の多様性が、合計859概念に凝縮されています

  3. 多言語性: ドイツ語、英語、フランス語、ラテン語が混在し、ヨーロッパ横断プロジェクトの特性を体現

  4. 階層構造の柔軟性: 自然分類から場所、行為まで、それぞれのドメインに最適な階層の深さを採用

  5. 実用性と学術性の両立: 検索・探索に適したフラットな構造と、知識の体系化に必要な階層のバランス

このような語彙の階層構造を理解することで、デジタルヒューマニティーズにおける知識組織化の実践例を学ぶことができます。SKOS は学術研究だけでなく、文化遺産のデジタル化プロジェクトにおいても有効なツールであることが、3つの異なる性質を持つ語彙の分析から示されました。

参考リンク

調査データとコード

本調査で使用・生成したファイル:

分析対象

生成ファイル

  • visualize-hierarchy.js - SKOS 階層可視化スクリプト
  • olfactory-objects-hierarchy.txt - Smell sources の完全な階層出力(685概念)
  • hierarchy-fragrant-spaces-20251010-231358.txt - Fragrant Spaces の完全な階層出力(138概念)
  • olfactory-gestures-hierarchy.txt - Gestures and Allegories の完全な階層出力(36概念)

Discussion