Где я могу найти большой иерархический набор данных с вкладками для тестирования синтаксического анализа?

#parsing

#синтаксический анализ

Вопрос:

Во-первых, извинения, поскольку я понимаю, что это только косвенно связано с программированием синтаксического анализатора.

Я потратил часы на поиск текстового файла, содержащего что-то вроде следующего, но с сотнями (надеюсь, тысячами) вложенных записей. Полный файл биологической классификации был бы идеальным. Массовая версия следующего была бы отличной, поскольку мой анализатор анализирует простые файлы с вкладками:

TL, DR — Мне нужен массивный однофайловый иерархический набор данных примерно следующего вида:

 Kindoms
    Monera
    Protista
    Fungi
    Plants
    Animals
        Porifera
            Sponges
        Coelenterates
            Hydra
            Coral
            Jellyfish
        Platyhelminthes
            Flatworms
            Flukes
        Nematodes
            Roundworms
            Tapeworms
        Chordates
            Urochordataes
            Cephalochordates
            Vertebrates
                Fish
                Amphibians
                Reptiles
                Birds
                Mammals
  

Лучшее, что я смог найти, — это изображения дерева жизни (из которых я расшифровал образец набора данных выше). Один файл с ТОННОЙ реальных данных был бы потрясающим. Это не обязательно должен быть набор данных биологической классификации, но мне бы очень хотелось, чтобы данные отражали что-то в реальном мире. (Мой анализатор выдает меню — было бы здорово, если бы оставшаяся часть моего тестирования была с набором данных, который действительно что-то значил!) Даже если в файле нет вкладок, но данные были довольно легко переведены в формат с вкладками … это было бы здорово.

Есть идеи? Спасибо!

Ответ №1:

Возможно, что макет xml был изменен с момента последнего ответа, но приведенный выше код больше не является точным. Результирующий дамп является посторонним. У некоторых узлов есть псевдонимы (обозначаемые как ‘othername’), которые сообщаются как отдельные узлы.

Я использовал приведенный ниже скрипт для создания правильного дампа.

 <?php
$reader = new XMLReader();
$reader->open('http://tolweb.org/onlinecontributors/app?service=externalamp;page=xml/TreeStructureServiceamp;node_id=1'); //15963 is the primates index
$set=-1;
while ($reader->read()) {
    switch ($reader->nodeType) {
        case (XMLREADER::ELEMENT):
        if ($reader->name == "OTHERNAMES"){
            $set=1;
        }
        if ($reader->name == "NODES"){
            $set=-1;
        }
        if ($reader->name == "NODE"){
            $set=-1;
        }
        if ($reader->name == "NAME" AND $set == -1){
            echo str_repeat("t", $reader->depth - 2);  //repeat tabs for depth
            $node = $reader->expand();
            echo $node->textContent . "n";
        }
            break;
    }
}
?>
  

Ответ №2:

Это оказалось такой занозой в заднице. Я, наконец, отследил поток данных из «Веб-проекта Tree of Life» по адресу tolweb.org . Я создал приведенный ниже php-скрипт, чтобы обеспечить базовую функциональность, которую искал мой пост.

Измените node_id, чтобы он печатал представление с вкладками любого из tolweb.org данные пользователя — просто возьмите идентификатор со страницы, которую вы просматриваете на их сайте, и измените node_id ниже.

Однако имейте в виду — их каналы данных обслуживают большие файлы, поэтому обязательно загрузите файл на свой собственный сервер (и измените метод «открыть» ниже, чтобы указать на локальный файл), если вы собираетесь использовать его более одного или двух раз.

Подробнее о tolweb.org каналы передачи данных можно найти здесь: http://tolweb.org/tree/home.pages/downloadtree.html

 <?php
$reader = new XMLReader();
$reader->open('http://tolweb.org/onlinecontributors/app?service=externalamp;page=xml/TreeStructureServiceamp;node_id=15963'); //15963 is the primates index
while ($reader->read()) {
    switch ($reader->nodeType) {
        case (XMLREADER::ELEMENT):
            if ($reader->name == "NAME"){
                echo str_repeat("t", $reader->depth - 2);  //repeat tabs for depth
                $node = $reader->expand();
                echo $node->textContent . "n";
            }
            break;
    }
}
?>