Онтология ресторанов города - Бугаев, Котельников

Онтология «Рестораны города». Бугаев, Котельников, Р3420.
Файл онтологии: http://vk.cc/50YD82
Презентация: http://vk.cc/50YDjR

ИДЕЯ

Изначально задачей стояло создание экспертной системы (далее ЭС) по теме «Город», в нашем случае – рестораны и кафе Санкт-Петербурга. Мы решили собрать большую базу данных, с информацией о различных заведениях, преобразовать ее в онтологию, на основе которой и должна была базироваться ЭС.

ИСТОЧНИК ДАННЫХ

В качестве источника знаний выступил портал Restroclub (http://www.restoclub.ru/). Технически сайт реализован на высоком уровне, что и помогло легко его спарсить в формат таблицы Excel. Уже здесь и выяснились два факта:
1. Большая часть записей (8645 из 11801) неожиданно относится к Москве и зачастую не имеет даже базовой информации о заведении.
2. Большая часть записей уже о питерских заведениях (2768 из 3156) имеют только базовую информацию.
Оставшиеся 388 записей кроме базовой информации (название/адрес/телефон/etc.) имели длинные коллекции дополнительных фактов, на сайте реализованных в качестве хэштегов, например: «Кальян, спортивные трансляции, танцпол, живая музыка, wi-fi, шоу-программа, ресторан у воды, красивый вид, доставка, кабинеты, подходит для свадьбы, подходит для дня рождения, подходит для банкета, подходит для корпоратива, новогодняя ночь, день святого валентина, день защитника отечества, 8 марта». Для нас эти факты представляют особый интерес, именно вокруг них мы и будем возводить структуру нашей будущей онтологии.

ОБРАБОТКА ДАННЫХ

Если взглянуть на собранные данные, можно понять, что каждый «столбец» информации относится к одному из двух типов:
1. Уникальные данные. Например: адрес конкретного заведения, его рейтинг, средний чек, etc. Набор этих данных общий для обрабатываемых 388 записей, но сами данные уникальны, и не подлежат какому-либо дополнительному структурированию.
2. Отношение конкретного заведения к какой-либо группе заведений. Например: кухня. Если эта ячейка кроме прочего содержит слово «русская» – значит заведение относится к группе заведений, в которых подаются блюда русской кухни. Сюда же относятся столбцы тип заведения (кафе/бар/ресторан/…) и особенности с развлечениями (из второго пункта прошлого списка). Продолжим работу с текстом, и превратим эти столбцы в наборы столбцов, которые будут понятны машине для дальнейшей генерации отнологии.

СТУКТУРА ОНТОЛОГИИ

Далее предстоит реализовать в Protégé структуру нашей онтологии. Бывшие хэштеги обращаются классами согласно своей логике. Сами заведения станут инстансами специального класса FoodPlace. Уникальные данные для них мы будем прописывать в датапропертис. В итоге пример одной записи в онтологии выглядит вот так.

НАПОЛНЕНИЕ ОНТОЛОГИИ

Изначально, наполнение онтологии планировалось автоматизировать посредствам SPARQL 1.1. К сожалению, функционал Protégé не позволил использовать это расширение, поэтому онтология была вручную наполнена десятком записей. Это сделало бессмысленной дальнейшую реализацию ЭС, но даже проделанной работы достаточно для демонстрации правильности созданной структуры. Примеры команд из презентации текстом:

«Покажи название, русскую кухню, адрес и средний чек всех заведений с русской кухней и средним чеком выше 1500»

```
PREFIX cafe: <http://www.semanticweb.org/komodo/ontologies/2016/2/untitled-ontology-10#>
SELECT ?subject ?Cuisine ?adress ?averageBill
    WHERE{?subject cafe:hasCuisine ?Cuisine.
    ?subject cafe:averageBill ?averageBill.
    ?subject cafe:adress ?adress
FILTER(?Cuisine=cafe:Russian && ?averageBill>1500)
}

```

«Покажи название и адрес всех заведений с русской кухней и средним чеком выше 1500»

```
PREFIX cafe: <http://www.semanticweb.org/komodo/ontologies/2016/2/untitled-ontology-10#>
SELECT ?subject ?adress
    WHERE{?subject cafe:hasCuisine ?Cuisine.
    ?subject cafe:averageBill ?averageBill.
    ?subject cafe:adress ?adress
FILTER(?Cuisine=cafe:Russian && ?averageBill>1500)
}

```

«Покажи название, адрес и средний чек всех заведений, где есть бизнес-ланч»

```
PREFIX cafe: <http://www.semanticweb.org/komodo/ontologies/2016/2/untitled-ontology-10#>
SELECT ?subject ?adress ?averageBill
    WHERE{?subject cafe:hasSpecialMenu ?SpecialMenu.
    ?subject cafe:averageBill ?averageBill.
    ?subject cafe:adress ?adress
FILTER(?SpecialMenu=cafe:BusinessLunch)
}

```

«Покажи название, адрес, тип заведения и телефон всех заведений, где есть можно организовать банкет»

```
PREFIX cafe: <http://www.semanticweb.org/komodo/ontologies/2016/2/untitled-ontology-10#>
SELECT ?subject ?adress ?FoodPlaceType ?event
    WHERE{?subject cafe:suitableForEvent ?Event.
    ?subject cafe:hasFoodPlaceType ?FoodPlaceType.
    ?subject cafe:adress ?adress
FILTER(?Event=cafe:Banquet)

```